Skip to content

Commit 45fc213

Browse files
committed
Add public wrappers for describe lock result
1 parent 4f66aad commit 45fc213

File tree

5 files changed

+86
-80
lines changed

5 files changed

+86
-80
lines changed

tests/coordination/test_coordination_client.py

Lines changed: 27 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
ConsistencyMode,
1111
RateLimiterCountersMode,
1212
CoordinationClient,
13+
CreateSemaphoreResult,
14+
DescribeLockResult,
1315
)
1416

1517

@@ -119,33 +121,29 @@ async def test_coordination_lock_full_lifecycle(self, aio_connection):
119121

120122
lock = client.lock("test_lock", node_path)
121123

122-
create_resp = await lock.create(init_limit=1, init_data=b"init-data")
124+
create_resp: CreateSemaphoreResult = await lock.create(init_limit=1, init_data=b"init-data")
123125
assert create_resp.status == StatusCode.SUCCESS
124126

125-
describe_resp = await lock.describe()
127+
describe_resp: DescribeLockResult = await lock.describe()
126128
assert describe_resp.status == StatusCode.SUCCESS
127-
128-
sem = describe_resp.semaphore_description
129-
assert sem.name == "test_lock"
130-
assert sem.data == b"init-data"
131-
assert sem.count == 0
132-
assert sem.ephemeral is False
133-
assert list(sem.owners) == []
134-
assert list(sem.waiters) == []
129+
assert describe_resp.name == "test_lock"
130+
assert describe_resp.data == b"init-data"
131+
assert describe_resp.count == 0
132+
assert describe_resp.ephemeral is False
133+
assert list(describe_resp.owners) == []
134+
assert list(describe_resp.waiters) == []
135135

136136
update_resp = await lock.update(new_data=b"updated-data")
137137
assert update_resp.status == StatusCode.SUCCESS
138138

139-
describe_resp2 = await lock.describe()
139+
describe_resp2: DescribeLockResult = await lock.describe()
140140
assert describe_resp2.status == StatusCode.SUCCESS
141-
142-
sem2 = describe_resp2.semaphore_description
143-
assert sem2.name == "test_lock"
144-
assert sem2.data == b"updated-data"
145-
assert sem2.count == 0
146-
assert sem2.ephemeral is False
147-
assert list(sem2.owners) == []
148-
assert list(sem2.waiters) == []
141+
assert describe_resp2.name == "test_lock"
142+
assert describe_resp2.data == b"updated-data"
143+
assert describe_resp2.count == 0
144+
assert describe_resp2.ephemeral is False
145+
assert list(describe_resp2.owners) == []
146+
assert list(describe_resp2.waiters) == []
149147

150148
lock2_started = asyncio.Event()
151149
lock2_acquired = asyncio.Event()
@@ -160,16 +158,14 @@ async def second_lock_task():
160158
assert lock1._stream is not None
161159
assert lock1._stream.session_id is not None
162160

163-
resp = await lock1.describe()
161+
resp: DescribeLockResult = await lock1.describe()
164162
assert resp.status == StatusCode.SUCCESS
165-
166-
sem_under_lock = resp.semaphore_description
167-
assert sem_under_lock.name == "test_lock"
168-
assert sem_under_lock.data == b"updated-data"
169-
assert sem_under_lock.count == 1
170-
assert sem_under_lock.ephemeral is False
171-
assert len(list(sem_under_lock.owners)) == 1
172-
assert list(sem_under_lock.waiters) == []
163+
assert resp.name == "test_lock"
164+
assert resp.data == b"updated-data"
165+
assert resp.count == 1
166+
assert resp.ephemeral is False
167+
assert len(list(resp.owners)) == 1
168+
assert list(resp.waiters) == []
173169

174170
t2 = asyncio.create_task(second_lock_task())
175171
await lock2_started.wait()
@@ -185,13 +181,12 @@ async def second_lock_task():
185181
assert lock3._stream is not None
186182
assert lock3._stream.session_id is not None
187183

188-
resp3 = await lock3.describe()
184+
resp3: DescribeLockResult = await lock3.describe()
189185
assert resp3.status == StatusCode.SUCCESS
190-
sem3 = resp3.semaphore_description
191-
assert sem3.count == 1
186+
assert resp3.count == 1
192187

193188
delete_resp = await lock.delete()
194189
assert delete_resp.status == StatusCode.SUCCESS
195190

