from concurrent import futures
import grpc
import pytest
from google.protobuf import empty_pb2, wrappers_pb2
from modelexpress_rl.inference.engines.vllm.startup_probe import (
reconcile_serving_version,
)
def _start_control_server(*, initial="default", accept_update=True):
state = {"version": initial, "updates": []}
def update(request, _context):
state["updates"].append(request.value)
if accept_update:
state["version"] = request.value
return empty_pb2.Empty()
def get(_request, _context):
return wrappers_pb2.StringValue(value=state["version"])
server = grpc.server(futures.ThreadPoolExecutor(max_workers=2))
server.add_generic_rpc_handlers(
(
grpc.method_handlers_generic_handler(
"vllm.Control",
{
"UpdateWeightVersion": grpc.unary_unary_rpc_method_handler(
update,
request_deserializer=wrappers_pb2.StringValue.FromString,
response_serializer=empty_pb2.Empty.SerializeToString,
),
"GetWeightVersion": grpc.unary_unary_rpc_method_handler(
get,
request_deserializer=empty_pb2.Empty.FromString,
response_serializer=wrappers_pb2.StringValue.SerializeToString,
),
},
),
)
)
port = server.add_insecure_port("127.0.0.1:0")
server.start()
return server, f"127.0.0.1:{port}", state
def test_reconcile_serving_version_updates_then_reads_vllm_control():
server, address, state = _start_control_server()
try:
observed = reconcile_serving_version(
address=address,
desired_version_uid="version-7",
)
finally:
server.stop(grace=None).wait()
assert observed == "version-7"
assert state["updates"] == ["version-7"]
def test_reconcile_serving_version_rejects_observed_mismatch():
server, address, _state = _start_control_server(accept_update=False)
try:
with pytest.raises(RuntimeError, match="observed='default'"):
reconcile_serving_version(
address=address,
desired_version_uid="version-7",
)
finally:
server.stop(grace=None).wait()
def test_reconcile_without_desired_version_only_checks_control_readiness():
server, address, state = _start_control_server(initial="default")
try:
observed = reconcile_serving_version(
address=address,
desired_version_uid=None,
)
finally:
server.stop(grace=None).wait()
assert observed == "default"
assert state["updates"] == []