Skip to content

Commit 25762ee

Browse files
authored
Merge branch 'dev' into standardize_file_structure
2 parents e7aea71 + 0f7fc3f commit 25762ee

File tree

4 files changed

+209
-14
lines changed

4 files changed

+209
-14
lines changed
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import json
2+
3+
import pytest
4+
5+
from tests.integration.helpers import (
6+
delete_target_id,
7+
exec_test_command,
8+
get_random_text,
9+
)
10+
11+
BASE_CMD = ["linode-cli", "firewalls"]
12+
13+
14+
@pytest.fixture(scope="function")
15+
def _firewall_id_and_label():
16+
# generate a unique label
17+
label = "fw-" + get_random_text(5)
18+
# create it and capture the ID
19+
result = exec_test_command(
20+
BASE_CMD
21+
+ [
22+
"create",
23+
"--label",
24+
label,
25+
"--rules.outbound_policy",
26+
"ACCEPT",
27+
"--rules.inbound_policy",
28+
"DROP",
29+
"--text",
30+
"--no-headers",
31+
"--format",
32+
"id",
33+
]
34+
)
35+
fw_id = result.stdout.decode().strip()
36+
yield fw_id, label
37+
# cleanup
38+
delete_target_id(target="firewalls", id=fw_id)
39+
40+
41+
@pytest.fixture(scope="function")
42+
def test_firewall_id(_firewall_id_and_label):
43+
"""Only the ID, so old tests keep working."""
44+
return _firewall_id_and_label[0]
45+
46+
47+
@pytest.fixture(scope="function")
48+
def test_firewall_label(_firewall_id_and_label):
49+
"""Only the label, for tests that need it explicitly."""
50+
return _firewall_id_and_label[1]
51+
52+
53+
@pytest.fixture
54+
def restore_firewall_defaults():
55+
# Fetch and store current default firewall settings
56+
result = exec_test_command(BASE_CMD + ["firewall-settings-list", "--json"])
57+
settings = json.loads(result.stdout.decode())
58+
original_defaults = settings[0]["default_firewall_ids"]
59+
60+
yield original_defaults
61+
62+
# Restore the original defaults after test
63+
args = []
64+
for key, val in original_defaults.items():
65+
if val is not None:
66+
args.extend([f"--default_firewall_ids.{key}", str(val)])
67+
68+
if args:
69+
exec_test_command(BASE_CMD + ["firewall-settings-update"] + args)
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
import json
2+
3+
import pytest
4+
5+
from tests.integration.helpers import (
6+
exec_test_command,
7+
)
8+
9+
BASE_CMD = ["linode-cli", "firewalls"]
10+
11+
12+
def test_firewall_settings_defaults(test_firewall_id, test_firewall_label):
13+
# list all firewalls and extract the IDs
14+
list_result = (
15+
exec_test_command(
16+
BASE_CMD + ["list", "--no-headers", "--text", "--delimiter", ","]
17+
)
18+
.stdout.decode()
19+
.strip()
20+
)
21+
22+
firewall_lines = list_result.splitlines()
23+
firewall_ids = [
24+
line.split(",")[0].strip() for line in firewall_lines if line
25+
]
26+
27+
assert (
28+
test_firewall_id in firewall_ids
29+
), f"{test_firewall_id} not found in firewall list"
30+
31+
# get the default firewall settings
32+
settings_result = exec_test_command(
33+
BASE_CMD + ["firewall-settings-list", "--json"]
34+
).stdout.decode()
35+
36+
settings = json.loads(settings_result)
37+
assert (
38+
isinstance(settings, list) and len(settings) > 0
39+
), "Unexpected settings format"
40+
41+
default_ids = settings[0]["default_firewall_ids"]
42+
43+
# Validate all expected keys exist and map to a valid firewall ID
44+
expected_keys = [
45+
"linode",
46+
"nodebalancer",
47+
"public_interface",
48+
"vpc_interface",
49+
]
50+
51+
for key in expected_keys:
52+
assert key in default_ids, f"Missing default_firewall_ids key: {key}"
53+
val = default_ids[key]
54+
assert val is None or isinstance(
55+
val, int
56+
), f"{key} value is not None or int: {val}"
57+
if isinstance(val, int):
58+
assert val > 0, f"{key} should be a non-zero firewall ID"
59+
assert (
60+
str(val) in firewall_ids
61+
), f"{key} ID ({val}) not found in firewall list"
62+
63+
64+
def test_update_firewall_defaults(test_firewall_id, restore_firewall_defaults):
65+
# Fetch current default firewall settings
66+
settings = json.loads(
67+
exec_test_command(
68+
BASE_CMD + ["firewall-settings-list", "--json"]
69+
).stdout.decode()
70+
)
71+
default_ids_before = settings[0]["default_firewall_ids"]
72+
73+
# Skip if no default firewall configured at all
74+
if all(v is None for v in default_ids_before.values()):
75+
pytest.skip("Skipping: no default firewall configured for the account.")
76+
77+
old_default_id = (
78+
str(default_ids_before["linode"])
79+
if default_ids_before["linode"]
80+
else None
81+
)
82+
83+
# List all firewalls
84+
firewall_list = (
85+
exec_test_command(
86+
BASE_CMD + ["list", "--no-headers", "--text", "--delimiter", ","]
87+
)
88+
.stdout.decode()
89+
.strip()
90+
)
91+
92+
firewall_ids = [
93+
line.split(",")[0].strip()
94+
for line in firewall_list.splitlines()
95+
if line
96+
]
97+
98+
assert (
99+
test_firewall_id in firewall_ids
100+
), f"{test_firewall_id} not found in firewall list"
101+
102+
new_id = next(
103+
fid
104+
for fid in firewall_ids
105+
if old_default_id is None or fid != old_default_id
106+
)
107+
108+
# Update all default firewall IDs to the new one
109+
exec_test_command(
110+
BASE_CMD
111+
+ [
112+
"firewall-settings-update",
113+
"--default_firewall_ids.linode",
114+
new_id,
115+
"--default_firewall_ids.nodebalancer",
116+
new_id,
117+
"--default_firewall_ids.public_interface",
118+
new_id,
119+
"--default_firewall_ids.vpc_interface",
120+
new_id,
121+
"--json",
122+
]
123+
)
124+
125+
# Verify update
126+
updated_settings = json.loads(
127+
exec_test_command(
128+
BASE_CMD + ["firewall-settings-list", "--json"]
129+
).stdout.decode()
130+
)[0]["default_firewall_ids"]
131+
132+
for key, val in updated_settings.items():
133+
assert (
134+
str(val) == new_id
135+
), f"{key} was not updated (expected {new_id}, got {val})"

