Skip to content

Commit 937175a

Browse files
authored
Merge pull request #29 from koef/add-labels-support
Add labels support
2 parents 4d301dd + 02e4bc4 commit 937175a

File tree

25 files changed

+1433
-426
lines changed

25 files changed

+1433
-426
lines changed

.github/workflows/tests.yaml

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -159,14 +159,14 @@ jobs:
159159
sync
160160
161161
integration_tests_lb_instances:
162-
runs-on: ubuntu-20.04
163-
needs: integration_tests_l2
162+
runs-on: ubuntu-24.04
163+
needs: integration_tests_bm
164164
concurrency: API
165165
steps:
166166
- name: Checkout
167-
uses: actions/checkout@v3
167+
uses: actions/checkout@v4
168168
- name: Set up Python
169-
uses: actions/setup-python@v2
169+
uses: actions/setup-python@v5
170170
with:
171171
python-version: "3.13"
172172
- name: Install dependencies
@@ -195,7 +195,9 @@ jobs:
195195
196196
build:
197197
runs-on: ubuntu-24.04
198-
needs: integration_tests_l2
198+
needs:
199+
- integration_tests_l2
200+
- integration_tests_lb_instances
199201
outputs:
200202
version: ${{ steps.version.outputs.version }}
201203
steps:

ansible_collections/serverscom/sc_api/plugins/module_utils/modules.py

Lines changed: 54 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,19 @@ def run(self):
6969

7070

7171
class ScBaremetalServersInfo:
72-
def __init__(self, endpoint, token):
72+
def __init__(self, search_pattern, label_selector, type, endpoint, token):
73+
self.type = type
74+
self.search_pattern = search_pattern
75+
self.label_selector = label_selector
7376
self.api = ScApi(token, endpoint)
7477

7578
def run(self):
76-
return {"changed": False, "baremetal_servers": list(self.api.list_hosts())}
79+
return {
80+
"changed": False,
81+
"baremetal_servers": list(
82+
self.api.list_hosts(self.type, self.search_pattern, self.label_selector)
83+
),
84+
}
7785

7886

7987
class ScBaremetalLocationsInfo(object):
@@ -150,7 +158,16 @@ def run(self):
150158

