Skip to content

Commit 4bb7dcf

Browse files
caberoscaberos
authored andcommitted
slcli hw list --search "query"
1 parent e03d17b commit 4bb7dcf

File tree

3 files changed

+66
-12
lines changed

3 files changed

+66
-12
lines changed

SoftLayer/CLI/hardware/list.py

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
from SoftLayer.CLI import formatting
1010
from SoftLayer.CLI import helpers
1111

12-
1312
# pylint: disable=unnecessary-lambda
1413

1514
COLUMNS = [
@@ -47,6 +46,9 @@
4746
@click.option('--hostname', '-H', help='Filter by hostname')
4847
@click.option('--memory', '-m', help='Filter by memory in gigabytes')
4948
@click.option('--network', '-n', help='Filter by network port speed in Mbps')
49+
@click.option('--search', is_flag=False, flag_value="", default=None,
50+
help="Use the more flexible Search API to list instances. See `slcli search --types` for list " +
51+
"of searchable fields.")
5052
@helpers.multi_option('--tag', help='Filter by tags')
5153
@click.option('--sortby', help='Column to sort by', default='hostname', show_default=True)
5254
@click.option('--columns',
@@ -59,19 +61,26 @@
5961
default=100,
6062
show_default=True)
6163
@environment.pass_env
62-
def cli(env, sortby, cpu, domain, datacenter, hostname, memory, network, tag, columns, limit):
64+
def cli(env, sortby, cpu, domain, datacenter, hostname, memory, network, search, tag, columns, limit):
6365
"""List hardware servers."""
6466

65-
manager = SoftLayer.HardwareManager(env.client)
66-
servers = manager.list_hardware(hostname=hostname,
67-
domain=domain,
68-
cpus=cpu,
69-
memory=memory,
70-
datacenter=datacenter,
71-
nic_speed=network,
72-
tags=tag,
73-
mask="mask(SoftLayer_Hardware_Server)[%s]" % columns.mask(),
74-
limit=limit)
67+
if search is not None:
68+
object_mask = f"mask[resource(SoftLayer_Hardware)]"
69+
search_manager = SoftLayer.SearchManager(env.client)
70+
servers = search_manager.search_hadrware_instances(hostname=hostname, domain=domain, datacenter=datacenter,
71+
tags=tag, search_string=search, mask=object_mask)
72+
73+
else:
74+
manager = SoftLayer.HardwareManager(env.client)
75+
servers = manager.list_hardware(hostname=hostname,
76+
domain=domain,
77+
cpus=cpu,
78+
memory=memory,
79+
datacenter=datacenter,
80+
nic_speed=network,
81+
tags=tag,
82+
mask="mask(SoftLayer_Hardware_Server)[%s]" % columns.mask(),
83+
limit=limit)
7584

7685
table = formatting.Table(columns.columns)
7786
table.sortby = sortby

SoftLayer/managers/search.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,37 @@ def search_instances(self, search_string, mask=None, **kwargs):
6161
guests.append(resource.get('resource'))
6262

6363
return guests
64+
65+
def search_hadrware_instances(self, search_string, mask=None, **kwargs):
66+
"""Lists hardwares based in the search_string.
67+
68+
Also takes in a few search terms as **kwargs. such as hostname, datacenter, domain and tags
69+
"""
70+
71+
# This forces the Search API to do a fuzzy search on our term, kinda. Not sure why the ** are
72+
# Required but it will do an exact search without them.
73+
if search_string:
74+
search_string = f"*{search_string}*"
75+
search_string = f"_objectType:SoftLayer_Hardware {search_string}"
76+
if kwargs.get('hostname'):
77+
search_string = f"{search_string} hostname: *{kwargs.get('hostname')}*"
78+
if kwargs.get('domain'):
79+
search_string = f"{search_string} domain: *{kwargs.get('domain')}*"
80+
if kwargs.get('cpu'):
81+
search_string = f"{search_string} cpu: *{kwargs.get('cpu')}*"
82+
if kwargs.get('network'):
83+
search_string = f"{search_string} network: *{kwargs.get('network')}*"
84+
if kwargs.get('memory'):
85+
search_string = f"{search_string} memory: *{kwargs.get('memory')}*"
86+
if kwargs.get('datacenter'):
87+
search_string = f"{search_string} datacenter.longName: *{kwargs.get('datacenter')}*"
88+
if kwargs.get('tags'):
89+
tags = " ".join(kwargs.get("tags", []))
90+
search_string = f"{search_string} internalTagReferences.tag.name: {tags}"
91+
result = self.search_manager.advancedSearch(search_string, mask=mask)
92+
hw = []
93+
print(search_string)
94+
for resource in result:
95+
hw.append(resource.get('resource'))
96+
97+
return hw

tests/CLI/modules/server_tests.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1057,3 +1057,14 @@ def test_create_credential(self):
10571057
'--username', 'testslcli', '--password', 'test-123456',
10581058
'--notes', 'test slcli', '--system', 'system'])
10591059
self.assert_no_fail(result)
1060+
1061+
def test_list_hw_search_noargs(self):
1062+
result = self.run_command(['hw', 'list', '--search'])
1063+
self.assert_no_fail(result)
1064+
self.assert_called_with('SoftLayer_Search', 'advancedSearch', args=('_objectType:SoftLayer_Hardware ',))
1065+
1066+
def test_list_hw_search_noargs_domain(self):
1067+
result = self.run_command(['hw', 'list', '--search', '-Dtest'])
1068+
self.assert_no_fail(result)
1069+
self.assert_called_with('SoftLayer_Search', 'advancedSearch',
1070+
args=('_objectType:SoftLayer_Hardware domain: *test*',))

0 commit comments

Comments
 (0)