Skip to content

Commit 38c0fb9

Browse files
Integration tests for private image sharing (#632)
* Create integration tests for share groups - part 1 * Create test test_try_to_add_member_invalid_token * Update integration tests for private image sharing feature * Apply code review sugestions --------- Co-authored-by: Erik Zilber <ezilber@akamai.com>
1 parent ce04f89 commit 38c0fb9

File tree

1 file changed

+251
-0
lines changed

1 file changed

+251
-0
lines changed
Lines changed: 251 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,251 @@
1+
import datetime
2+
from test.integration.conftest import get_region
3+
from test.integration.helpers import (
4+
get_test_label,
5+
)
6+
7+
import pytest
8+
9+
from linode_api4.objects import (
10+
Image,
11+
ImageShareGroup,
12+
ImageShareGroupImagesToAdd,
13+
ImageShareGroupImageToAdd,
14+
ImageShareGroupImageToUpdate,
15+
ImageShareGroupMemberToAdd,
16+
ImageShareGroupMemberToUpdate,
17+
ImageShareGroupToken,
18+
)
19+
20+
21+
def wait_for_image_status(
22+
test_linode_client, image_id, expected_status, timeout=360, interval=5
23+
):
24+
import time
25+
26+
get_image = test_linode_client.load(Image, image_id)
27+
timer = 0
28+
while get_image.status != expected_status and timer < timeout:
29+
time.sleep(interval)
30+
timer += interval
31+
get_image = test_linode_client.load(Image, image_id)
32+
if timer >= timeout:
33+
raise TimeoutError(
34+
f"Created image did not reach status '{expected_status}' within {timeout} seconds."
35+
)
36+
37+
38+
@pytest.fixture(scope="class")
39+
def sample_linode(test_linode_client, e2e_test_firewall):
40+
client = test_linode_client
41+
region = get_region(client, {"Linodes", "Cloud Firewall"}, site_type="core")
42+
label = get_test_label(length=8)
43+
44+
linode_instance, password = client.linode.instance_create(
45+
"g6-nanode-1",
46+
region,
47+
image="linode/alpine3.19",
48+
label=label + "_modlinode",
49+
)
50+
yield linode_instance
51+
linode_instance.delete()
52+
53+
54+
@pytest.fixture(scope="class")
55+
def create_image_id(test_linode_client, sample_linode):
56+
create_image = test_linode_client.images.create(
57+
sample_linode.disks[0],
58+
label="linode-api4python-test-image-sharing-image",
59+
)
60+
wait_for_image_status(test_linode_client, create_image.id, "available")
61+
yield create_image.id
62+
create_image.delete()
63+
64+
65+
@pytest.fixture(scope="function")
66+
def share_group_id(test_linode_client):
67+
group_label = get_test_label(8) + "_sharegroup_api4_test"
68+
group = test_linode_client.sharegroups.create_sharegroup(
69+
label=group_label,
70+
description="Test api4python",
71+
)
72+
yield group.id
73+
group.delete()
74+
75+
76+
def test_get_share_groups(test_linode_client, share_group_id):
77+
response = test_linode_client.sharegroups()
78+
sharegroups_list = response.lists[0]
79+
assert len(sharegroups_list) > 0
80+
assert sharegroups_list[0].api_endpoint == "/images/sharegroups/{id}"
81+
assert sharegroups_list[0].id > 0
82+
assert sharegroups_list[0].description != ""
83+
assert isinstance(sharegroups_list[0].images_count, int)
84+
assert not sharegroups_list[0].is_suspended
85+
assert sharegroups_list[0].label != ""
86+
assert isinstance(sharegroups_list[0].members_count, int)
87+
assert sharegroups_list[0].uuid != ""
88+
assert isinstance(sharegroups_list[0].created, datetime.date)
89+
assert not sharegroups_list[0].expiry
90+
91+
92+
def test_add_update_remove_share_group(test_linode_client):
93+
group_label = get_test_label(8) + "_sharegroup_api4_test"
94+
share_group = test_linode_client.sharegroups.create_sharegroup(
95+
label=group_label,
96+
description="Test api4python create",
97+
)
98+
assert share_group.api_endpoint == "/images/sharegroups/{id}"
99+
assert share_group.id > 0
100+
assert share_group.description == "Test api4python create"
101+
assert isinstance(share_group.images_count, int)
102+
assert not share_group.is_suspended
103+
assert share_group.label == group_label
104+
assert isinstance(share_group.members_count, int)
105+
assert share_group.uuid != ""
106+
assert isinstance(share_group.created, datetime.date)
107+
assert not share_group.updated
108+
assert not share_group.expiry
109+
110+
load_share_group = test_linode_client.load(ImageShareGroup, share_group.id)
111+
assert load_share_group.id == share_group.id
112+
assert load_share_group.description == "Test api4python create"
113+
114+
load_share_group.label = "Updated Sharegroup Label"
115+
load_share_group.description = "Test update description"
116+
load_share_group.save()
117+
load_share_group_after_update = test_linode_client.load(
118+
ImageShareGroup, share_group.id
119+
)
120+
assert load_share_group_after_update.id == share_group.id
121+
assert load_share_group_after_update.label == "Updated Sharegroup Label"
122+
assert (
123+
load_share_group_after_update.description == "Test update description"
124+
)
125+
126+
share_group.delete()
127+
with pytest.raises(RuntimeError) as err:
128+
test_linode_client.load(ImageShareGroup, share_group.id)
129+
assert "[404] Not found" in str(err.value)
130+
131+
132+
def test_add_get_update_revoke_image_to_share_group(
133+
test_linode_client, create_image_id, share_group_id
134+
):
135+
share_group = test_linode_client.load(ImageShareGroup, share_group_id)
136+
add_image_response = share_group.add_images(
137+
ImageShareGroupImagesToAdd(
138+
images=[
139+
ImageShareGroupImageToAdd(id=create_image_id),
140+
]
141+
)
142+
)
143+
assert 0 < len(add_image_response)
144+
assert (
145+
add_image_response[0].image_sharing.shared_by.sharegroup_id
146+
== share_group.id
147+
)
148+
assert (
149+
add_image_response[0].image_sharing.shared_by.source_image_id
150+
== create_image_id
151+
)
152+
153+
get_response = share_group.get_image_shares()
154+
assert 0 < len(get_response)
155+
assert (
156+
get_response[0].image_sharing.shared_by.sharegroup_id == share_group.id
157+
)
158+
assert (
159+
get_response[0].image_sharing.shared_by.source_image_id
160+
== create_image_id
161+
)
162+
assert get_response[0].description == ""
163+
164+
update_response = share_group.update_image_share(
165+
ImageShareGroupImageToUpdate(
166+
image_share_id=get_response[0].id, description="Description update"
167+
)
168+
)
169+
assert update_response.description == "Description update"
170+
171+
share_groups_by_image_id_response = (
172+
test_linode_client.sharegroups.sharegroups_by_image_id(create_image_id)
173+
)
174+
assert 0 < len(share_groups_by_image_id_response.lists)
175+
assert share_groups_by_image_id_response.lists[0][0].id == share_group.id
176+
177+
share_group.revoke_image_share(get_response[0].id)
178+
get_after_revoke_response = share_group.get_image_shares()
179+
assert len(get_after_revoke_response) == 0
180+
181+
182+
def test_list_tokens(test_linode_client):
183+
response = test_linode_client.sharegroups.tokens()
184+
assert response.page_endpoint == "images/sharegroups/tokens"
185+
assert len(response.lists[0]) >= 0
186+
187+
188+
def test_create_token_to_own_share_group_error(test_linode_client):
189+
group_label = get_test_label(8) + "_sharegroup_api4_test"
190+
response_create_share_group = (
191+
test_linode_client.sharegroups.create_sharegroup(
192+
label=group_label,
193+
description="Test api4python create",
194+
)
195+
)
196+
with pytest.raises(RuntimeError) as err:
197+
test_linode_client.sharegroups.create_token(
198+
response_create_share_group.uuid
199+
)
200+
assert "[400] valid_for_sharegroup_uuid" in str(err.value)
201+
assert "You may not create a token for your own sharegroup" in str(
202+
err.value
203+
)
204+
205+
response_create_share_group.delete()
206+
207+
208+
def test_get_invalid_token(test_linode_client):
209+
with pytest.raises(RuntimeError) as err:
210+
test_linode_client.load(ImageShareGroupToken, "36b0-4d52_invalid")
211+
assert "[404] Not found" in str(err.value)
212+
213+
214+
def test_try_to_add_member_invalid_token(test_linode_client, share_group_id):
215+
share_group = test_linode_client.load(ImageShareGroup, share_group_id)
216+
with pytest.raises(RuntimeError) as err:
217+
share_group.add_member(
218+
ImageShareGroupMemberToAdd(
219+
token="not_existing_token",
220+
label="New Member",
221+
)
222+
)
223+
assert "[500] Invalid token format" in str(err.value)
224+
225+
226+
def test_list_share_group_members(test_linode_client, share_group_id):
227+
share_group = test_linode_client.load(ImageShareGroup, share_group_id)
228+
response = share_group.get_members()
229+
assert 0 == len(response)
230+
231+
232+
def test_try_to_get_update_revoke_share_group_member_by_invalid_token(
233+
test_linode_client, share_group_id
234+
):
235+
share_group = test_linode_client.load(ImageShareGroup, share_group_id)
236+
with pytest.raises(RuntimeError) as err:
237+
share_group.get_member("not_existing_token")
238+
assert "[404] Not found" in str(err.value)
239+
240+
with pytest.raises(RuntimeError) as err:
241+
share_group.update_member(
242+
ImageShareGroupMemberToUpdate(
243+
token_uuid="not_existing_token",
244+
label="Update Member",
245+
)
246+
)
247+
assert "[404] Not found" in str(err.value)
248+
249+
with pytest.raises(RuntimeError) as err:
250+
share_group.remove_member("not_existing_token")
251+
assert "[404] Not found" in str(err.value)

0 commit comments

Comments
 (0)