Skip to content

Commit e939914

Browse files
authored
Merge pull request #26 from hetznercloud/get-resource-by-name
Implement get_by_name method for resources
2 parents 8f7e251 + 4bd49e5 commit e939914

33 files changed

Lines changed: 501 additions & 17 deletions

File tree

hcloud/core/client.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,20 @@ def get_actions(self, *args, **kwargs):
6464
return self._get_all(self.get_actions_list, 'actions', *args, **kwargs)
6565

6666

67+
class GetEntityByNameMixin(object):
68+
"""
69+
Use as a mixin for ClientEntityBase classes
70+
"""
71+
72+
def get_by_name(self, name):
73+
# type: (str) -> BoundModelBase
74+
self._is_list_attribute_implemented()
75+
response = self.get_list(name=name)
76+
entities = getattr(response, self.results_list_attribute_name)
77+
entity = entities[0] if entities else None
78+
return entity
79+
80+
6781
class BoundModelBase(object):
6882
"""Bound Model Base"""
6983
model = None

hcloud/datacenters/client.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# -*- coding: utf-8 -*-
2-
from hcloud.core.client import ClientEntityBase, BoundModelBase
2+
from hcloud.core.client import ClientEntityBase, BoundModelBase, GetEntityByNameMixin
33

44
from hcloud.datacenters.domain import Datacenter, DatacenterServerTypes
55
from hcloud.locations.client import BoundLocation
@@ -28,7 +28,7 @@ def __init__(self, client, data):
2828
super(BoundDatacenter, self).__init__(client, data)
2929

3030

31-
class DatacentersClient(ClientEntityBase):
31+
class DatacentersClient(ClientEntityBase, GetEntityByNameMixin):
3232
results_list_attribute_name = 'datacenters'
3333

3434
def get_by_id(self, id):
@@ -82,3 +82,13 @@ def get_all(self, name=None):
8282
:return: List[:class:`BoundDatacenter <hcloud.datacenters.client.BoundDatacenter>`]
8383
"""
8484
return super(DatacentersClient, self).get_all(name=name)
85+
86+
def get_by_name(self, name):
87+
# type: (str) -> BoundDatacenter
88+
"""Get datacenter by name
89+
90+
:param name: str
91+
Used to get datacenter by name.
92+
:return: :class:`BoundDatacenter <hcloud.datacenters.client.BoundDatacenter>`
93+
"""
94+
return super(DatacentersClient, self).get_by_name(name)

hcloud/images/client.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# -*- coding: utf-8 -*-
22
from hcloud.actions.client import BoundAction
3-
from hcloud.core.client import BoundModelBase, ClientEntityBase
3+
from hcloud.core.client import BoundModelBase, ClientEntityBase, GetEntityByNameMixin
44
from hcloud.core.domain import add_meta_to_result
55

66
from hcloud.images.domain import Image
@@ -78,7 +78,7 @@ def change_protection(self, delete=None):
7878
return self._client.change_protection(self, delete)
7979

8080

81-
class ImagesClient(ClientEntityBase):
81+
class ImagesClient(ClientEntityBase, GetEntityByNameMixin):
8282
results_list_attribute_name = 'images'
8383

8484
def get_actions_list(self,
@@ -207,6 +207,16 @@ def get_all(self,
207207
"""
208208
return super(ImagesClient, self).get_all(name=name, label_selector=label_selector, bound_to=bound_to, type=type, sort=sort)
209209

210+
def get_by_name(self, name):
211+
# type: (str) -> BoundImage
212+
"""Get image by name
213+
214+
:param name: str
215+
Used to get image by name.
216+
:return: :class:`BoundImage <hcloud.images.client.BoundImage>`
217+
"""
218+
return super(ImagesClient, self).get_by_name(name)
219+
210220
def update(self, image, description=None, type=None, labels=None):
211221
# type:(Image, Optional[str], Optional[str], Optional[Dict[str, str]]) -> BoundImage
212222
"""Updates the Image. You may change the description, convert a Backup image to a Snapshot Image or change the image labels.

hcloud/isos/client.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# -*- coding: utf-8 -*-
2-
from hcloud.core.client import BoundModelBase, ClientEntityBase
2+
from hcloud.core.client import BoundModelBase, ClientEntityBase, GetEntityByNameMixin
33

44
from hcloud.isos.domain import Iso
55

@@ -8,7 +8,7 @@ class BoundIso(BoundModelBase):
88
model = Iso
99

1010

11-
class IsosClient(ClientEntityBase):
11+
class IsosClient(ClientEntityBase, GetEntityByNameMixin):
1212
results_list_attribute_name = 'isos'
1313

1414
def get_by_id(self, id):
@@ -58,3 +58,13 @@ def get_all(self, name=None):
5858
:return: List[:class:`BoundIso <hcloud.isos.client.BoundIso>`]
5959
"""
6060
return super(IsosClient, self).get_all(name=name)
61+
62+
def get_by_name(self, name):
63+
# type: (str) -> BoundIso
64+
"""Get iso by name
65+
66+
:param name: str
67+
Used to get iso by name.
68+
:return: :class:`BoundIso <hcloud.isos.client.BoundIso>`
69+
"""
70+
return super(IsosClient, self).get_by_name(name)

