Skip to content

Commit 5be0ad9

Browse files
committed
Reinstate server_query check, create group_servers_by_user_id function, update unit tests
1 parent f89d564 commit 5be0ad9

File tree

4 files changed

+100
-94
lines changed

4 files changed

+100
-94
lines changed

lib/apis/openstack_query_api/server_queries.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from typing import List, Optional
44
from openstackquery import ImageQuery
5+
from openstackquery.api.query_api import QueryAPI
56

67

78
def find_servers_with_image(
@@ -49,18 +50,21 @@ def find_servers_with_image(
4950
"addresses",
5051
)
5152

52-
if not server_query.to_props():
53-
raise RuntimeError(
54-
f"No servers found with images {', '.join(image_name_list)} on projects "
55-
f"{','.join(from_projects) if from_projects else '[all projects]'}"
56-
)
57-
5853
server_query.append_from("PROJECT_QUERY", cloud_account, ["name"])
59-
server_query.group_by("user_id")
6054

6155
return server_query
6256

6357

58+
def group_servers_by_user_id(server_query: QueryAPI):
59+
"""
60+
Group the servers in a server query by "user_id" and return the results
61+
:param server_query: QueryAPI object containing the results of a server query
62+
"""
63+
grouped_query = server_query.group_by("user_id")
64+
65+
return grouped_query
66+
67+
6468
def list_to_regex_pattern(string_list):
6569
"""
6670
converts a list of strings into a regex pattern that matches any occurrence of any string in the input list.

lib/workflows/send_decom_image_email.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66
from apis.email_api.structs.email_template_details import EmailTemplateDetails
77
from apis.email_api.structs.smtp_account import SMTPAccount
88
from apis.openstack_api.enums.cloud_domains import CloudDomains
9-
from apis.openstack_query_api.server_queries import find_servers_with_image
9+
from apis.openstack_query_api.server_queries import (
10+
find_servers_with_image,
11+
group_servers_by_user_id,
12+
)
1013
from apis.openstack_query_api.user_queries import find_user_info
1114
from tabulate import tabulate
1215

@@ -175,7 +178,15 @@ def send_decom_image_email(
175178
cloud_account, image_name_list, limit_by_projects
176179
)
177180

178-
for user_id in server_query.to_props().keys():
181+
if not server_query.to_props():
182+
raise RuntimeError(
183+
f"No servers found with images {', '.join(image_name_list)} on projects "
184+
f"{','.join(limit_by_projects) if limit_by_projects else '[all projects]'}"
185+
)
186+
187+
grouped_query = group_servers_by_user_id(server_query)
188+
189+
for user_id in grouped_query.to_props().keys():
179190
# if email_address not found - send to override_email_address
180191
# also send to override_email_address if override_email set
181192
user_name, email_addr = find_user_info(
@@ -191,18 +202,18 @@ def send_decom_image_email(
191202
user_name,
192203
as_html,
193204
get_affected_images_plaintext(decom_image_info),
194-
server_query.to_string(groups=[user_id], include_group_titles=False),
205+
grouped_query.to_string(groups=[user_id], include_group_titles=False),
195206
)
196207

197208
else:
198209
if as_html:
199210
image_list = get_affected_images_html(decom_image_info)
200-
server_list = server_query.to_html(
211+
server_list = grouped_query.to_html(
201212
groups=[user_id], include_group_titles=False
202213
)
203214
else:
204215
image_list = get_affected_images_plaintext(decom_image_info)
205-
server_list = server_query.to_string(
216+
server_list = grouped_query.to_string(
206217
groups=[user_id], include_group_titles=False
207218
)
208219

tests/lib/apis/openstack_query_api/test_server_queries.py

Lines changed: 13 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import pytest
44
from apis.openstack_query_api.server_queries import (
55
find_servers_with_image,
6+
group_servers_by_user_id,
67
list_to_regex_pattern,
78
)
89

@@ -17,6 +18,18 @@ def test_list_to_regex_pattern():
1718
assert res == "(.*img1|.*img2|.*img3)"
1819

1920

21+
@patch("apis.openstack_query_api.server_queries.QueryAPI")
22+
def test_group_by_user_id(mock_server_query):
23+
"""
24+
Tests group_servers_by_user_id() function
25+
"""
26+
mock_server_query_obj = mock_server_query.return_value
27+
mock_grouped_query_obj = mock_server_query_obj.group_by.return_value
28+
res = group_servers_by_user_id(mock_server_query_obj)
29+
mock_server_query_obj.group_by.assert_called_once_with("user_id")
30+
assert res == mock_grouped_query_obj
31+
32+
2033
@patch("apis.openstack_query_api.server_queries.ImageQuery")
2134
@patch("apis.openstack_query_api.server_queries.list_to_regex_pattern")
2235
def test_find_servers_with_image_valid(mock_list_to_regex, mock_image_query):
@@ -59,12 +72,9 @@ def test_find_servers_with_image_valid(mock_list_to_regex, mock_image_query):
5972
all_projects=False,
6073
)
6174
mock_server_query_obj.select.assert_called_once_with("id", "name", "addresses")
62-
mock_server_query_obj.to_props.assert_called_once()
63-
6475
mock_server_query_obj.append_from.assert_called_once_with(
6576
"PROJECT_QUERY", "test-cloud-account", ["name"]
6677
)
67-
mock_server_query_obj.group_by.assert_called_once_with("user_id")
6878
assert res == mock_server_query_obj
6979

7080

@@ -98,48 +108,3 @@ def test_find_servers_with_image_invalid_images(mock_list_to_regex, mock_image_q
98108
("id", "ascending"), ("name", "ascending")
99109
)
100110
mock_image_query_obj.to_props.assert_called_once()
101-
102-
103-
@patch("apis.openstack_query_api.server_queries.ImageQuery")
104-
@patch("apis.openstack_query_api.server_queries.list_to_regex_pattern")
105-
def test_find_servers_with_image_no_servers_found(mock_list_to_regex, mock_image_query):
106-
"""
107-
Tests that find_servers_with_images() raises an error when no servers are found
108-
"""
109-
110-
mock_image_query_obj = mock_image_query.return_value
111-
mock_server_query_obj = mock_image_query_obj.then.return_value
112-
mock_server_query_obj.to_props.return_value = None
113-
114-
with pytest.raises(RuntimeError):
115-
find_servers_with_image(
116-
"test-cloud-account", ["img1", "img2"], ["project1", "project2"]
117-
)
118-
119-
mock_image_query.assert_called_once()
120-
mock_list_to_regex.assert_called_once_with(["img1", "img2"])
121-
mock_image_query_obj.where.assert_called_once_with(
122-
"matches_regex",
123-
"name",
124-
value=mock_list_to_regex.return_value,
125-
)
126-
127-
mock_image_query_obj.run.assert_called_once_with(
128-
"test-cloud-account",
129-
as_admin=True,
130-
from_projects=["project1", "project2"],
131-
all_projects=False,
132-
)
133-
mock_image_query_obj.sort_by.assert_called_once_with(
134-
("id", "ascending"), ("name", "ascending")
135-
)
136-
mock_image_query_obj.to_props.assert_called_once()
137-
138-
mock_server_query_obj.run.assert_called_once_with(
139-
"test-cloud-account",
140-
as_admin=True,
141-
from_projects=["project1", "project2"],
142-
all_projects=False,
143-
)
144-
mock_server_query_obj.select.assert_called_once_with("id", "name", "addresses")
145-
mock_server_query_obj.to_props.assert_called_once()

0 commit comments

Comments
 (0)