Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions hcloud/core/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,20 @@ def get_actions(self, *args, **kwargs):
return self._get_all(self.get_actions_list, 'actions', *args, **kwargs)


class GetEntityByNameMixin(object):
"""
Use as a mixin for ClientEntityBase classes
"""

def get_by_name(self, name):
# type: (str) -> BoundModelBase
self._is_list_attribute_implemented()
response = self.get_list(name=name)
entities = getattr(response, self.results_list_attribute_name)
entity = entities[0] if entities else None
return entity


class BoundModelBase(object):
"""Bound Model Base"""
model = None
Expand Down
14 changes: 12 additions & 2 deletions hcloud/datacenters/client.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
from hcloud.core.client import ClientEntityBase, BoundModelBase
from hcloud.core.client import ClientEntityBase, BoundModelBase, GetEntityByNameMixin

from hcloud.datacenters.domain import Datacenter, DatacenterServerTypes
from hcloud.locations.client import BoundLocation
Expand Down Expand Up @@ -28,7 +28,7 @@ def __init__(self, client, data):
super(BoundDatacenter, self).__init__(client, data)


class DatacentersClient(ClientEntityBase):
class DatacentersClient(ClientEntityBase, GetEntityByNameMixin):
results_list_attribute_name = 'datacenters'

def get_by_id(self, id):
Expand Down Expand Up @@ -82,3 +82,13 @@ def get_all(self, name=None):
:return: List[:class:`BoundDatacenter <hcloud.datacenters.client.BoundDatacenter>`]
"""
return super(DatacentersClient, self).get_all(name=name)

def get_by_name(self, name):
# type: (str) -> BoundDatacenter
"""Get datacenter by name

:param name: str
Used to get datacenter by name.
:return: :class:`BoundDatacenter <hcloud.datacenters.client.BoundDatacenter>`
"""
return super(DatacentersClient, self).get_by_name(name)
14 changes: 12 additions & 2 deletions hcloud/images/client.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
from hcloud.actions.client import BoundAction
from hcloud.core.client import BoundModelBase, ClientEntityBase
from hcloud.core.client import BoundModelBase, ClientEntityBase, GetEntityByNameMixin
from hcloud.core.domain import add_meta_to_result

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


class ImagesClient(ClientEntityBase):
class ImagesClient(ClientEntityBase, GetEntityByNameMixin):
results_list_attribute_name = 'images'

def get_actions_list(self,
Expand Down Expand Up @@ -207,6 +207,16 @@ def get_all(self,
"""
return super(ImagesClient, self).get_all(name=name, label_selector=label_selector, bound_to=bound_to, type=type, sort=sort)

def get_by_name(self, name):
# type: (str) -> BoundImage
"""Get image by name

:param name: str
Used to get image by name.
:return: :class:`BoundImage <hcloud.images.client.BoundImage>`
"""
return super(ImagesClient, self).get_by_name(name)

def update(self, image, description=None, type=None, labels=None):
# type:(Image, Optional[str], Optional[str], Optional[Dict[str, str]]) -> BoundImage
"""Updates the Image. You may change the description, convert a Backup image to a Snapshot Image or change the image labels.
Expand Down
14 changes: 12 additions & 2 deletions hcloud/isos/client.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
from hcloud.core.client import BoundModelBase, ClientEntityBase
from hcloud.core.client import BoundModelBase, ClientEntityBase, GetEntityByNameMixin

from hcloud.isos.domain import Iso

Expand All @@ -8,7 +8,7 @@ class BoundIso(BoundModelBase):
model = Iso


class IsosClient(ClientEntityBase):
class IsosClient(ClientEntityBase, GetEntityByNameMixin):
results_list_attribute_name = 'isos'

def get_by_id(self, id):
Expand Down Expand Up @@ -58,3 +58,13 @@ def get_all(self, name=None):
:return: List[:class:`BoundIso <hcloud.isos.client.BoundIso>`]
"""
return super(IsosClient, self).get_all(name=name)