hcloud/locations/client.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# -*- coding: utf-8 -*-
2-
from hcloud.core.client import ClientEntityBase, BoundModelBase
2+
from hcloud.core.client import ClientEntityBase, BoundModelBase, GetEntityByNameMixin
33

44
from hcloud.locations.domain import Location
55

@@ -8,7 +8,7 @@ class BoundLocation(BoundModelBase):
88
model = Location
99

1010

11-
class LocationsClient(ClientEntityBase):
11+
class LocationsClient(ClientEntityBase, GetEntityByNameMixin):
1212
results_list_attribute_name = 'locations'
1313

1414
def get_by_id(self, id):
@@ -54,3 +54,13 @@ def get_all(self, name=None):
5454
:return: List[:class:`BoundLocation <hcloud.locations.client.BoundLocation>`]
5555
"""
5656
return super(LocationsClient, self).get_all(name=name)
57+
58+
def get_by_name(self, name):
59+
# type: (str) -> BoundLocation
60+
"""Get location by name
61+
62+
:param name: str
63+
Used to get location by name.
64+
:return: :class:`BoundLocation <hcloud.locations.client.BoundLocation>`
65+
"""
66+
return super(LocationsClient, self).get_by_name(name)

hcloud/server_types/client.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
from hcloud.core.client import ClientEntityBase, BoundModelBase
1+
from hcloud.core.client import ClientEntityBase, BoundModelBase, GetEntityByNameMixin
22
from hcloud.server_types.domain import ServerType
33

44

55
class BoundServerType(BoundModelBase):
66
model = ServerType
77

88

9-
class ServerTypesClient(ClientEntityBase):
9+
class ServerTypesClient(ClientEntityBase, GetEntityByNameMixin):
1010
results_list_attribute_name = 'server_types'
1111

1212
def get_by_id(self, id):
@@ -52,3 +52,13 @@ def get_all(self, name=None):
5252
:return: List[:class:`BoundServerType <hcloud.server_types.client.BoundServerType>`]
5353
"""
5454
return super(ServerTypesClient, self).get_all(name=name)
55+
56+
def get_by_name(self, name):
57+
# type: (str) -> BoundServerType
58+
"""Get Server type by name
59+
60+
:param name: str
61+
Used to get Server type by name.
62+
:return: :class:`BoundServerType <hcloud.server_types.client.BoundServerType>`
63+
"""
64+
return super(ServerTypesClient, self).get_by_name(name)

hcloud/servers/client.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# -*- coding: utf-8 -*-
2-
from hcloud.core.client import ClientEntityBase, BoundModelBase
2+
from hcloud.core.client import ClientEntityBase, BoundModelBase, GetEntityByNameMixin
33

44
from hcloud.actions.client import BoundAction
55
from hcloud.core.domain import add_meta_to_result
@@ -270,7 +270,7 @@ def request_console(self):
270270
return self._client.request_console(self)
271271

272272

273-
class ServersClient(ClientEntityBase):
273+
class ServersClient(ClientEntityBase, GetEntityByNameMixin):
274274
results_list_attribute_name = 'servers'
275275

