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



.. _howto/connection:tableau:

Tableau Connection
==================

The Tableau connection type enables the Tableau Integrations.

Authenticating to Tableau
-------------------------

There are two ways to connect to Tableau using Airflow.

1. Use `Password and Username Authentication
   <https://tableau.github.io/server-client-python/docs/api-ref#tableauauth-class>`_
   i.e. add a ``password`` and ``login`` to the Airflow connection.
2. Use a `Token Authentication
   <https://tableau.github.io/server-client-python/docs/api-ref#personalaccesstokenauth-class>`_
   i.e. add a ``token_name`` and ``personal_access_token`` to the Airflow connection (deprecated).

Authentication by personal token was deprecated as Tableau automatically invalidates opened
personal token connection if one or more parallel connections with the same token are opened.
So, in the environments with multiple parallel tasks this authentication method can lead to numerous bugs
and all the jobs will not run as they intended. Therefore, personal token auth option
is considered harmful until the logic of Tableau server client changes.

Only one authorization method can be used at a time. If you need to manage multiple credentials or keys then you should
configure multiple connections.

Default Connection IDs
----------------------

All hooks and operators related to Tableau use ``tableau_default`` by default.

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

Login (optional)
    Specify the tableau username used for the initial connection. Used with password authentication.

Password (optional)
    Specify the tableau password used for the initial connection.
    Used with password authentication.

Host
    Specify the `Sever URL
    <https://tableau.github.io/server-client-python/docs/api-ref#server>`_ used for Tableau.

Extra (optional)
    Specify the extra parameters (as json dictionary) that can be used in Azure connection.
    The following parameters are all optional:

    * ``site_id``: This corresponds to the contentUrl attribute in the Tableau REST API. The ``site_id`` is the portion of
      the URL that follows the /site/ in the URL. For example, “MarketingTeam” is the ``site_id`` in the following URL
      MyServer/#/site/MarketingTeam/projects. To specify the default site on Tableau Server, you can use an empty string
      '' (single quotes, no space). For Tableau Online, you must provide a value for the ``site_id.``
      This is used for both token and password Authentication.
    * ``token_name``: The personal access token name.
      This is used with token authentication.
    * ``personal_access_token``: The personal access token value.
      This is used with token authentication.
    * ``verify``: Either a boolean, in which case it controls whether we verify the server’s TLS certificate, or a string, in which case it must be a path to a CA bundle to use. Defaults to True.
    * ``cert``: if String, path to ssl client cert file (.pem). If Tuple, (‘cert’, ‘key’) pair.


When specifying the connection in environment variable you should specify
it using URI syntax.

Note that all components of the URI should be URL-encoded.

For example:

.. code-block:: bash

   export AIRFLOW_CONN_TABLEAU_DEFAULT='tableau://username:password@https%3A%2F%2FMY-SERVER%2F?site_id=example-id'
