Skip to content

docs: expand update_connection_auth sample header for Snowflake keypair - #1844

Open
jacalata wants to merge 5 commits into
tableau:developmentfrom
jacalata:jac/samples-keypair-conversion
Open

docs: expand update_connection_auth sample header for Snowflake keypair#1844
jacalata wants to merge 5 commits into
tableau:developmentfrom
jacalata:jac/samples-keypair-conversion

Conversation

@jacalata

@jacalata jacalata commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Closes #1602.

Motivation

#1602 asked for an end-to-end example of converting a Tableau Cloud
datasource or workbook connection from Snowflake username/password auth
to keypair auth. The existing update_connection_auth.py already runs
the right code path -- it takes authentication_type as an arg and
sets embed_password=True. What it was missing was context: which
authentication_type strings are common, and the pre-saved-credential
prerequisite that applies to any embed_password conversion.

Initial draft of this PR added a dedicated keypair sample; folded that
into a header-comment update on update_connection_auth.py after
noticing the code duplication. See 949d602 for the fold-in.

Behavior change

Samples only -- no library changes. Adds a ~25-line header comment to
samples/update_connection_auth.py:

  • Lists common authentication_type values including auth-keypair,
    oauth, AD Service Principal, sqlserver, and Username Password
  • Explains that embed_password=True binds the connection to a
    matching pre-saved credential on the site, looked up by
    (username, connection class, role)
  • Spells out the Snowflake-keypair prerequisite: the private key must
    be saved on the site under Site Settings -> Saved Credentials for
    Data Sources before the sample runs. Without it, the update writes
    the new auth type into metadata but subsequent extract refreshes
    and connection tests fail.
  • Notes REST API version support (v3.27 for datasource/workbook
    connections, v3.28 for flows)

Test plan

Docs-only change to a sample; no automated tests exist for samples/.

  • python samples/update_connection_auth.py --help still shows the
    same args (help output unchanged)
  • Manual: against a Tableau Cloud site with a pre-saved Snowflake
    private-key credential, run the sample with
    authentication_type=auth-keypair; connection's auth_type flips
    and extract refresh succeeds
  • Manual: without pre-saved credentials, connection test fails
    post-update as documented

🤖 Generated with Claude Code

Adds samples/update_connection_to_keypair.py demonstrating how to
convert an existing Tableau Cloud datasource or workbook connection
from username/password to Snowflake keypair authentication using the
REST API v3.27 flow. Documents the prerequisite that the private key
must first be saved under Site Settings -> Saved Credentials for Data
Sources on the site.

Refs tableau#1602

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
jacalata and others added 2 commits August 8, 2026 02:56
The prior comment said embed_password=True "tells the server to use the
pre-saved credential" which was vague. Server code (RestApiAppService
updateConnectionImpl -> embedOAuthUserKeychainConnections) looks up the
credential by (dbClass, username, role, auth) and binds it to the
connection; without that pre-saved match, the update still writes
'auth-keypair' into metadata but subsequent extract refreshes fail.
Spell that out so a copy-paste reader knows what "pre-saved" actually
requires.

Also add a note that flow connections gained the same capability in
REST API v3.28 (datasources and workbook connections were v3.27).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
update_connection_auth.py already covers exactly this workflow (change
a connection's auth_type + credentials via the update-connection
endpoint). The prior keypair-specific sample added no new code path --
only Snowflake-keypair context that belongs in the shared sample's
header.

Delete the dedicated keypair sample; expand update_connection_auth's
header comment to list common authentication_type values (including
auth-keypair) and to spell out the pre-saved-credential prerequisite
that applies to any embed_password=True conversion.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@jacalata jacalata changed the title feat: add sample for converting connection auth to Snowflake keypair docs: expand update_connection_auth sample header for Snowflake keypair Aug 8, 2026
@jacalata
jacalata requested a lite review from Copilot August 17, 2026 20:02

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR aims to improve guidance for converting Tableau Cloud content connections from Snowflake username/password authentication to Snowflake keypair authentication, addressing the request in #1602 with an end-to-end example.

Changes:

  • Adds a new sample script that updates a datasource/workbook connection to auth-keypair and sets embed_password=True.
  • Documents prerequisites and version support within the sample’s header comments.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread samples/update_connection_to_keypair.py Outdated
Comment thread samples/update_connection_to_keypair.py Outdated
Comment thread samples/update_connection_to_keypair.py Outdated
Comment thread samples/update_connection_to_keypair.py Outdated
jacalata and others added 2 commits August 18, 2026 02:31
…ST ref

Round-1 review of update_connection_auth.py header caught three real
inaccuracies and one missing security note:

- "Username Password" was not the wire value; it's "UsernamePassword"
  (confirmed against test/assets/datasource_connections_update_no_auth.xml,
  test/assets/workbook_update_connections_no_auth.xml, and the
  UsernamePassword assertions in test_datasource.py and test_workbook.py).
- "oauth" had no grep-able backing as an authentication_type wire value
  on this endpoint. Dropped.
- "sqlserver" is a connection type (type=), not an authentication_type
  wire value. Dropped.
- v3.27 (datasource/workbook) and v3.28 (flow) version claim had no
  code backing -- @api decorators on update_connection are 2.3 for
  datasource/workbook and 3.3 for flow. Dropped rather than restating.
- Added a SECURITY callout: datasource_password is a positional CLI
  argument, so private-key material passed there leaks to shell
  history, ps output, and audit logs.
- Added the workbooks_and_views REST reference alongside the
  data-sources one; this sample updates both.
- Softened the credential lookup-key description ("attributes
  including..." instead of asserting a specific tuple).

Docs-only. samples/update_connection_auth.py parses cleanly.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The prior list included "UsernamePassword" (one word) as a canonical
value. Grepping the monolith source of truth shows that string is
not a valid authentication_type -- it does not appear in
codegen/constants.data, in the connection.authentication values that
Tableau Desktop writes into .tds/.twb, or in the REST reference docs.
It is only present in TSC's hand-authored test fixtures, where it
survives round-trip tests because TSC doesn't validate the string --
so a sample-user who copies it and posts to a real server hits an
unhelpful rejection.

Replaced with the actual documented set from codegen/constants.data
and the public REST reference:

  - auth-user-pass      (canonical username+password)
  - username-password   (SAP HANA / Sybase ASE / NetWeaver / Denodo / Salesforce)
  - auth-keypair        (Snowflake keypair)
  - oauth
  - auth-none
  - AD Service Principal
  - Azure AD Password

TSC's `UsernamePassword` test fixtures are a separate follow-up --
they don't break tests, but they steer future readers wrong.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Key pair authentication while publishing to Cloud from onprem using Tableau SDK

2 participants