Skip to content

Commit 9847976

Browse files
author
Adrian Huber
committed
Add placement group create request
1 parent 80e4f3b commit 9847976

4 files changed

Lines changed: 94 additions & 1 deletion

File tree

hcloud/placement_groups/client.py

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
# -*- coding: utf-8 -*-
2+
from hcloud.actions.client import BoundAction
23
from hcloud.core.client import BoundModelBase, ClientEntityBase, GetEntityByNameMixin
34

4-
from hcloud.placement_groups.domain import PlacementGroup
5+
from hcloud.placement_groups.domain import PlacementGroup, CreatePlacementGroupResponse
56

67

78
class BoundPlacementGroup(BoundModelBase):
@@ -108,6 +109,40 @@ def get_by_name(self, name):
108109
"""
109110
return super(PlacementGroupsClient, self).get_by_name(name)
110111

112+
def create(self,
113+
name, # type: str
114+
labels=None, # type: Optional[Dict[str, str]]
115+
type=PlacementGroup.TYPE_SPREAD # type: Optional[str]
116+
):
117+
# type: (...) -> CreatePlacementGroupResponse
118+
"""Creates a new Placement Group.
119+
120+
:param name: str
121+
Placement Group Name
122+
:param labels: Dict[str, str] (optional)
123+
User-defined labels (key-value pairs)
124+
:param type: str
125+
Type of the Placement Group
126+
:return: :class:`CreatePlacementGroupResponse <hcloud.placement_groups.domain.CreatePlacementGroupResponse>`
127+
"""
128+
data = {
129+
'name': name,
130+
'type': type
131+
}
132+
if labels is not None:
133+
data['labels'] = labels
134+
response = self._client.request(url="/placement_groups", json=data, method="POST")
135+
136+
action = None
137+
if response.get('action') is not None:
138+
action = BoundAction(self._client.action, response['action'])
139+
140+
result = CreatePlacementGroupResponse(
141+
placement_group=BoundPlacementGroup(self, response['placement_group']),
142+
action=action
143+
)
144+
return result
145+
111146
def update(self, placement_group, labels=None, name=None):
112147
# type: (PlacementGroup, Optional[Dict[str, str]], Optional[str]) -> BoundPlacementGroup
113148
"""Updates the description or labels of a Placement Group.

hcloud/placement_groups/domain.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,25 @@ def __init__(
5050
self.servers = servers
5151
self.type = type
5252
self.created = isoparse(created) if created else None
53+
54+
55+
class CreatePlacementGroupResponse(BaseDomain):
56+
"""Create Placement Group Response Domain
57+
58+
:param placement_group: :class:`BoundPlacementGroup <hcloud.placement_groups.client.BoundPlacementGroup>`
59+
The Placement Group which was created
60+
:param action: :class:`BoundAction <hcloud.actions.client.BoundAction>`
61+
The Action which shows the progress of the Placement Group Creation
62+
"""
63+
__slots__ = (
64+
"placement_group",
65+
"action"
66+
)
67+
68+
def __init__(
69+
self,
70+
placement_group, # type: BoundPlacementGroup
71+
action, # type: BoundAction
72+
):
73+
self.placement_group = placement_group
74+
self.action = action

tests/unit/placement_groups/conftest.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,22 @@
11
import pytest
22

33

4+
@pytest.fixture()
5+
def response_create_placement_group():
6+
return {
7+
"placement_group": {
8+
"created": "2019-01-08T12:10:00+00:00",
9+
"id": 897,
10+
"labels": {
11+
"key": "value"
12+
},
13+
"name": "my Placement Group",
14+
"servers": [],
15+
"type": "spread"
16+
}
17+
}
18+
19+
420
@pytest.fixture()
521
def one_placement_group_response():
622
return {

tests/unit/placement_groups/test_client.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,3 +120,23 @@ def test_get_by_name(self, placement_groups_client, one_placement_group_response
120120
placement_groups_client._client.request.assert_called_with(url="/placement_groups", method="GET", params=params)
121121

122122
check_variables(placement_group, one_placement_group_response['placement_groups'][0])
123+
124+
def test_create(self, placement_groups_client, response_create_placement_group):
125+
placement_groups_client._client.request.return_value = response_create_placement_group
126+
response = placement_groups_client.create(
127+
response_create_placement_group['placement_group']['name'],
128+
response_create_placement_group['placement_group']['labels'],
129+
response_create_placement_group['placement_group']['type']
130+
)
131+
132+
json = {
133+
'name': response_create_placement_group['placement_group']['name'],
134+
'labels': response_create_placement_group['placement_group']['labels'],
135+
'type': response_create_placement_group['placement_group']['type']
136+
}
137+
placement_groups_client._client.request.assert_called_with(url="/placement_groups", method="POST", json=json)
138+
139+
bound_placement_group = response.placement_group
140+
141+
assert bound_placement_group._client is placement_groups_client
142+
check_variables(bound_placement_group, response_create_placement_group['placement_group'])

0 commit comments

Comments
 (0)