Yes, the "method not found" issue was unrelated. That metadata_client.py 
example was very helpful and is exactly what I needed; my code now works 
perfectly. Thank you for your help!

On Sunday, February 28, 2021 at 5:46:36 PM UTC-5 [email protected] wrote:

> Okay so the "method not found" error is unrelated to missing 
> call-credentials and you fixed it by fixing the proto file I assume.
>
> I thought this doc 
> <https://github.com/grpc/grpc/tree/master/examples/python/auth#authmetadataplugin-manipulate-metadata-for-each-call>
>  might 
> be very helpful to describe how to plumb the plugin. For how to add 
> metadata (i.e. the headers in your gRPC call) this 
> https://github.com/grpc/grpc/tree/master/examples/python/metadata  - 
> specifically 
> https://github.com/grpc/grpc/blob/master/examples/python/metadata/metadata_client.py
>  
> might be helpful?
>
> On Sun, Feb 28, 2021 at 2:40 PM James Telzrow <[email protected]> wrote:
>
>> I refactored my .proto file to resolve the "Method not found" error. Now, 
>> this code:
>>
>> def runFunc():
>>      channel = grpc.insecure_channel('192.168.0.69:9998')
>>      stub = grpc_pb2_grpc.GetVersionStub(channel)
>>      response = stub.GetVersion(grpc_pb2.GetVersionRequest())
>>      print(response.version)
>>
>> gives me the following error:
>>
>> "grpc_message":"missing 'password' rpc header value","grpc_status":16
>>
>> I know exactly what the problem is. As you can see in 
>> PasswordCallCredentials in the working example Java implementation above, 
>> "password" and passwordValue are being added to the header of each request. 
>> My code is not doing that, and I am completely at a loss as to how to do so.
>>
>> Can someone help me?
>> On Sunday, February 28, 2021 at 3:55:21 PM UTC-5 James Telzrow wrote:
>>
>>> If this is the case and that functionality (and/or the functionality to 
>>> specially authenticate requests as in the Java code above) simply isn't 
>>> available in the gRPC Python API, might I have to create a sort of 
>>> "intermediary" in Java, that is a client to my final destination and a 
>>> server to my Python script, that listens for requests from my Python 
>>> script, sends the equivalent but properly authenticated request to the 
>>> server, and then returns back the results?
>>>
>>> And if you doubt the "Method not found" error is because of missing 
>>> CallCredentials, what else do you think it may be?
>>>
>>> On Sunday, February 28, 2021 at 1:14:33 PM UTC-5 [email protected] 
>>> wrote:
>>>
>>>> This one 
>>>> https://grpc.github.io/grpc/python/_modules/grpc.html#metadata_call_credentials
>>>>  
>>>> talks about metadata call credentials which seems to be similar to what 
>>>> the 
>>>> Java client is doing. Examples of authMetadataPlugin are available at 
>>>> https://www.programcreek.com/python/example/113599/grpc.AuthMetadataPlugin
>>>>
>>>> Although I doubt the error "Method not found: GetVersion/GetVersion" is 
>>>> because of missing CallCredentials.
>>>>
>>>>
>>>>
>>>> On Sun, Feb 28, 2021 at 9:35 AM James Telzrow <[email protected]> 
>>>> wrote:
>>>>
>>>>> Hello,
>>>>>
>>>>> I am continuously getting the following error when making a gRPC call:
>>>>>
>>>>> grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that 
>>>>> terminated with:
>>>>> status = StatusCode.UNIMPLEMENTED
>>>>> details = "Method not found: GetVersion/GetVersion"
>>>>> debug_error_string = 
>>>>> "{"created":"@1614530914.104036000","description":"Error received from 
>>>>> peer 
>>>>> ipv4:192.168.0.69:9998","file":"src/core/lib/surface/call.cc","file_line":1068,"grpc_message":"Method
>>>>>  
>>>>> not found: GetVersion/GetVersion","grpc_status":12}"
>>>>>
>>>>> I am making the call using this bit of Python code:
>>>>>
>>>>> def runFunc():
>>>>>      channel = grpc.insecure_channel('192.168.0.69:9998')
>>>>>      stub = grpcBisq_pb2_grpc.GetVersionStub(channel)
>>>>>      response = stub.GetVersion(grpcBisq_pb2.GetVersionRequest())
>>>>>      print(response.version)
>>>>>
>>>>> However, I know that the server has a GetVersion gRPC service with a 
>>>>> GetVersion endpoint that takes a GetVersionRequest, since both the client 
>>>>> and server have the following in their .proto file:
>>>>>
>>>>> service GetVersion {
>>>>>     rpc GetVersion (GetVersionRequest) returns (GetVersionReply) {
>>>>> }
>>>>> }
>>>>> message GetVersionRequest {
>>>>> }
>>>>> message GetVersionReply {
>>>>>      string version = 1;
>>>>> }
>>>>>
>>>>> The server is written in Java (and wasn't written by me) and I wrote 
>>>>> my client in Python. However, the server has an example client (also 
>>>>> written in Java) that uses some sort of authentication scheme, and as of 
>>>>> now my Python client isn't using any type of authentication. I'm guessing 
>>>>> this is what is causing the server to return the above error. In that 
>>>>> Java 
>>>>> client, the stub is created as follows:
>>>>>
>>>>> public final class GrpcStubs {
>>>>>      public final GetVersionGrpc.GetVersionBlockingStub versionService;
>>>>>      public GrpcStubs(String apiHost, int apiPort, String apiPassword) 
>>>>> {
>>>>>           CallCredentials credentials = new 
>>>>> PasswordCallCredentials(apiPassword);
>>>>>           var channel = ManagedChannelBuilder.forAddress(apiHost, 
>>>>> apiPort).usePlaintext().build();
>>>>>           Runtime.getRuntime().addShutdownHook(new Thread(() -> {
>>>>>                try {
>>>>>                     channel.shutdown().awaitTermination(1, SECONDS);
>>>>>                } catch (InterruptedException ex) {
>>>>>                     throw new IllegalStateException(ex);
>>>>>                }
>>>>>           }));
>>>>>           this.versionService 
>>>>> = 
>>>>> GetVersionGrpc.newBlockingStub(channel).withCallCredentials(credentials);
>>>>>      }
>>>>> }
>>>>>
>>>>> PasswordCallCredentials is defined in PasswordCallCredentials.java as 
>>>>> follows:
>>>>>
>>>>> /**
>>>>> * Sets the {@value PASSWORD_KEY} rpc call header to a given value.
>>>>> */
>>>>> class PasswordCallCredentials extends CallCredentials {
>>>>>      public static final String PASSWORD_KEY = "password";
>>>>>      private final String passwordValue;
>>>>>      public PasswordCallCredentials(String passwordValue) {
>>>>>           if (passwordValue == null)
>>>>>                throw new IllegalArgumentException(format("'%s' value 
>>>>> must not be null", PASSWORD_KEY));
>>>>>           this.passwordValue = passwordValue;
>>>>>      }
>>>>>      @Override
>>>>>      public void applyRequestMetadata(RequestInfo requestInfo, 
>>>>> Executor appExecutor, MetadataApplier metadataApplier) {
>>>>>           appExecutor.execute(() -> {
>>>>>                try {
>>>>>                     var headers = new Metadata();
>>>>>                     var passwordKey = Key.of(PASSWORD_KEY, 
>>>>> ASCII_STRING_MARSHALLER);
>>>>>                     headers.put(passwordKey, passwordValue);
>>>>>                     metadataApplier.apply(headers);
>>>>>                } catch (Throwable ex) {
>>>>>                     
>>>>> metadataApplier.fail(UNAUTHENTICATED.withCause(ex));
>>>>>                }
>>>>>            });
>>>>>      }
>>>>>      @Override
>>>>>      public void thisUsesUnstableApi() {
>>>>>      }
>>>>> }
>>>>>
>>>>> If I understand correctly, PasswordCallCredentials is subclassing 
>>>>> CallCredentials, and when called, it causes the key-value pair "password: 
>>>>> {apiPasswordHere}" to be placed in the header of every gRPC request. If 
>>>>> my 
>>>>> understanding is wrong, please correct me.
>>>>>
>>>>> I have tested the Java client, and it works perfectly.
>>>>>
>>>>> Unfortunately, even after thoroughly searching through the 
>>>>> documentation, I do not understand how to implement this in Python. I 
>>>>> know 
>>>>> I need to create a grpc.secure_channel and pass a ChannelCredentials 
>>>>> object, but I'm not sure how to proceed from there. Can someone help me?
>>>>>
>>>>> -- 
>>>>> You received this message because you are subscribed to the Google 
>>>>> Groups "grpc.io" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>>> an email to [email protected].
>>>>> To view this discussion on the web visit 
>>>>> https://groups.google.com/d/msgid/grpc-io/eec9603c-2dc5-45a4-bfd1-f0d5ef796059n%40googlegroups.com
>>>>>  
>>>>> <https://groups.google.com/d/msgid/grpc-io/eec9603c-2dc5-45a4-bfd1-f0d5ef796059n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>> .
>>>>>
>>>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "grpc.io" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected].
>>
> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/grpc-io/738d59de-08f2-41a8-ba7e-11759bdccadbn%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/grpc-io/738d59de-08f2-41a8-ba7e-11759bdccadbn%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/grpc-io/28f99cfa-db2e-4cb3-8048-199b6645d7a0n%40googlegroups.com.

Reply via email to