151159
class ScSshKey(object):
152160
def __init__(
153-
self, endpoint, token, state, name, fingerprint, public_key, replace, checkmode
161+
self,
162+
endpoint,
163+
token,
164+
state,
165+
name,
166+
fingerprint,
167+
public_key,
168+
labels,
169+
replace,
170+
checkmode,
154171
):
155172
self.partial_match = []
156173
self.full_match = []
@@ -162,6 +179,7 @@ def __init__(
162179
self.key_name = name
163180
self.public_key = public_key
164181
self.fingerprint = fingerprint
182+
self.labels = labels
165183
if public_key:
166184
self.fingerprint = self.extract_fingerprint(public_key)
167185
if fingerprint and self.fingerprint != fingerprint:
@@ -205,7 +223,7 @@ def classify_matching_keys(key_list, name, fingerprint):
205223
def add_key(self):
206224
if not self.checkmode:
207225
return self.api.post_ssh_keys(
208-
name=self.key_name, public_key=self.public_key
226+
name=self.key_name, public_key=self.public_key, labels=self.labels
209227
)
210228

211229
def delete_keys(self, key_list):
@@ -252,11 +270,15 @@ def run(self):
252270

253271

254272
class ScSshKeysInfo:
255-
def __init__(self, endpoint, token):
273+
def __init__(self, endpoint, token, label_selector):
256274
self.api = ScApi(token, endpoint)
275+
self.label_selector = label_selector
257276

258277
def run(self):
259-
return {"changed": False, "ssh_keys": list(self.api.list_ssh_keys())}
278+
return {
279+
"changed": False,
280+
"ssh_keys": list(self.api.list_ssh_keys(self.label_selector)),
281+
}
260282

261283

262284
class ScDedicatedServerReinstall(object):
@@ -412,14 +434,17 @@ def run(self):
412434

413435

414436
class ScCloudComputingInstancesInfo:
415-
def __init__(self, endpoint, token, region_id):
437+
def __init__(self, endpoint, token, region_id, label_selector):
416438
self.api = ScApi(token, endpoint)
417439
self.region_id = region_id
440+
self.label_selector = label_selector
418441

419442
def run(self):
420443
return {
421444
"changed": False,
422-
"cloud_instances": list(self.api.list_instances(self.region_id)),
445+
"cloud_instances": list(
446+
self.api.list_instances(self.region_id, self.label_selector)
447+
),
423448
}
424449

425450

@@ -465,6 +490,7 @@ def __init__(
465490
ssh_key_name,
466491
backup_copies,
467492
user_data,
493+
labels,
468494
wait,
469495
update_interval,
470496
checkmode,
@@ -490,6 +516,7 @@ def __init__(
490516
)
491517
self.backup_copies = backup_copies
492518
self.user_data = user_data
519+
self.labels = labels
493520
self.wait = wait
494521
self.update_interval = update_interval
495522
self.checkmode = checkmode
@@ -527,6 +554,7 @@ def create_instance(self):
527554
ssh_key_fingerprint=self.ssh_key_fingerprint,
528555
backup_copies=self.backup_copies,
529556
user_data=self.user_data,
557+
labels=self.labels,
530558
)
531559
return instance
532560

@@ -981,11 +1009,15 @@ def run(self):
9811009

9821010

9831011
class ScL2SegmentsInfo:
984-
def __init__(self, endpoint, token):
1012+
def __init__(self, endpoint, token, label_selector):
9851013
self.api = ScApi(token, endpoint)
1014+
self.label_selector = label_selector
9861015

9871016
def run(self):
988-
return {"changed": False, "l2_segments": list(self.api.list_l2_segments())}
1017+
return {
1018+
"changed": False,
1019+
"l2_segments": list(self.api.list_l2_segments(self.label_selector)),
1020+
}
9891021

9901022

9911023
class ScL2SegmentInfo:
@@ -1027,6 +1059,7 @@ def __init__(
10271059
members_present,
10281060
members_absent,
10291061
location_group_id,
1062+
labels,
10301063
wait,
10311064
update_interval,
10321065
checkmode,
@@ -1040,6 +1073,7 @@ def __init__(
10401073
self.members_present = members_present
10411074
self.members_absent = members_absent
10421075
self.location_group_id = location_group_id
1076+
self.labels = labels
10431077
self.wait = wait
10441078
self.update_interval = update_interval
10451079
self.checkmode = checkmode
@@ -1134,7 +1168,7 @@ def create(self):
11341168
raise ModuleError("Creation of L2 segment required type")
11351169
if self.checkmode:
11361170
return {"changed": True, "location_group_id": lg}
1137-
res = self.api.post_l2_segment(self.name, self.type, lg, members)
1171+
res = self.api.post_l2_segment(self.name, self.type, lg, members, self.labels)
11381172
self.wait_for_active_segment(res["id"])
11391173
res = self.api.get_l2_segment(res["id"])
11401174
res["members_added"] = members
@@ -1175,9 +1209,9 @@ def update_full(self, segment_id):
11751209
changed = True
11761210
if not self.checkmode:
11771211
if keep_members != existing_members:
1178-
self.api.put_l2_segment_update(segment_id, keep_list)
1212+
self.api.put_l2_segment_update(segment_id, keep_list, self.labels)
11791213
self.wait_for_active_segment(segment_id)
1180-
self.api.put_l2_segment_update(segment_id, self.members)
1214+
self.api.put_l2_segment_update(segment_id, self.members, self.labels)
11811215
self.wait_for_active_segment(segment_id)
11821216
res = self.api.get_l2_segment(segment_id)
11831217
res["members_added"] = list(add_list)
@@ -1234,9 +1268,11 @@ def update_partial(self, segment_id):
12341268
# If member is already with one type and is in members_present with
12351269
# different type we need to remove it first (API requirement)
12361270
if del_list and add_list:
1237-
self.api.put_l2_segment_update(segment_id, reduced_list)
1271+
self.api.put_l2_segment_update(
1272+
segment_id, reduced_list, self.labels
1273+
)
12381274
self.wait_for_active_segment(segment_id)
1239-
self.api.put_l2_segment_update(segment_id, send_list)
1275+
self.api.put_l2_segment_update(segment_id, send_list, self.labels)
12401276
self.wait_for_active_segment(segment_id)
12411277
res = self.api.get_l2_segment(segment_id)
12421278
res["members_added"] = list(add_list)
@@ -1398,13 +1434,14 @@ def run(self):
13981434

13991435

14001436
class ScLoadBalancerInstancesList:
1401-
def __init__(self, endpoint, token, name=None, type=None):
1437+
def __init__(self, endpoint, token, name=None, type=None, label_selector=None):
14021438
self.api = ScApi(token, endpoint)
14031439
self.name = name
14041440
self.type = type
1441+
self.label_selector = label_selector
14051442

14061443
def run(self):
1407-
lb_instances = list(self.api.list_load_balancer_instances())
1444+
lb_instances = list(self.api.list_load_balancer_instances(self.label_selector))
14081445
if self.name:
14091446
lb_instances = [
14101447
inst for inst in lb_instances if inst.get("name") == self.name

ansible_collections/serverscom/sc_api/plugins/module_utils/sc_api.py

Lines changed: 62 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -321,8 +321,18 @@ def get_dedicated_servers(self, server_id):
321321
path=f"/hosts/dedicated_servers/{server_id}"
322322
)
323323

324-
def list_hosts(self):
325-
return self.api_helper.make_multipage_request(path="/hosts")
324+
def list_hosts(self, type=None, search_pattern=None, label_selector=None):
325+
query = {}
326+
if type:
327+
query["type"] = type
328+
if search_pattern:
329+
query["search_pattern"] = search_pattern
330+
if label_selector:
331+
query["label_selector"] = label_selector
332+
333+
return self.api_helper.make_multipage_request(
334+
path="/hosts", query_parameters=query
335+
)
326336

327337
def post_dedicated_server_reinstall(
328338
self,
@@ -348,14 +358,26 @@ def post_dedicated_server_reinstall(
348358
good_codes=[202],
349359
)
350360

351-
def list_ssh_keys(self):
352-
return self.api_helper.make_multipage_request("/ssh_keys")
361+
def list_ssh_keys(self, label_selector=None):
362+
query = {}
363+
if label_selector:
364+
query["label_selector"] = label_selector
365+
return self.api_helper.make_multipage_request(
366+
"/ssh_keys", query_parameters=query
367+
)
353368

354-
def post_ssh_keys(self, name, public_key):
369+
def post_ssh_keys(self, name, public_key, labels=None):
370+
body = {
371+
"name": name,
372+
"public_key": public_key,
373+
}
374+
if labels:
375+
body["labels"] = labels
355376
return self.api_helper.make_post_request(
356377
path="/ssh_keys",
357-
body=None,
358-
query_parameters={"name": name, "public_key": public_key},
378+
body=body,
379+
query_parameters=None,
380+
# query_parameters={"name": name, "public_key": public_key},
359381
good_codes=[201],
360382
)
361383

@@ -387,12 +409,15 @@ def list_images(self, region_id):
387409
path=f"/cloud_computing/regions/{region_id}/images"
388410
)
389411

390-
def list_instances(self, region_id=None):
391-
region_query = {}
392-
if region_id is not None:
393-
region_query["region_id"] = region_id
412+
def list_instances(self, region_id=None, label_selector=None):
413+
query = {}
414+
if region_id:
415+
query["region_id"] = region_id
416+
if label_selector:
417+
query["label_selector"] = label_selector
418+
394419
return self.api_helper.make_multipage_request(
395-
path="/cloud_computing/instances", query_parameters=region_query
420+
path="/cloud_computing/instances", query_parameters=query
396421
)
397422

398423
def post_instances_reinstall(self, instance_id, image_id):
@@ -415,6 +440,7 @@ def post_instance(
415440
ssh_key_fingerprint,
416441
backup_copies,
417442
user_data,
443+
labels,
418444
):
419445
body = {
420446
"region_id": region_id,
@@ -434,6 +460,8 @@ def post_instance(
434460
body["backup_copies"] = backup_copies
435461
if user_data:
436462
body["user_data"] = user_data
463+
if labels:
464+
body["labels"] = labels
437465
return self.api_helper.make_post_request(
438466
path="/cloud_computing/instances",
439467
body=body,
@@ -538,8 +566,13 @@ def post_instances_revert_upgrade(self, instance_id):
538566
good_codes=[201],
539567
)
540568

541-
def list_l2_segments(self):
542-
return self.api_helper.make_multipage_request(path="/l2_segments")
569+
def list_l2_segments(self, label_selector=None):
570+
query = {}
571+
if label_selector:
572+
query["label_selector"] = label_selector
573+
return self.api_helper.make_multipage_request(
574+
path="/l2_segments", query_parameters=query
575+
)
543576

544577
def list_l2_location_groups(self):
545578
return self.api_helper.make_multipage_request(
@@ -585,22 +618,28 @@ def delete_l2_segment(self, l2_segment_id):
585618
good_codes=[202, 204],
586619
)
587620

588-
def post_l2_segment(self, name, type, location_group_id, members):
621+
def post_l2_segment(self, name, type, location_group_id, members, labels=None):
589622
body = {
590623
"name": name,
591624
"members": members,
592625
"type": type,
593626
"location_group_id": location_group_id,
594627
}
628+
if labels:
629+
body["labels"] = labels
630+
595631
return self.api_helper.make_post_request(
596632
path="/l2_segments/",
597633
body=body,
598634
query_parameters=None,
599635
good_codes=[200, 202],
600636
)
601637

602-
def put_l2_segment_update(self, l2_segment_id, members):
638+
def put_l2_segment_update(self, l2_segment_id, members, labels=None):
603639
body = {"members": members}
640+
if labels:
641+
body["labels"] = labels
642+
604643
response = self.api_helper.make_put_request(
605644
path=f"/l2_segments/{l2_segment_id}",
606645
body=body,
@@ -609,8 +648,13 @@ def put_l2_segment_update(self, l2_segment_id, members):
609648
)[1]
610649
return response
611650

612-
def list_load_balancer_instances(self):
613-
return self.api_helper.make_multipage_request(path="/load_balancers")
651+
def list_load_balancer_instances(self, label_selector=None):
652+
query = {}
653+
if label_selector:
654+
query["label_selector"] = label_selector
655+
return self.api_helper.make_multipage_request(
656+
path="/load_balancers", query_parameters=query
657+
)
614658

615659
def get_lb_instance(self, instance_id, lb_instance_type):
616660
return self.api_helper.make_get_request(

0 commit comments

Comments
 (0)