Skip to content
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import grpc
from google.protobuf.json_format import MessageToDict
from google.protobuf.struct_pb2 import Struct
from grpc import StatusCode

from openfeature.evaluation_context import EvaluationContext
from openfeature.event import ProviderEventDetails
Expand Down Expand Up @@ -210,6 +210,23 @@ def _create_request_args(self) -> dict:

return request_args

def _fetch_metadata(self) -> dict:
if self.config.sync_metadata_disabled:
return {}

context_values_request = sync_pb2.GetMetadataRequest()
try:
context_values_response = self.stub.GetMetadata(
context_values_request, wait_for_ready=True
)
return MessageToDict(context_values_response)
except grpc.RpcError as e:
if e.code() == StatusCode.UNIMPLEMENTED:
logger.debug("Metadata endpoint disabled")
return {}
else:
raise e

def listen(self) -> None:
call_args = (
{"timeout": self.streamline_deadline_seconds}
Expand All @@ -220,18 +237,7 @@ def listen(self) -> None:

while self.active:
try:
context_values_response: sync_pb2.GetMetadataResponse
if self.config.sync_metadata_disabled:
context_values_response = sync_pb2.GetMetadataResponse(
metadata=Struct()
)
else:
context_values_request = sync_pb2.GetMetadataRequest()
context_values_response = self.stub.GetMetadata(
context_values_request, wait_for_ready=True
)

context_values = MessageToDict(context_values_response)
context_values = self._fetch_metadata()["metadata"]

request = sync_pb2.SyncFlagsRequest(**request_args)

Expand All @@ -245,12 +251,15 @@ def listen(self) -> None:
)
self.flag_store.update(json.loads(flag_str))

if flag_rsp.sync_context:
context_values = MessageToDict(flag_rsp.sync_context)

if not self.connected:
self.emit_provider_ready(
ProviderEventDetails(
message="gRPC sync connection established"
),
context_values["metadata"],
context_values,
)
self.connected = True

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ class TestProviderType(Enum):
SSL = "ssl"
SOCKET = "socket"
METADATA = "metadata"
SYNCPAYLOAD = "syncpayload"


@given("a provider is registered", target_fixture="client")
Expand Down Expand Up @@ -71,6 +72,8 @@ def get_default_options_for_provider(
return options, True
elif t == TestProviderType.METADATA:
launchpad = "metadata"
elif t == TestProviderType.SYNCPAYLOAD:
launchpad = "sync-payload"

if resolver_type == ResolverType.FILE:
if "selector" in option_values:
Expand Down
Loading