tests/integration/firewalls/test_firewalls.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,8 @@
1414
delete_target_id,
1515
exec_failing_test_command,
1616
exec_test_command,
17-
get_random_text,
1817
)
1918

20-
2119
@pytest.mark.smoke
2220
def test_view_firewall(firewall_id):
2321
firewall_id = firewall_id
@@ -35,7 +33,7 @@ def test_view_firewall(firewall_id):
3533
)
3634

3735
assert re.search(firewall_id + "," + FIREWALL_LABEL + ",enabled", result)
38-
36+
3937

4038
def test_list_firewall(firewall_id):
4139
firewall_id = firewall_id

tests/integration/firewalls/test_firewalls_rules.py

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,6 @@
44
from tests.integration.firewalls.fixtures import ( # noqa: F401
55
firewall_id,
66
)
7-
from tests.integration.helpers import (
8-
BASE_CMDS,
9-
delete_target_id,
10-
exec_test_command,
11-
get_random_text,
12-
)
13-
147

158
def test_add_rule_to_existing_firewall(firewall_id):
169
firewall_id = firewall_id
@@ -81,9 +74,9 @@ def test_swap_rules():
8174
]
8275
)
8376

84-
swapped_rules = "[" + inbound_rule_2 + "," + inbound_rule_1 + "]"
77+
swapped_rules_obj = list(reversed(inbound_rules_obj))
78+
swapped_rules = json.dumps(swapped_rules_obj)
8579

86-
# swapping rules
8780
result = json.loads(
8881
exec_test_command(
8982
BASE_CMDS["firewalls"]
@@ -97,8 +90,8 @@ def test_swap_rules():
9790
)
9891
)
9992

100-
assert result[0]["inbound"][0] == json.loads(inbound_rule_2)
101-
assert result[0]["inbound"][1] == json.loads(inbound_rule_1)
93+
assert result[0]["inbound"][0] == swapped_rules_obj[0]
94+
assert result[0]["inbound"][1] == swapped_rules_obj[1]
10295

10396
delete_target_id(target="firewalls", id=firewall_id)
10497

0 commit comments

Comments
 (0)