Skip to content

Commit 1b60b9e

Browse files
krithika369Krithika Sundararajan
authored and
Krithika Sundararajan
committed
fix: Missing experiment mappings in standard ensembler config (#351)
* Fix missing experiment mappings in standard ensembler config * Add additional check in the standard ensembler config conversion
1 parent d8dcc01 commit 1b60b9e

File tree

2 files changed

+101
-6
lines changed

2 files changed

+101
-6
lines changed

sdk/tests/router/config/router_ensembler_config_test.py

+98-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import pytest
2+
import turing
23
from turing.generated.exceptions import ApiValueError
34
from turing.router.config.common.env_var import EnvVar
45
from turing.router.config.autoscaling_policy import (
@@ -13,11 +14,11 @@
1314
NopRouterEnsemblerConfig,
1415
PyfuncRouterEnsemblerConfig,
1516
DockerRouterEnsemblerConfig,
17+
EnsemblerStandardConfig,
1618
StandardRouterEnsemblerConfig,
1719
InvalidExperimentMappingException,
1820
)
1921

20-
2122
@pytest.mark.parametrize(
2223
"id,type,standard_config,docker_config,expected",
2324
[
@@ -544,6 +545,102 @@ def test_create_nop_router_ensembler_config_with_invalid_route(
544545
with pytest.raises(expected):
545546
router.to_open_api()
546547

548+
@pytest.mark.parametrize(
549+
"ensembler_type,config,expected",
550+
[
551+
pytest.param(
552+
"nop",
553+
"nop_router_ensembler_config",
554+
{
555+
"nop_config": EnsemblerNopConfig(final_response_route_id="test"),
556+
"type": "nop"
557+
},
558+
),
559+
pytest.param(
560+
"standard",
561+
"standard_router_ensembler_config_with_experiment_mappings",
562+
{
563+
"standard_config": EnsemblerStandardConfig(
564+
fallback_response_route_id="route-1",
565+
experiment_mappings=[
566+
turing.generated.models.EnsemblerStandardConfigExperimentMappings(
567+
experiment="experiment-1", route="route-1", treatment="treatment-1",
568+
),
569+
turing.generated.models.EnsemblerStandardConfigExperimentMappings(
570+
experiment="experiment-2", route="route-2", treatment="treatment-2",
571+
),
572+
],
573+
route_name_path=None,
574+
lazy_routing=False,
575+
),
576+
"type": "standard"
577+
},
578+
),
579+
pytest.param(
580+
"standard",
581+
"standard_router_ensembler_config_with_route_name_path",
582+
{
583+
"standard_config": EnsemblerStandardConfig(
584+
fallback_response_route_id="route-1",
585+
experiment_mappings=None,
586+
route_name_path="route_name",
587+
lazy_routing=False,
588+
),
589+
"type": "standard"
590+
},
591+
),
592+
pytest.param(
593+
"docker",
594+
"generic_ensembler_docker_config",
595+
{
596+
"docker_config": turing.generated.models.EnsemblerDockerConfig(
597+
autoscaling_policy=turing.generated.models.AutoscalingPolicy(metric="memory", target="80"),
598+
endpoint="http://localhost:5000/ensembler_endpoint",
599+
env=[turing.generated.models.EnvVar(name="env_name", value="env_val")],
600+
image="test.io/just-a-test/turing-ensembler:0.0.0-build.0",
601+
port=5120,
602+
resource_request=turing.generated.models.ResourceRequest(
603+
cpu_request="100m", max_replica=3,
604+
memory_request="512Mi", min_replica=1,
605+
),
606+
service_account="secret-name-for-google-service-account",
607+
timeout="500ms"
608+
),
609+
"type": "docker"
610+
},
611+
),
612+
pytest.param(
613+
"pyfunc",
614+
"generic_ensembler_pyfunc_config",
615+
{
616+
"pyfunc_config": turing.generated.models.EnsemblerPyfuncConfig(
617+
autoscaling_policy=turing.generated.models.AutoscalingPolicy(metric="concurrency", target="10"),
618+
ensembler_id=11,
619+
env=[turing.generated.models.EnvVar(name="env_name", value="env_val")],
620+
project_id=77,
621+
resource_request=turing.generated.models.ResourceRequest(
622+
cpu_request="100m", max_replica=3,
623+
memory_request="512Mi",min_replica=1,
624+
),
625+
timeout="500ms"
626+
),
627+
"type": "pyfunc"
628+
},
629+
),
630+
],
631+
)
632+
def test_create_base_ensembler(ensembler_type, config, expected, request):
633+
config_data = request.getfixturevalue(config)
634+
ensembler_config = None
635+
if ensembler_type == "nop":
636+
ensembler_config = RouterEnsemblerConfig(type=ensembler_type, nop_config=config_data)
637+
elif ensembler_type == "standard":
638+
ensembler_config = RouterEnsemblerConfig(type=ensembler_type, standard_config=config_data)
639+
elif ensembler_type == "docker":
640+
ensembler_config = RouterEnsemblerConfig(type=ensembler_type, docker_config=config_data)
641+
elif ensembler_type == "pyfunc":
642+
ensembler_config = RouterEnsemblerConfig(type=ensembler_type, pyfunc_config=config_data)
643+
assert ensembler_config.to_dict() == expected
547644

548645
@pytest.mark.parametrize(
549646
"cls,config,expected",

sdk/turing/router/config/router_ensembler_config.py

+3-5
Original file line numberDiff line numberDiff line change
@@ -160,16 +160,14 @@ def standard_config(self, standard_config: Union[EnsemblerStandardConfig, Dict])
160160
self._standard_config = standard_config
161161
elif isinstance(standard_config, dict):
162162
openapi_standard_config = standard_config.copy()
163-
openapi_standard_config["experiment_mappings"] = (
164-
[
163+
openapi_standard_config["experiment_mappings"] = None
164+
if "experiment_mappings" in standard_config and standard_config["experiment_mappings"] is not None:
165+
openapi_standard_config["experiment_mappings"] = [
165166
turing.generated.models.EnsemblerStandardConfigExperimentMappings(
166167
**mapping
167168
)
168169
for mapping in standard_config["experiment_mappings"]
169170
]
170-
if openapi_standard_config is None
171-
else None
172-
)
173171
self._standard_config = EnsemblerStandardConfig(**openapi_standard_config)
174172
else:
175173
self._standard_config = standard_config

0 commit comments

Comments
 (0)