276276
def get_by_id(self, id):
@@ -329,6 +329,16 @@ def get_all(self, name=None, label_selector=None):
329329
"""
330330
return super(ServersClient, self).get_all(name=name, label_selector=label_selector)
331331

332+
def get_by_name(self, name):
333+
# type: (str) -> BoundServer
334+
"""Get server by name
335+
336+
:param name: str
337+
Used to get server by name.
338+
:return: :class:`BoundServer <hcloud.servers.client.BoundServer>`
339+
"""
340+
return super(ServersClient, self).get_by_name(name)
341+
332342
def create(self,
333343
name, # type: str
334344
server_type, # type: ServerType

hcloud/ssh_keys/client.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# -*- coding: utf-8 -*-
2-
from hcloud.core.client import ClientEntityBase, BoundModelBase
2+
from hcloud.core.client import ClientEntityBase, BoundModelBase, GetEntityByNameMixin
33

44
from hcloud.ssh_keys.domain import SSHKey
55

@@ -27,7 +27,7 @@ def delete(self):
2727
return self._client.delete(self)
2828

2929

30-
class SSHKeysClient(ClientEntityBase):
30+
class SSHKeysClient(ClientEntityBase, GetEntityByNameMixin):
3131
results_list_attribute_name = 'ssh_keys'
3232

3333
def get_by_id(self, id):
@@ -93,6 +93,16 @@ def get_all(self, name=None, fingerprint=None, label_selector=None):
9393
"""
9494
return super(SSHKeysClient, self).get_all(name=name, fingerprint=fingerprint, label_selector=label_selector)
9595

96+
def get_by_name(self, name):
97+
# type: (str) -> SSHKeysClient
98+
"""Get ssh key by name
99+
100+
:param name: str
101+
Used to get ssh key by name.
102+
:return: :class:`BoundSSHKey <hcloud.ssh_keys.client.BoundSSHKey>`
103+
"""
104+
return super(SSHKeysClient, self).get_by_name(name)
105+
96106
def create(self, name, public_key, labels=None):
97107
# type: (str, str, Optional[Dict[str, str]]) -> BoundSSHKey
98108
"""Creates a new SSH key with the given name and public_key.

hcloud/volumes/client.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# -*- coding: utf-8 -*-
2-
from hcloud.core.client import ClientEntityBase, BoundModelBase
2+
from hcloud.core.client import ClientEntityBase, BoundModelBase, GetEntityByNameMixin
33

44
from hcloud.actions.client import BoundAction
55
from hcloud.core.domain import add_meta_to_result
@@ -103,7 +103,7 @@ def change_protection(self, delete=None):
103103
return self._client.change_protection(self, delete)
104104

105105

106-
class VolumesClient(ClientEntityBase):
106+
class VolumesClient(ClientEntityBase, GetEntityByNameMixin):
107107
results_list_attribute_name = 'volumes'
108108

109109
def get_by_id(self, id):
@@ -131,6 +131,8 @@ def get_list(self, name=None, label_selector=None, page=None, per_page=None):
131131
:return: (List[:class:`BoundVolume <hcloud.volumes.client.BoundVolume>`], :class:`Meta <hcloud.core.domain.Meta>`)
132132
"""
133133
params = {}
134+
if name is not None:
135+
params['name'] = name
134136
if label_selector:
135137
params['label_selector'] = label_selector
136138
if page is not None:
@@ -151,6 +153,16 @@ def get_all(self, label_selector=None):
151153
"""
152154
return super(VolumesClient, self).get_all(label_selector=label_selector)
153155

156+
def get_by_name(self, name):
157+
# type: (str) -> BoundVolume
158+
"""Get volume by name
159+
160+
:param name: str
161+
Used to get volume by name.
162+
:return: :class:`BoundVolume <hcloud.volumes.client.BoundVolume>`
163+
"""
164+
return super(VolumesClient, self).get_by_name(name)
165+
154166
def create(self,
155167
size, # type: int
156168
name, # type: str

tests/integration/datacenters/test_datacenters.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ def test_get_by_id(self, hetzner_client):
55
assert datacenter.name == "fsn1-dc8"
66
assert datacenter.description == "Falkenstein 1 DC 8"
77

8+
def test_get_by_name(self, hetzner_client):
9+
datacenter = hetzner_client.datacenters.get_by_name("fsn1-dc8")
10+
assert datacenter.id == 1
11+
assert datacenter.name == "fsn1-dc8"
12+
assert datacenter.description == "Falkenstein 1 DC 8"
13+
814
def test_get_list(self, hetzner_client):
915
result = hetzner_client.datacenters.get_list()
1016
datacenters = result.datacenters

0 commit comments

Comments
 (0)