Skip to content

Commit c3324cf

Browse files
committed
fix review remarks
1 parent bd96246 commit c3324cf

File tree

5 files changed

+148
-119
lines changed

5 files changed

+148
-119
lines changed
Lines changed: 67 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,99 @@
1+
import pytest
2+
13
import ydb
24

3-
from ydb.coordination import NodeConfig, ConsistencyMode, RateLimiterCountersMode, CoordinationClient
5+
from ydb.coordination import (
6+
NodeConfig,
7+
ConsistencyMode,
8+
RateLimiterCountersMode,
9+
CoordinationClient,
10+
AsyncCoordinationClient,
11+
)
412

513

614
class TestCoordination:
7-
def test_coordination_alter_node(self, driver_sync: ydb.Driver):
15+
def test_coordination_node_lifecycle(self, driver_sync: ydb.Driver):
816
client = CoordinationClient(driver_sync)
9-
node_path = "/local/test_alter_node"
17+
node_path = "/local/test_node_lifecycle"
1018

1119
try:
1220
client.delete_node(node_path)
1321
except ydb.SchemeError:
1422
pass
1523

16-
client.create_node(node_path)
24+
with pytest.raises(ydb.SchemeError):
25+
client.describe_node(node_path)
1726

18-
new_config = NodeConfig(
19-
session_grace_period_millis=12345,
27+
initial_config = NodeConfig(
28+
session_grace_period_millis=1000,
2029
attach_consistency_mode=ConsistencyMode.STRICT,
21-
read_consistency_mode=ConsistencyMode.RELAXED,
30+
read_consistency_mode=ConsistencyMode.STRICT,
2231
rate_limiter_counters_mode=RateLimiterCountersMode.UNSET,
2332
self_check_period_millis=0,
2433
)
34+
client.create_node(node_path, initial_config)
2535

26-
client.alter_node(node_path, new_config)
36+
node_descr = client.describe_node(node_path)
37+
assert node_descr.path == node_path
38+
assert node_descr.config == initial_config
2739

28-
node_desc = client.describe_node(node_path)
29-
node_config = node_desc.config
30-
path = node_desc.path
40+
updated_config = NodeConfig(
41+
session_grace_period_millis=12345,
42+
attach_consistency_mode=ConsistencyMode.STRICT,
43+
read_consistency_mode=ConsistencyMode.RELAXED,
44+
rate_limiter_counters_mode=RateLimiterCountersMode.DETAILED,
45+
self_check_period_millis=10,
46+
)
47+
client.alter_node(node_path, updated_config)
3148

32-
assert node_path == path
33-
assert node_config.session_grace_period_millis == 12345
34-
assert node_config.attach_consistency_mode == ConsistencyMode.STRICT
35-
assert node_config.read_consistency_mode == ConsistencyMode.RELAXED
49+
node_descr = client.describe_node(node_path)
50+
assert node_descr.path == node_path
51+
assert node_descr.config == updated_config
3652

3753
client.delete_node(node_path)
3854

39-
def test_coordination_nodes(self, driver_sync: ydb.Driver):
40-
client = CoordinationClient(driver_sync)
41-
node_path = "/local/test_node"
55+
with pytest.raises(ydb.SchemeError):
56+
client.describe_node(node_path)
57+
58+
async def test_coordination_node_lifecycle_async(self, aio_connection):
59+
client = AsyncCoordinationClient(aio_connection)
60+
node_path = "/local/test_node_lifecycle"
4261

4362
try:
44-
client.delete_node(node_path)
63+
await client.delete_node(node_path)
4564
except ydb.SchemeError:
4665
pass
4766

48-
client.create_node(node_path)
67+
with pytest.raises(ydb.SchemeError):
68+
await client.describe_node(node_path)
4969

50-
node_descr = client.describe_node(node_path)
70+
initial_config = NodeConfig(
71+
session_grace_period_millis=1000,
72+
attach_consistency_mode=ConsistencyMode.STRICT,
73+
read_consistency_mode=ConsistencyMode.STRICT,
74+
rate_limiter_counters_mode=RateLimiterCountersMode.UNSET,
75+
self_check_period_millis=0,
76+
)
77+
await client.create_node(node_path, initial_config)
78+
79+
node_descr = await client.describe_node(node_path)
80+
assert node_descr.path == node_path
81+
assert node_descr.config == initial_config
5182

52-
node_descr_path = node_descr.path
83+
updated_config = NodeConfig(
84+
session_grace_period_millis=12345,
85+
attach_consistency_mode=ConsistencyMode.STRICT,
86+
read_consistency_mode=ConsistencyMode.RELAXED,
87+
rate_limiter_counters_mode=RateLimiterCountersMode.DETAILED,
88+
self_check_period_millis=10,
89+
)
90+
await client.alter_node(node_path, updated_config)
5391

54-
assert node_descr_path == node_path
92+
node_descr = await client.describe_node(node_path)
93+
assert node_descr.path == node_path
94+
assert node_descr.config == updated_config
5595

56-
client.delete_node(node_path)
96+
await client.delete_node(node_path)
97+
98+
with pytest.raises(ydb.SchemeError):
99+
await client.describe_node(node_path)

ydb/_grpc/grpcwrapper/ydb_coordination.py

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

4+
from .ydb_coordination_public_types import NodeConfig
45

56
if typing.TYPE_CHECKING:
67
from ..v4.protos import ydb_coordination_pb2
78
else:
89
from ..common.protos import ydb_coordination_pb2
910

1011
from .common_utils import IToProto
11-
from ydb.coordination import NodeConfig
1212

1313

1414
@dataclass
1515
class CreateNodeRequest(IToProto):
1616
path: str
17-
config: typing.Optional[NodeConfig] = None
17+
config: typing.Optional[NodeConfig]
1818

1919
def to_proto(self) -> ydb_coordination_pb2.CreateNodeRequest:
2020
cfg_proto = self.config.to_proto() if self.config else None
@@ -27,7 +27,7 @@ def to_proto(self) -> ydb_coordination_pb2.CreateNodeRequest:
2727
@dataclass
2828
class AlterNodeRequest(IToProto):
2929
path: str
30-
config: typing.Optional[NodeConfig] = None
30+
config: NodeConfig
3131

3232
def to_proto(self) -> ydb_coordination_pb2.AlterNodeRequest:
3333
cfg_proto = self.config.to_proto() if self.config else None

ydb/coordination/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
from .coordination_client import CoordinationClient
2+
from .coordination_client_async import AsyncCoordinationClient
23

34
from ydb._grpc.grpcwrapper.ydb_coordination_public_types import (
45
NodeConfig,
56
NodeDescription,
67
ConsistencyMode,
78
RateLimiterCountersMode,
8-
CoordinationClientSettings,
99
)
1010

1111
__all__ = [
@@ -14,5 +14,5 @@
1414
"NodeDescription",
1515
"ConsistencyMode",
1616
"RateLimiterCountersMode",
17-
"CoordinationClientSettings",
17+
"AsyncCoordinationClient",
1818
]
Lines changed: 33 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -1,100 +1,43 @@
1-
import typing
21
from typing import Optional
32

4-
from ydb import _apis, issues
5-
from ydb._grpc.grpcwrapper.ydb_coordination_public_types import NodeConfig, NodeDescription, CoordinationClientSettings
6-
7-
if typing.TYPE_CHECKING:
8-
import ydb
9-
10-
11-
class CoordinationClient:
12-
def __init__(self, driver: "ydb.Driver"):
13-
self._driver = driver
14-
15-
def create_node(
16-
self,
17-
path: str,
18-
config: Optional[NodeConfig] = None,
19-
settings: Optional[CoordinationClientSettings] = None,
20-
):
21-
proto_config = config.to_proto() if config else None
22-
base_driver_settings = settings.to_base_request_settings() if settings is not None else None
23-
request = _apis.ydb_coordination.CreateNodeRequest(
24-
path=path,
25-
config=proto_config,
26-
)
27-
28-
response = self._driver(
29-
request,
30-
_apis.CoordinationService.Stub,
31-
_apis.CoordinationService.CreateNode,
32-
settings=base_driver_settings,
3+
from ydb._grpc.grpcwrapper.ydb_coordination import (
4+
CreateNodeRequest,
5+
DescribeNodeRequest,
6+
AlterNodeRequest,
7+
DropNodeRequest,
8+
)
9+
from ydb._grpc.grpcwrapper.ydb_coordination_public_types import NodeConfig, NodeDescription
10+
from ydb.coordination.base_coordination_client import BaseCoordinationClient
11+
12+
13+
class CoordinationClient(BaseCoordinationClient):
14+
def create_node(self, path: str, config: Optional[NodeConfig], settings=None):
15+
return self._call_create(
16+
CreateNodeRequest(path=path, config=config).to_proto(),
17+
settings=settings,
18+
wrap_args=(self,),
3319
)
34-
issues._process_response(response.operation)
35-
return response
3620

37-
def describe_node(
38-
self,
39-
path: str,
40-
settings: Optional[CoordinationClientSettings] = None,
41-
) -> NodeDescription:
42-
request = _apis.ydb_coordination.DescribeNodeRequest(path=path)
43-
base_driver_settings = settings.to_base_request_settings() if settings is not None else None
44-
response = self._driver(
45-
request,
46-
_apis.CoordinationService.Stub,
47-
_apis.CoordinationService.DescribeNode,
48-
settings=base_driver_settings,
21+
def describe_node(self, path: str, settings=None) -> NodeDescription:
22+
return self._call_describe(
23+
DescribeNodeRequest(path=path).to_proto(),
24+
settings=settings,
25+
wrap_args=(self, path),
4926
)
50-
issues._process_response(response.operation)
51-
52-
result = _apis.ydb_coordination.DescribeNodeResult()
53-
response.operation.result.Unpack(result)
54-
55-
return NodeDescription(
56-
path=path,
57-
config=NodeConfig.from_proto(result.config),
58-
)
59-
60-
def delete_node(
61-
self,
62-
path: str,
63-
settings: Optional[CoordinationClientSettings] = None,
64-
):
65-
base_driver_settings = settings.to_base_request_settings() if settings is not None else None
66-
request = _apis.ydb_coordination.DropNodeRequest(path=path)
67-
response = self._driver(
68-
request,
69-
_apis.CoordinationService.Stub,
70-
_apis.CoordinationService.DropNode,
71-
settings=base_driver_settings,
72-
)
73-
issues._process_response(response.operation)
74-
return response
75-
76-
def alter_node(
77-
self,
78-
path: str,
79-
new_config: NodeConfig,
80-
settings: Optional[CoordinationClientSettings] = None,
81-
):
82-
proto_config = new_config.to_proto() if new_config else None
83-
base_driver_settings = settings.to_base_request_settings() if settings is not None else None
8427

85-
request = _apis.ydb_coordination.AlterNodeRequest(
86-
path=path,
87-
config=proto_config,
28+
def alter_node(self, path: str, new_config: NodeConfig, settings=None):
29+
return self._call_alter(
30+
AlterNodeRequest(path=path, config=new_config).to_proto(),
31+
settings=settings,
32+
wrap_args=(self,),
8833
)
8934

90-
response = self._driver(
91-
request,
92-
_apis.CoordinationService.Stub,
93-
_apis.CoordinationService.AlterNode,
94-
settings=base_driver_settings,
35+
def delete_node(self, path: str, settings=None):
36+
return self._call_delete(
37+
DropNodeRequest(path=path).to_proto(),
38+
settings=settings,
39+
wrap_args=(self,),
9540
)
96-
issues._process_response(response.operation)
97-
return response
9841

99-
def close(self):
100-
pass
42+
def lock(self):
43+
raise NotImplementedError("Will be implemented in future release")
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
from typing import Optional
2+
3+
from ydb._grpc.grpcwrapper.ydb_coordination import (
4+
CreateNodeRequest,
5+
DescribeNodeRequest,
6+
AlterNodeRequest,
7+
DropNodeRequest,
8+
)
9+
from ydb._grpc.grpcwrapper.ydb_coordination_public_types import NodeConfig, NodeDescription
10+
from ydb.coordination.base_coordination_client import BaseCoordinationClient
11+
12+
13+
class AsyncCoordinationClient(BaseCoordinationClient):
14+
async def create_node(self, path: str, config: Optional[NodeConfig] = None, settings=None):
15+
return await self._call_create(
16+
CreateNodeRequest(path=path, config=config).to_proto(),
17+
settings=settings,
18+
wrap_args=(self,),
19+
)
20+
21+
async def describe_node(self, path: str, settings=None) -> NodeDescription:
22+
return await self._call_describe(
23+
DescribeNodeRequest(path=path).to_proto(),
24+
settings=settings,
25+
wrap_args=(self, path),
26+
)
27+
28+
async def alter_node(self, path: str, new_config: NodeConfig, settings=None):
29+
return await self._call_alter(
30+
AlterNodeRequest(path=path, config=new_config).to_proto(),
31+
settings=settings,
32+
wrap_args=(self,),
33+
)
34+
35+
async def delete_node(self, path: str, settings=None):
36+
return await self._call_delete(
37+
DropNodeRequest(path=path).to_proto(),
38+
settings=settings,
39+
wrap_args=(self,),
40+
)
41+
42+
async def lock(self):
43+
raise NotImplementedError("Will be implemented in future release")

0 commit comments

Comments
 (0)