def get_by_name(self, name):
# type: (str) -> BoundIso
"""Get iso by name

:param name: str
Used to get iso by name.
:return: :class:`BoundIso <hcloud.isos.client.BoundIso>`
"""
return super(IsosClient, self).get_by_name(name)
14 changes: 12 additions & 2 deletions hcloud/locations/client.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
from hcloud.core.client import ClientEntityBase, BoundModelBase
from hcloud.core.client import ClientEntityBase, BoundModelBase, GetEntityByNameMixin

from hcloud.locations.domain import Location

Expand All @@ -8,7 +8,7 @@ class BoundLocation(BoundModelBase):
model = Location


class LocationsClient(ClientEntityBase):
class LocationsClient(ClientEntityBase, GetEntityByNameMixin):
results_list_attribute_name = 'locations'

def get_by_id(self, id):
Expand Down Expand Up @@ -54,3 +54,13 @@ def get_all(self, name=None):
:return: List[:class:`BoundLocation <hcloud.locations.client.BoundLocation>`]
"""
return super(LocationsClient, self).get_all(name=name)

def get_by_name(self, name):
# type: (str) -> BoundLocation
"""Get location by name

:param name: str
Used to get location by name.
:return: :class:`BoundLocation <hcloud.locations.client.BoundLocation>`
"""
return super(LocationsClient, self).get_by_name(name)
14 changes: 12 additions & 2 deletions hcloud/server_types/client.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
from hcloud.core.client import ClientEntityBase, BoundModelBase
from hcloud.core.client import ClientEntityBase, BoundModelBase, GetEntityByNameMixin
from hcloud.server_types.domain import ServerType


class BoundServerType(BoundModelBase):
model = ServerType


class ServerTypesClient(ClientEntityBase):
class ServerTypesClient(ClientEntityBase, GetEntityByNameMixin):
results_list_attribute_name = 'server_types'

def get_by_id(self, id):
Expand Down Expand Up @@ -52,3 +52,13 @@ def get_all(self, name=None):
:return: List[:class:`BoundServerType <hcloud.server_types.client.BoundServerType>`]
"""
return super(ServerTypesClient, self).get_all(name=name)

def get_by_name(self, name):
# type: (str) -> BoundServerType
"""Get Server type by name

:param name: str
Used to get Server type by name.
:return: :class:`BoundServerType <hcloud.server_types.client.BoundServerType>`
"""
return super(ServerTypesClient, self).get_by_name(name)
14 changes: 12 additions & 2 deletions hcloud/servers/client.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
from hcloud.core.client import ClientEntityBase, BoundModelBase
from hcloud.core.client import ClientEntityBase, BoundModelBase, GetEntityByNameMixin

from hcloud.actions.client import BoundAction
from hcloud.core.domain import add_meta_to_result
Expand Down Expand Up @@ -270,7 +270,7 @@ def request_console(self):
return self._client.request_console(self)


class ServersClient(ClientEntityBase):
class ServersClient(ClientEntityBase, GetEntityByNameMixin):
results_list_attribute_name = 'servers'

def get_by_id(self, id):
Expand Down Expand Up @@ -329,6 +329,16 @@ def get_all(self, name=None, label_selector=None):
"""
return super(ServersClient, self).get_all(name=name, label_selector=label_selector)

def get_by_name(self, name):
# type: (str) -> BoundServer
"""Get server by name

