def Check(self, request, context): olds = rpc.deserialize_properties(request.olds, True) news = rpc.deserialize_properties(request.news, True) if news[PROVIDER_KEY] == rpc.UNKNOWN: provider = get_provider(olds) else: provider = get_provider(news) result = provider.check(olds, news) inputs = result.inputs failures = result.failures inputs[PROVIDER_KEY] = news[PROVIDER_KEY] loop = asyncio.new_event_loop() inputs_proto = loop.run_until_complete( rpc.serialize_properties(inputs, {})) loop.close() failures_proto = [ proto.CheckFailure(f.property, f.reason) for f in failures ] fields = {"inputs": inputs_proto, "failures": failures_proto} return proto.CheckResponse(**fields)
async def _call_response(self, result: CallResult): # Note: ret_deps is populated by rpc.serialize_properties. ret_deps: Dict[str, List[pulumi.resource.Resource]] = {} ret = await rpc.serialize_properties(inputs=result.outputs, property_deps=ret_deps) deps: Dict[str, proto.CallResponse.ReturnDependencies] = {} for k, resources in ret_deps.items(): urns = await asyncio.gather(*(r.urn.future() for r in resources)) deps[k] = proto.CallResponse.ReturnDependencies(urns=urns) # Since `return` is a keyword, we need to pass the args to `CallResponse` using a dictionary. resp = { 'return': ret, 'returnDependencies': deps, } if result.failures: resp['failures'] = [ proto.CheckFailure(property=f.property, reason=f.reason) for f in result.failures ] return proto.CallResponse(**resp)