Skip to content
Draft
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
3 changes: 2 additions & 1 deletion tests/integration/linodes/helpers.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import json
import os
import time

from tests.integration.helpers import (
Expand All @@ -7,7 +8,7 @@
)

DEFAULT_RANDOM_PASS = exec_test_command(["openssl", "rand", "-base64", "32"])
DEFAULT_REGION = "us-ord"
DEFAULT_REGION = "pl-labkrk-2" if "devcloud" in os.getenv('LINODE_CLI_API_HOST') else "us-ord"

DEFAULT_TEST_IMAGE = exec_test_command(
[
Expand Down
69 changes: 69 additions & 0 deletions tests/integration/networking/fixtures.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import pytest

from tests.integration.helpers import (
BASE_CMDS,
delete_target_id,
exec_test_command,
)
from tests.integration.linodes.helpers import (
create_linode,
create_linode_and_wait,
DEFAULT_REGION
)


@pytest.fixture
def create_reserved_ip(request):
tags = getattr(request, "param", None)
command = BASE_CMDS["networking"] + [
"reserved-ip-add",
"--region",
DEFAULT_REGION,
"--text",
"--delimiter",
","
]

if tags:
command += ["--tags", tags]

headers, values = get_command_heads_and_vals(command)
yield headers, values

delete_target_id("networking", values[0], "reserved-ip-delete")


@pytest.fixture(scope="package")
def test_linode_id(linode_cloud_firewall):
linode_id = create_linode_and_wait(firewall_id=linode_cloud_firewall)

yield linode_id

delete_target_id(target="linodes", id=linode_id)


@pytest.fixture(scope="package")
def test_linode_id_shared_ipv4(linode_cloud_firewall):
target_region = "us-mia"

linode_ids = (
create_linode(
test_region=target_region, firewall_id=linode_cloud_firewall
),
create_linode(
test_region=target_region, firewall_id=linode_cloud_firewall
),
)

yield linode_ids

for id_num in linode_ids:
delete_target_id(target="linodes", id=id_num)


def get_command_heads_and_vals(command):
result = exec_test_command(command).splitlines()
headers = [item for item in result[0].split(",")]
values = [item for item in result[1].split(",")]

return headers, values
170 changes: 140 additions & 30 deletions tests/integration/networking/test_networking.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import ipaddress
import json
import re

Expand All @@ -6,41 +7,21 @@

from tests.integration.helpers import (
BASE_CMDS,
delete_target_id,
assert_headers_in_lines,
exec_test_command,
)
from tests.integration.linodes.helpers import (
create_linode,
create_linode_and_wait,
from tests.integration.linodes.helpers import DEFAULT_REGION
from tests.integration.networking.fixtures import (
create_reserved_ip,
get_command_heads_and_vals,
test_linode_id,
test_linode_id_shared_ipv4
)


@pytest.fixture(scope="package")
def test_linode_id(linode_cloud_firewall):
linode_id = create_linode_and_wait(firewall_id=linode_cloud_firewall)

yield linode_id

delete_target_id(target="linodes", id=linode_id)


@pytest.fixture(scope="package")
def test_linode_id_shared_ipv4(linode_cloud_firewall):
target_region = "us-mia"

linode_ids = (
create_linode(
test_region=target_region, firewall_id=linode_cloud_firewall
),
create_linode(
test_region=target_region, firewall_id=linode_cloud_firewall
),
)

yield linode_ids

for id in linode_ids:
delete_target_id(target="linodes", id=id)
RESERVED_IP_HEADERS = [
"address", "type", "public", "rdns", "linode_id", "reserved", "tags"
]


def has_shared_ip(linode_id: int, ip: str) -> bool:
Expand All @@ -61,6 +42,19 @@ def has_shared_ip(linode_id: int, ip: str) -> bool:
return False


def verify_reserved_ip(reserved_ip):
assert isinstance(
ipaddress.ip_address(reserved_ip[0]), ipaddress.IPv4Address
)
assert reserved_ip[1] == "ipv4"
assert reserved_ip[2] == "True"
assert reserved_ip[4] == DEFAULT_REGION
assert not reserved_ip[5]
assert reserved_ip[7] == "True"
# TODO: To be clarified if it should be returned in CLI
# assert reserved_ip["assigned_entity"] is None


def test_display_ips_for_available_linodes(test_linode_id):
result = exec_test_command(
BASE_CMDS["networking"]
Expand Down Expand Up @@ -144,6 +138,122 @@ def test_allocate_additional_private_ipv4_address(test_linode_id):
"ipv4,False,.*,[0-9][0-9][0-9][0-9][0-9][0-9][0-9]*", result
)

@pytest.mark.smoke
@pytest.mark.parametrize(
"create_reserved_ip", ["test", None], indirect=True
)
def test_create_reserved_ip(create_reserved_ip):
headers, reserved_ip = create_reserved_ip
assert_headers_in_lines(RESERVED_IP_HEADERS, [headers])
verify_reserved_ip(reserved_ip)

tags = reserved_ip[-1]
assert tags == "test" if tags else tags == ''


@pytest.mark.parametrize(
"create_reserved_ip", ["test"], indirect=True
)
def test_update_reserved_ip_tags(create_reserved_ip):
_, reserved_ip = create_reserved_ip
assert reserved_ip[-1] == "test"

result = exec_test_command(
BASE_CMDS["networking"] + [
"reserved-ip-update",
"--tags",
"updated",
"--tags",
"updated2",
reserved_ip[0],
"--text",
"--no-headers",
"--delimiter",
","
]
).split(",")
verify_reserved_ip(result)
assert result[-1] == "updated updated2"


def test_create_reserved_ip_assigned(create_reserved_ip, test_linode_id):
_, reserved_ip = create_reserved_ip
linode_id = test_linode_id

exec_test_command(
BASE_CMDS["networking"] + [
"ip-assign",
"--assignments.linode_id",
linode_id,
"--assignments.address",
reserved_ip[0],
"--region",
DEFAULT_REGION,
]
)

command = BASE_CMDS["linodes"] + [
"ip-view",
linode_id,
reserved_ip[0],
"--text",
"--delimiter",
","
]
headers, values = get_command_heads_and_vals(command)

assert_headers_in_lines(RESERVED_IP_HEADERS[:-1], [headers])
# TODO: To be clarified if tags should be returned in CLI (currently it is)
# assert "tags" not in headers
assert values[0] == reserved_ip[0]
assert str(values[5]) == linode_id
assert values[7] == "True"


def test_get_reserved_ip_types():
headers_exp = ["id", "label", "price.hourly", "price.monthly"]
command = BASE_CMDS["networking"] + [
"reserved-ip-types-list",
"--text",
"--delimiter",
","
]
headers, values = get_command_heads_and_vals(command)

assert_headers_in_lines(headers_exp, [headers])
assert values[0] == "reserved-ipv4"
assert values[1] == "Reserved IPv4"
assert any(price != 0 for price in values[2:4])


def test_get_reserved_ip_view(create_reserved_ip):
_, reserved_ip = create_reserved_ip
command = BASE_CMDS["networking"] + [
"reserved-ip-view",
reserved_ip[0],
"--text",
"--delimiter",
","
]
headers, values = get_command_heads_and_vals(command)

assert_headers_in_lines(RESERVED_IP_HEADERS, [headers])
verify_reserved_ip(values)


def test_get_reserved_ips_list(create_reserved_ip):
result = exec_test_command(
BASE_CMDS["networking"] + [
"reserved-ips-list",
"--text",
"--no-headers",
"--format",
"reserved"
]
).splitlines()

assert all(item == "True" for item in result)


def test_share_ipv4_address(
test_linode_id_shared_ipv4, monkeypatch: MonkeyPatch
Expand Down
33 changes: 33 additions & 0 deletions tests/integration/tags/test_tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
exec_test_command,
get_random_text,
)
from tests.integration.networking.fixtures import create_reserved_ip


@pytest.fixture(scope="session")
Expand Down Expand Up @@ -42,3 +43,35 @@ def test_fail_to_create_tag_shorter_than_three_char():
)
assert "Request failed: 400" in result
assert "Length must be 3-50 characters" in result


def test_create_tag_for_reserved_ip(create_reserved_ip):
_, reserved_ip = create_reserved_ip
tag_name = get_random_text(5) + "-tag"

exec_test_command(
BASE_CMDS["tags"]
+ [
"create",
"--label",
tag_name,
"--reserved_ipv4_addresses",
reserved_ip[0]
]
)

result = exec_test_command(
BASE_CMDS["networking"] + [
"reserved-ip-view",
reserved_ip[0],
"--text",
"--no-headers",
"--format",
"tags"
]
)

assert result == tag_name

# TODO: GET tags/{label} and DELETE tags/{label} missed or not implemented at all
# delete_target_id("tags", tag_name)
Loading