196-
describe_after_delete = await lock.describe()
191+
describe_after_delete: DescribeLockResult = await lock.describe()
197192
assert describe_after_delete.status == StatusCode.NOT_FOUND

ydb/_grpc/grpcwrapper/ydb_coordination.py

Lines changed: 16 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import typing
22
from dataclasses import dataclass
33

4-
from .ydb_coordination_public_types import NodeConfig
54

65
if typing.TYPE_CHECKING:
76
from ..v4.protos import ydb_coordination_pb2
@@ -14,7 +13,7 @@
1413
@dataclass
1514
class CreateNodeRequest(IToProto):
1615
path: str
17-
config: typing.Optional[NodeConfig]
16+
config: typing.Any
1817

1918
def to_proto(self) -> ydb_coordination_pb2.CreateNodeRequest:
2019
cfg_proto = self.config.to_proto() if self.config else None
@@ -27,7 +26,7 @@ def to_proto(self) -> ydb_coordination_pb2.CreateNodeRequest:
2726
@dataclass
2827
class AlterNodeRequest(IToProto):
2928
path: str
30-
config: NodeConfig
29+
config: typing.Any
3130

3231
def to_proto(self) -> ydb_coordination_pb2.AlterNodeRequest:
3332
cfg_proto = self.config.to_proto() if self.config else None
@@ -204,62 +203,35 @@ def from_proto(resp: ydb_coordination_pb2.SessionResponse) -> "FromServer":
204203
def __getattr__(self, name: str):
205204
return getattr(self.raw, name)
206205

207-
@property
208-
def status(self) -> typing.Optional[int]:
209-
return getattr(self.raw, "status", None)
210-
211206
@property
212207
def session_started(self) -> typing.Optional[ydb_coordination_pb2.SessionResponse.SessionStarted]:
213-
x = getattr(self.raw, "session_started", None)
214-
return x if getattr(x, "session_id", 0) else None
215-
216-
@property
217-
def session_stopped(self) -> typing.Optional[ydb_coordination_pb2.SessionResponse.SessionStopped]:
218-
return getattr(self.raw, "session_stopped", None) or None
219-
220-
@property
221-
def failure(self) -> typing.Optional[ydb_coordination_pb2.SessionResponse.Failure]:
222-
return getattr(self.raw, "failure", None) or None
223-
224-
@property
225-
def pong(self) -> typing.Optional[ydb_coordination_pb2.SessionResponse.PingPong]:
226-
return getattr(self.raw, "pong", None) or None
227-
228-
@property
229-
def ping(self) -> typing.Optional[ydb_coordination_pb2.SessionResponse.PingPong]:
230-
return getattr(self.raw, "ping", None) or None
208+
s = self.raw.session_started
209+
return s if s.session_id else None
231210

232211
@property
233212
def opaque(self) -> typing.Optional[int]:
234-
if getattr(self.raw, "ping") is not None:
235-
return getattr(getattr(self.raw, "ping"), "opaque", None)
213+
if self.raw.HasField("ping"):
214+
return self.raw.ping.opaque
215+
return None
236216

237217
@property
238-
def acquire_semaphore_result(
239-
self,
240-
) -> typing.Optional[ydb_coordination_pb2.SessionResponse.AcquireSemaphoreResult]:
241-
return getattr(self.raw, "acquire_semaphore_result", None) or None
218+
def acquire_semaphore_result(self) -> typing.Optional[ydb_coordination_pb2.SessionResponse.AcquireSemaphoreResult]:
219+
return self.raw.acquire_semaphore_result if self.raw.HasField("acquire_semaphore_result") else None
242220

243221
@property
244-
def create_semaphore_result(
245-
self,
246-
) -> typing.Optional[ydb_coordination_pb2.SessionResponse.CreateSemaphoreResult]:
247-
return getattr(self.raw, "create_semaphore_result", None) or None
222+
def create_semaphore_result(self) -> typing.Optional[ydb_coordination_pb2.SessionResponse.CreateSemaphoreResult]:
223+
return self.raw.create_semaphore_result if self.raw.HasField("create_semaphore_result") else None
248224