:param name: str
Used to get server by name.
:return: :class:`BoundServer <hcloud.servers.client.BoundServer>`
"""
return super(ServersClient, self).get_by_name(name)

def create(self,
name, # type: str
server_type, # type: ServerType
Expand Down
14 changes: 12 additions & 2 deletions hcloud/ssh_keys/client.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
from hcloud.core.client import ClientEntityBase, BoundModelBase
from hcloud.core.client import ClientEntityBase, BoundModelBase, GetEntityByNameMixin

from hcloud.ssh_keys.domain import SSHKey

Expand Down Expand Up @@ -27,7 +27,7 @@ def delete(self):
return self._client.delete(self)


class SSHKeysClient(ClientEntityBase):
class SSHKeysClient(ClientEntityBase, GetEntityByNameMixin):
results_list_attribute_name = 'ssh_keys'

def get_by_id(self, id):
Expand Down Expand Up @@ -93,6 +93,16 @@ def get_all(self, name=None, fingerprint=None, label_selector=None):
"""
return super(SSHKeysClient, self).get_all(name=name, fingerprint=fingerprint, label_selector=label_selector)

def get_by_name(self, name):
# type: (str) -> SSHKeysClient
"""Get ssh key by name

:param name: str
Used to get ssh key by name.
:return: :class:`BoundSSHKey <hcloud.ssh_keys.client.BoundSSHKey>`
"""
return super(SSHKeysClient, self).get_by_name(name)

def create(self, name, public_key, labels=None):
# type: (str, str, Optional[Dict[str, str]]) -> BoundSSHKey
"""Creates a new SSH key with the given name and public_key.
Expand Down
16 changes: 14 additions & 2 deletions hcloud/volumes/client.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
from hcloud.core.client import ClientEntityBase, BoundModelBase
from hcloud.core.client import ClientEntityBase, BoundModelBase, GetEntityByNameMixin

from hcloud.actions.client import BoundAction
from hcloud.core.domain import add_meta_to_result
Expand Down Expand Up @@ -103,7 +103,7 @@ def change_protection(self, delete=None):
return self._client.change_protection(self, delete)


class VolumesClient(ClientEntityBase):
class VolumesClient(ClientEntityBase, GetEntityByNameMixin):
results_list_attribute_name = 'volumes'

def get_by_id(self, id):
Expand Down Expand Up @@ -131,6 +131,8 @@ def get_list(self, name=None, label_selector=None, page=None, per_page=None):
:return: (List[:class:`BoundVolume <hcloud.volumes.client.BoundVolume>`], :class:`Meta <hcloud.core.domain.Meta>`)
"""
params = {}
if name is not None:
params['name'] = name
if label_selector:
params['label_selector'] = label_selector
if page is not None:
Expand All @@ -151,6 +153,16 @@ def get_all(self, label_selector=None):
"""
return super(VolumesClient, self).get_all(label_selector=label_selector)

def get_by_name(self, name):
# type: (str) -> BoundVolume
"""Get volume by name

