1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
"""
SoftLayer.search
~~~~~~~~~~~~~~~~
Search Manager
:license: MIT, see LICENSE for more details.
"""
class SearchManager(object):
"""Manager to help search via the SoftLayer API.
:param SoftLayer.API.BaseClient client: the client instance
"""
def __init__(self, client):
self.client = client
self.search_manager = client['SoftLayer_Search']
def get_object_types(self):
"""returns a collection of SoftLayer_Container_Search_ObjectType containers."""
return self.search_manager.getObjectTypes()
def search(self, search_string):
"""allows for searching for SoftLayer resources by simple phrase."""
return self.search_manager.search(search_string)
def advanced(self, search_string):
"""Uses the SoftLayer_Search::advancedSearch API. Allows for more complicated search phrases."""
return self.search_manager.advancedSearch(search_string)
def search_instances(self, search_string, mask=None, **kwargs):
"""Lists VSIs based in the search_string.
Also takes in a few search terms as \\*\\*kwargs. such as hostname, datacenter, domain and tags
"""
# This forces the Search API to do a fuzzy search on our term, kinda. Not sure why the ** are
# Required but it will do an exact search without them.
if search_string:
search_string = f"*{search_string}*"
search_string = f"_objectType:SoftLayer_Virtual_Guest {search_string}"
if kwargs.get('hostname'):
search_string = f"{search_string} hostname: *{kwargs.get('hostname')}*"
if kwargs.get('domain'):
search_string = f"{search_string} domain: *{kwargs.get('domain')}*"
if kwargs.get('datacenter'):
search_string = f"{search_string} datacenter.longName: *{kwargs.get('datacenter')}*"
if kwargs.get('tags'):
tags = " ".join(f"tagReferences.tag.name: \"{t}\"" for t in kwargs.get("tags", []))
search_string = f"{search_string} {tags}"
result = self.search_manager.advancedSearch(search_string, mask=mask)
guests = []
for resource in result:
guests.append(resource.get('resource'))
return guests
def search_hadrware_instances(self, search_string, mask=None, **kwargs):
"""Lists hardwares based in the search_string.
Also takes in a few search terms as \\*\\*kwargs. such as hostname, datacenter, domain and tags
"""
# This forces the Search API to do a fuzzy search on our term, kinda. Not sure why the ** are
# Required but it will do an exact search without them.
if search_string:
search_string = f"*{search_string}*"
search_string = f"_objectType:SoftLayer_Hardware {search_string}"
if kwargs.get('hostname'):
search_string = f"{search_string} hostname: *{kwargs.get('hostname')}*"
if kwargs.get('domain'):
search_string = f"{search_string} domain: *{kwargs.get('domain')}*"
if kwargs.get('cpu'):
search_string = f"{search_string} cpu: *{kwargs.get('cpu')}*"
if kwargs.get('network'):
search_string = f"{search_string} network: *{kwargs.get('network')}*"
if kwargs.get('memory'):
search_string = f"{search_string} memory: *{kwargs.get('memory')}*"
if kwargs.get('datacenter'):
search_string = f"{search_string} datacenter.longName: *{kwargs.get('datacenter')}*"
if kwargs.get('tags'):
tags = " ".join(kwargs.get("tags", []))
search_string = f"{search_string} internalTagReferences.tag.name: {tags}"
result = self.search_manager.advancedSearch(search_string, mask=mask)
servers = []
for resource in result:
servers.append(resource.get('resource'))
return servers
|