1212import sys
1313import json
1414import base64
15+ import logging
1516from databricks import sql
1617
1718
19+ logging .basicConfig (
20+ level = logging .INFO ,
21+ format = "%(asctime)s - %(levelname)s - %(message)s"
22+ )
23+ logger = logging .getLogger (__name__ )
24+
25+
1826def decode_jwt (token ):
19- """Decode and return the claims from a JWT token."""
27+ """
28+ Decode and return the claims from a JWT token.
29+
30+ Args:
31+ token: The JWT token string
32+
33+ Returns:
34+ dict: The decoded token claims or None if decoding fails
35+ """
2036 try :
2137 parts = token .split ("." )
2238 if len (parts ) != 3 :
@@ -30,72 +46,121 @@ def decode_jwt(token):
3046 decoded = base64 .b64decode (payload )
3147 return json .loads (decoded )
3248 except Exception as e :
33- print (f"Failed to decode token: { str (e )} " )
49+ logger . error (f"Failed to decode token: { str (e )} " )
3450 return None
3551
3652
37- def main ():
38- # Get GitHub OIDC token
53+ def get_environment_variables ():
54+ """
55+ Get required environment variables for the test.
56+
57+ Returns:
58+ tuple: (github_token, host, http_path, identity_federation_client_id)
59+
60+ Raises:
61+ SystemExit: If any required environment variable is missing
62+ """
3963 github_token = os .environ .get ("OIDC_TOKEN" )
4064 if not github_token :
41- print ("GitHub OIDC token not available" )
65+ logger . error ("GitHub OIDC token not available" )
4266 sys .exit (1 )
4367
44- # Get Databricks connection parameters
4568 host = os .environ .get ("DATABRICKS_HOST_FOR_TF" )
4669 http_path = os .environ .get ("DATABRICKS_HTTP_PATH_FOR_TF" )
4770 identity_federation_client_id = os .environ .get ("IDENTITY_FEDERATION_CLIENT_ID" )
4871
4972 if not host or not http_path :
50- print ("Missing Databricks connection parameters" )
73+ logger . error ("Missing Databricks connection parameters" )
5174 sys .exit (1 )
5275
53- # Display token claims for debugging
54- claims = decode_jwt (github_token )
55- if claims :
56- print ("\n === GitHub OIDC Token Claims ===" )
57- print (f"Token issuer: { claims .get ('iss' )} " )
58- print (f"Token subject: { claims .get ('sub' )} " )
59- print (f"Token audience: { claims .get ('aud' )} " )
60- print (f"Token expiration: { claims .get ('exp' , 'unknown' )} " )
61- print (f"Repository: { claims .get ('repository' , 'unknown' )} " )
62- print (f"Workflow ref: { claims .get ('workflow_ref' , 'unknown' )} " )
63- print (f"Event name: { claims .get ('event_name' , 'unknown' )} " )
64- print ("===============================\n " )
65-
66- try :
67- # Connect to Databricks using token federation
68- print (f"=== Testing Connection via Connector ===" )
69- print (f"Connecting to Databricks at { host } { http_path } " )
70- print (f"Using client ID: { identity_federation_client_id } " )
76+ return github_token , host , http_path , identity_federation_client_id
77+
78+
79+ def display_token_info (claims ):
80+ """Display token claims for debugging."""
81+ if not claims :
82+ logger .warning ("No token claims available to display" )
83+ return
7184
72- connection_params = {
73- "server_hostname" : host ,
74- "http_path" : http_path ,
75- "access_token" : github_token ,
76- "auth_type" : "token-federation" ,
77- "identity_federation_client_id" : identity_federation_client_id ,
78- }
85+ logger .info ("=== GitHub OIDC Token Claims ===" )
86+ logger .info (f"Token issuer: { claims .get ('iss' )} " )
87+ logger .info (f"Token subject: { claims .get ('sub' )} " )
88+ logger .info (f"Token audience: { claims .get ('aud' )} " )
89+ logger .info (f"Token expiration: { claims .get ('exp' , 'unknown' )} " )
90+ logger .info (f"Repository: { claims .get ('repository' , 'unknown' )} " )
91+ logger .info (f"Workflow ref: { claims .get ('workflow_ref' , 'unknown' )} " )
92+ logger .info (f"Event name: { claims .get ('event_name' , 'unknown' )} " )
93+ logger .info ("===============================" )
94+
95+
96+ def test_databricks_connection (host , http_path , github_token , identity_federation_client_id ):
97+ """
98+ Test connection to Databricks using token federation.
99+
100+ Args:
101+ host: Databricks host
102+ http_path: Databricks HTTP path
103+ github_token: GitHub OIDC token
104+ identity_federation_client_id: Identity federation client ID
79105
106+ Returns:
107+ bool: True if the test is successful, False otherwise
108+ """
109+ logger .info ("=== Testing Connection via Connector ===" )
110+ logger .info (f"Connecting to Databricks at { host } { http_path } " )
111+ logger .info (f"Using client ID: { identity_federation_client_id } " )
112+
113+ connection_params = {
114+ "server_hostname" : host ,
115+ "http_path" : http_path ,
116+ "access_token" : github_token ,
117+ "auth_type" : "token-federation" ,
118+ "identity_federation_client_id" : identity_federation_client_id ,
119+ }
120+
121+ try :
80122 with sql .connect (** connection_params ) as connection :
81- print ("Connection established successfully" )
123+ logger . info ("Connection established successfully" )
82124
83125 # Execute a simple query
84126 cursor = connection .cursor ()
85127 cursor .execute ("SELECT 1 + 1 as result" )
86128 result = cursor .fetchall ()
87- print (f"Query result: { result [0 ][0 ]} " )
129+ logger . info (f"Query result: { result [0 ][0 ]} " )
88130
89131 # Show current user
90132 cursor .execute ("SELECT current_user() as user" )
91133 result = cursor .fetchall ()
92- print (f"Connected as user: { result [0 ][0 ]} " )
134+ logger . info (f"Connected as user: { result [0 ][0 ]} " )
93135
94- print ("Token federation test successful!" )
136+ logger . info ("Token federation test successful!" )
95137 return True
96138 except Exception as e :
97- print (f"Error connecting to Databricks: { str (e )} " )
98- print ("===================================\n " )
139+ logger .error (f"Error connecting to Databricks: { str (e )} " )
140+ return False
141+
142+
143+ def main ():
144+ """Main entry point for the test script."""
145+ try :
146+ # Get environment variables
147+ github_token , host , http_path , identity_federation_client_id = get_environment_variables ()
148+
149+ # Display token claims
150+ claims = decode_jwt (github_token )
151+ display_token_info (claims )
152+
153+ # Test Databricks connection
154+ success = test_databricks_connection (
155+ host , http_path , github_token , identity_federation_client_id
156+ )
157+
158+ if not success :
159+ logger .error ("Token federation test failed" )
160+ sys .exit (1 )
161+
162+ except Exception as e :
163+ logger .error (f"Unexpected error: { str (e )} " )
99164 sys .exit (1 )
100165
101166
0 commit comments