 .. Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

 ..   http://www.apache.org/licenses/LICENSE-2.0

 .. Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.



gRPC
~~~~~~~~~~~~~~~~~~~~~

The gRPC connection type enables integrated connection to a gRPC service

Authenticating to gRPC
'''''''''''''''''''''''

There are several ways to connect to gRPC service using Airflow.

1. Using ``NO_AUTH`` mode, simply setup an insecure channel of connection.
2. Using ``SSL`` or ``TLS`` mode, supply a credential pem file for the connection id,
   this will setup SSL or TLS secured connection with gRPC service.
3. Using ``JWT_GOOGLE`` mode. It is using google auth default credentials by default,
   further use case of getting credentials from service account can be add later on.
4. Using ``OATH_GOOGLE`` mode. Scopes are required in the extra field, can be setup in the UI.
   It is using google auth default credentials by default,
   further use case of getting credentials from service account can be add later on.
5. Using ``CUSTOM`` mode. For this type of connection, you can pass in a connection
   function takes in the connection object and return a gRPC channel and supply whatever
   authentication type you want.

Default Connection IDs
''''''''''''''''''''''

The following connection IDs are used by default.

``grpc_default``
    Used by the :class:`~airflow.contrib.hooks.grpc_hook.GrpcHook`
    hook.

Configuring the Connection
''''''''''''''''''''''''''

Host
    The host url of the gRPC server

Port (Optional)
    The port to connect to on gRPC server

Auth Type
    Authentication type of the gRPC connection.
    ``NO_AUTH`` by default, possible values are
    ``NO_AUTH``, ``SSL``, ``TLS``, ``JWT_GOOGLE``,
    ``OATH_GOOGLE``, ``CUSTOM``

Credential Pem File (Optional)
    Pem file that contains credentials for
    ``SSL`` and ``TLS`` type auth
    Not required for other types.

Scopes (comma separated) (Optional)
    A list of comma-separated `Google Cloud scopes
    <https://developers.google.com/identity/protocols/googlescopes>`_ to
    authenticate with.
    Only for ``OATH_GOOGLE`` type connection