249225
@property
250-
def delete_semaphore_result(
251-
self,
252-
) -> typing.Optional[ydb_coordination_pb2.SessionResponse.DeleteSemaphoreResult]:
253-
return getattr(self.raw, "delete_semaphore_result", None) or None
226+
def delete_semaphore_result(self) -> typing.Optional[ydb_coordination_pb2.SessionResponse.DeleteSemaphoreResult]:
227+
return self.raw.delete_semaphore_result if self.raw.HasField("delete_semaphore_result") else None
254228

255229
@property
256-
def update_semaphore_result(
257-
self,
258-
) -> typing.Optional[ydb_coordination_pb2.SessionResponse.UpdateSemaphoreResult]:
259-
return getattr(self.raw, "update_semaphore_result", None) or None
230+
def update_semaphore_result(self) -> typing.Optional[ydb_coordination_pb2.SessionResponse.UpdateSemaphoreResult]:
231+
return self.raw.update_semaphore_result if self.raw.HasField("update_semaphore_result") else None
260232

261233
@property
262234
def describe_semaphore_result(
263235
self,
264236
) -> typing.Optional[ydb_coordination_pb2.SessionResponse.DescribeSemaphoreResult]:
265-
return getattr(self.raw, "describe_semaphore_result", None) or None
237+
return self.raw.describe_semaphore_result if self.raw.HasField("describe_semaphore_result") else None

ydb/_grpc/grpcwrapper/ydb_coordination_public_types.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
from enum import IntEnum
33
import typing
44

5-
65
if typing.TYPE_CHECKING:
76
from ..v4.protos import ydb_coordination_pb2
87
else:
@@ -83,3 +82,32 @@ def from_proto(msg: ydb_coordination_pb2.SessionResponse.CreateSemaphoreResult)
8382
req_id=msg.req_id,
8483
status=msg.status,
8584
)
85+
86+
87+
@dataclass
88+
class DescribeLockResult:
89+
req_id: int
90+
status: int
91+
watch_added: bool
92+
count: int
93+
data: bytes
94+
ephemeral: bool
95+
limit: int
96+
name: str
97+
owners: list
98+
waiters: list
99+
100+
@staticmethod
101+
def from_proto(msg: ydb_coordination_pb2.SessionResponse.DescribeSemaphoreResult) -> "DescribeLockResult":
102+
return DescribeLockResult(
103+
req_id=msg.req_id,
104+
status=msg.status,
105+
watch_added=msg.watch_added,
106+
count=msg.semaphore_description.count,
107+
data=msg.semaphore_description.data,
108+
ephemeral=msg.semaphore_description.ephemeral,
109+
limit=msg.semaphore_description.limit,
110+
name=msg.semaphore_description.name,
111+
owners=msg.semaphore_description.owners,
112+
waiters=msg.semaphore_description.waiters,
113+
)

ydb/aio/coordination/lock.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
DeleteSemaphore,
1212
FromServer,
1313
)
14+
from ydb._grpc.grpcwrapper.ydb_coordination_public_types import CreateSemaphoreResult, DescribeLockResult
1415
from ydb.aio.coordination.stream import CoordinationStream
1516
from ydb.aio.coordination.reconnector import CoordinationReconnector
1617

@@ -158,7 +159,7 @@ async def create(self, init_limit, init_data):
158159
await self.send(req)
159160

160161
resp = await self._wait_for_response(req_id, kind="create")
161-
return resp
162+
return CreateSemaphoreResult.from_proto(resp)
162163

163164
async def delete(self):
164165
await self._ensure_session()
@@ -192,7 +193,7 @@ async def describe(self):
192193
await self.send(req)
193194

194195
resp = await self._wait_for_response(req_id, kind="describe")
195-
return resp
196+
return DescribeLockResult.from_proto(resp)
196197

197198
async def update(self, new_data):
198199
await self._ensure_session()

ydb/coordination/__init__.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,16 @@
55
ConsistencyMode,
66
RateLimiterCountersMode,
77
DescribeResult,
8+
CreateSemaphoreResult,
9+
DescribeLockResult,
810
)
911

10-
__all__ = ["CoordinationClient", "NodeConfig", "ConsistencyMode", "RateLimiterCountersMode", "DescribeResult"]
12+
__all__ = [
13+
"CoordinationClient",
14+
"NodeConfig",
15+
"ConsistencyMode",
16+
"RateLimiterCountersMode",
17+
"DescribeResult",
18+
"CreateSemaphoreResult",
19+
"DescribeLockResult",
20+
]

0 commit comments

Comments
 (0)