:param name: str
Used to get volume by name.
:return: :class:`BoundVolume <hcloud.volumes.client.BoundVolume>`
"""
return super(VolumesClient, self).get_by_name(name)

def create(self,
size, # type: int
name, # type: str
Expand Down
6 changes: 6 additions & 0 deletions tests/integration/datacenters/test_datacenters.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@ def test_get_by_id(self, hetzner_client):
assert datacenter.name == "fsn1-dc8"
assert datacenter.description == "Falkenstein 1 DC 8"

def test_get_by_name(self, hetzner_client):
datacenter = hetzner_client.datacenters.get_by_name("fsn1-dc8")
assert datacenter.id == 1
assert datacenter.name == "fsn1-dc8"
assert datacenter.description == "Falkenstein 1 DC 8"

def test_get_list(self, hetzner_client):
result = hetzner_client.datacenters.get_list()
datacenters = result.datacenters
Expand Down
6 changes: 6 additions & 0 deletions tests/integration/images/test_images.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,12 @@ def test_get_by_id(self, hetzner_client):
assert image.name == "ubuntu-16.04"
assert image.description == "Ubuntu 16.04 Standard 64 bit"

def test_get_by_name(self, hetzner_client):
image = hetzner_client.images.get_by_name("ubuntu-16.04")
assert image.id == 4711
assert image.name == "ubuntu-16.04"
assert image.description == "Ubuntu 16.04 Standard 64 bit"

def test_get_list(self, hetzner_client):
result = hetzner_client.images.get_list()
images = result.images
Expand Down
7 changes: 7 additions & 0 deletions tests/integration/isos/test_isos.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,13 @@ def test_get_by_id(self, hetzner_client):
assert iso.description == "FreeBSD 11.0 x64"
assert iso.type == "public"

def test_get_by_name(self, hetzner_client):
iso = hetzner_client.isos.get_by_name("FreeBSD-11.0-RELEASE-amd64-dvd1")
assert iso.id == 4711
assert iso.name == "FreeBSD-11.0-RELEASE-amd64-dvd1"
assert iso.description == "FreeBSD 11.0 x64"
assert iso.type == "public"

def test_get_list(self, hetzner_client):
result = hetzner_client.isos.get_list()
isos = result.isos
Expand Down
6 changes: 6 additions & 0 deletions tests/integration/locations/test_locations.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@ def test_get_by_id(self, hetzner_client):
assert location.name == "fsn1"
assert location.description == "Falkenstein DC Park 1"

def test_get_by_name(self, hetzner_client):
location = hetzner_client.locations.get_by_name("fsn1")
assert location.id == 1
assert location.name == "fsn1"
assert location.description == "Falkenstein DC Park 1"

def test_get_list(self, hetzner_client):
result = hetzner_client.locations.get_list()
locations = result.locations
Expand Down
24 changes: 24 additions & 0 deletions tests/integration/server_types/test_server_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,30 @@ def test_get_by_id(self, hetzner_client):
assert server_type.storage_type == "local"
assert server_type.cpu_type == "shared"

def test_get_by_name(self, hetzner_client):
server_type = hetzner_client.server_types.get_by_name("cx11")
assert server_type.id == 1
assert server_type.name == "cx11"
assert server_type.description == "CX11"
assert server_type.cores == 1
assert server_type.memory == 1
assert server_type.disk == 25
assert server_type.prices == [
{
"location": "fsn1",
"price_hourly": {
"net": "1.0000000000",
"gross": "1.1900000000000000"
},
"price_monthly": {
"net": "1.0000000000",
"gross": "1.1900000000000000"
}
}
]
assert server_type.storage_type == "local"
assert server_type.cpu_type == "shared"

def test_get_list(self, hetzner_client):
result = hetzner_client.server_types.get_list()
server_types = result.server_types
Expand Down
9 changes: 9 additions & 0 deletions tests/integration/servers/test_servers.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,15 @@ def test_get_by_id(self, hetzner_client):
assert server.datacenter.id == 1
assert server.image.id == 4711

def test_get_by_name(self, hetzner_client):
server = hetzner_client.servers.get_by_name("my-server")
assert server.id == 42
assert server.name == "my-server"
assert server.volumes == []
assert server.server_type.id == 1
assert server.datacenter.id == 1
assert server.image.id == 4711

def test_get_list(self, hetzner_client):
result = hetzner_client.servers.get_list(42)
servers = result.servers
Expand Down
7 changes: 7 additions & 0 deletions tests/integration/ssh_keys/test_ssh_keys.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,13 @@ def test_get_by_id(self, hetzner_client):
assert ssh_key.fingerprint == "b7:2f:30:a0:2f:6c:58:6c:21:04:58:61:ba:06:3b:2f"
assert ssh_key.public_key == "ssh-rsa AAAjjk76kgf...Xt"

def test_get_by_name(self, hetzner_client):
ssh_key = hetzner_client.ssh_keys.get_by_name("My ssh key")
assert ssh_key.id == 2323
assert ssh_key.name == "My ssh key"
assert ssh_key.fingerprint == "b7:2f:30:a0:2f:6c:58:6c:21:04:58:61:ba:06:3b:2f"
assert ssh_key.public_key == "ssh-rsa AAAjjk76kgf...Xt"

def test_get_list(self, hetzner_client):
ssh_keys = hetzner_client.ssh_keys.get_all()
assert ssh_keys[0].id == 2323
Expand Down
Loading