 .. 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.

Google Cloud Platform SSH Connection
====================================

The SSH connection type provides connection to Compute Engine Instance.
The :class:`~airflow.providers.google.cloud.hooks.compute_ssh.ComputeEngineSSHHook` use it to run
commands on a remote server using :class:`~airflow.providers.ssh.operators.ssh.SSHOperator` or transfer
file from/to the remote server using :class:`~airflow.providers.sftp.operators.sftp.SFTPOperator`.


Configuring the Connection
--------------------------

For authorization to Google Cloud services, this connection should contain a configuration identical to the :doc:`/connections/gcp`.
All parameters for a Google Cloud connection are also valid configuration parameters for this connection.

In addition, additional connection parameters to the instance are supported. It is also possible to pass them
as the parameter of hook constructor, but the connection configuration takes precedence over the parameters
of the hook constructor.

Host (required)
    The Remote host to connect. If it is not passed, it will be detected
    automatically.

Username (optional)
    The Username to connect to the ``remote_host``.

Extra (optional)
    Specify the extra parameters (as json dictionary) that can be used in ssh
    connection. The following parameters are supported in addition to those describing
    the Google Cloud connection.

    * ``extra__google_cloud_platform__instance_name`` - The name of the Compute Engine instance.
    * ``extra__google_cloud_platform__zone`` - The zone of the Compute Engine instance.
    * ``extra__google_cloud_platform__use_internal_ip`` - Whether to connect using internal IP.
    * ``extra__google_cloud_platform__use_iap_tunnel`` - Whether to connect through IAP tunnel.
    * ``extra__google_cloud_platform__use_oslogin`` - Whether to manage keys using OsLogin API. If false,
        keys are managed using instance metadata.
    * ``extra__google_cloud_platform__expire_time`` - The maximum amount of time in seconds before the private key expires.


Environment variable
--------------------

You can also create a connection using an :envvar:`AIRFLOW_CONN_{CONN_ID}` environment variable.

For example:

.. code-block:: bash

    export AIRFLOW_CONN_GOOGLE_CLOUD_SQL_DEFAULT="gcpssh://conn-user@conn-host?\
    extra__google_cloud_platform__instance_name=conn-instance-name&\
    extra__google_cloud_platform__zone=zone&\
    extra__google_cloud_platform__use_internal_ip=True&\
    extra__google_cloud_platform__use_iap_tunnel=True&\
    extra__google_cloud_platform__use_oslogin=False&\
    extra__google_cloud_platform__expire_time=4242"
