Skip to content

Commit 1897ff5

Browse files
sfc-gh-pmansoursfc-gh-pczajka
authored andcommitted
Update WIF integration tests to verify authenticated username + prepare for impersonation (#2510)
1 parent d7bdbc4 commit 1897ff5

File tree

3 files changed

+47
-11
lines changed

3 files changed

+47
-11
lines changed

ci/test_wif.sh

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,11 @@ run_tests_and_set_result() {
1212
local host="$2"
1313
local snowflake_host="$3"
1414
local rsa_key_path="$4"
15+
local snowflake_user="$5"
16+
local impersonation_path="$6"
17+
local snowflake_user_for_impersonation="$7"
1518

16-
ssh -i "$rsa_key_path" -o IdentitiesOnly=yes -p 443 "$host" env BRANCH="$BRANCH" SNOWFLAKE_TEST_WIF_HOST="$snowflake_host" SNOWFLAKE_TEST_WIF_PROVIDER="$provider" SNOWFLAKE_TEST_WIF_ACCOUNT="$SNOWFLAKE_TEST_WIF_ACCOUNT" bash << EOF
19+
ssh -i "$rsa_key_path" -o IdentitiesOnly=yes -p 443 "$host" env BRANCH="$BRANCH" SNOWFLAKE_TEST_WIF_HOST="$snowflake_host" SNOWFLAKE_TEST_WIF_PROVIDER="$provider" SNOWFLAKE_TEST_WIF_ACCOUNT="$SNOWFLAKE_TEST_WIF_ACCOUNT" SNOWFLAKE_TEST_WIF_USERNAME="$snowflake_user" SNOWFLAKE_TEST_WIF_IMPERSONATION_PATH="$impersonation_path" SNOWFLAKE_TEST_WIF_USERNAME_IMPERSONATION="$snowflake_user_for_impersonation" bash << EOF
1720
set -e
1821
set -o pipefail
1922
docker run \
@@ -22,6 +25,9 @@ run_tests_and_set_result() {
2225
-e SNOWFLAKE_TEST_WIF_PROVIDER \
2326
-e SNOWFLAKE_TEST_WIF_HOST \
2427
-e SNOWFLAKE_TEST_WIF_ACCOUNT \
28+
-e SNOWFLAKE_TEST_WIF_USERNAME \
29+
-e SNOWFLAKE_TEST_WIF_IMPERSONATION_PATH \
30+
-e SNOWFLAKE_TEST_WIF_USERNAME_IMPERSONATION \
2531
snowflakedb/client-python-test:1 \
2632
bash -c "
2733
echo 'Running tests on branch: \$BRANCH'
@@ -71,9 +77,9 @@ setup_parameters
7177
# Run tests for all cloud providers
7278
EXIT_STATUS=0
7379
set +e # Don't exit on first failure
74-
run_tests_and_set_result "AZURE" "$HOST_AZURE" "$SNOWFLAKE_TEST_WIF_HOST_AZURE" "$RSA_KEY_PATH_AWS_AZURE"
75-
run_tests_and_set_result "AWS" "$HOST_AWS" "$SNOWFLAKE_TEST_WIF_HOST_AWS" "$RSA_KEY_PATH_AWS_AZURE"
76-
run_tests_and_set_result "GCP" "$HOST_GCP" "$SNOWFLAKE_TEST_WIF_HOST_GCP" "$RSA_KEY_PATH_GCP"
80+
run_tests_and_set_result "AZURE" "$HOST_AZURE" "$SNOWFLAKE_TEST_WIF_HOST_AZURE" "$RSA_KEY_PATH_AWS_AZURE" "$SNOWFLAKE_TEST_WIF_USERNAME_AZURE" "$SNOWFLAKE_TEST_WIF_IMPERSONATION_PATH_AZURE" "$SNOWFLAKE_TEST_WIF_USERNAME_AZURE_IMPERSONATION"
81+
run_tests_and_set_result "AWS" "$HOST_AWS" "$SNOWFLAKE_TEST_WIF_HOST_AWS" "$RSA_KEY_PATH_AWS_AZURE" "$SNOWFLAKE_TEST_WIF_USERNAME_AWS" "$SNOWFLAKE_TEST_WIF_IMPERSONATION_PATH_AWS" "$SNOWFLAKE_TEST_WIF_USERNAME_AWS_IMPERSONATION"
82+
run_tests_and_set_result "GCP" "$HOST_GCP" "$SNOWFLAKE_TEST_WIF_HOST_GCP" "$RSA_KEY_PATH_GCP" "$SNOWFLAKE_TEST_WIF_USERNAME_GCP" "$SNOWFLAKE_TEST_WIF_IMPERSONATION_PATH_GCP" "$SNOWFLAKE_TEST_WIF_USERNAME_GCP_IMPERSONATION"
7783
set -e # Re-enable exit on error
7884
echo "Exit status: $EXIT_STATUS"
7985
exit $EXIT_STATUS
177 Bytes
Binary file not shown.

test/wif/test_wif.py

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222
ACCOUNT = os.getenv("SNOWFLAKE_TEST_WIF_ACCOUNT")
2323
HOST = os.getenv("SNOWFLAKE_TEST_WIF_HOST")
2424
PROVIDER = os.getenv("SNOWFLAKE_TEST_WIF_PROVIDER")
25+
EXPECTED_USERNAME = os.getenv("SNOWFLAKE_TEST_WIF_USERNAME")
26+
IMPERSONATION_PATH = os.getenv("SNOWFLAKE_TEST_WIF_IMPERSONATION_PATH")
27+
EXPECTED_USERNAME_IMPERSONATION = os.getenv("SNOWFLAKE_TEST_WIF_USERNAME_IMPERSONATION")
2528

2629

2730
@pytest.mark.wif
@@ -33,8 +36,8 @@ def test_wif_defined_provider():
3336
"workload_identity_provider": PROVIDER,
3437
}
3538
assert connect_and_execute_simple_query(
36-
connection_params
37-
), "Failed to connect with using WIF - automatic provider detection"
39+
connection_params, EXPECTED_USERNAME
40+
), f"Failed to connect with using WIF using provider {PROVIDER}"
3841

3942

4043
@pytest.mark.wif
@@ -51,21 +54,48 @@ def test_should_authenticate_using_oidc():
5154
}
5255

5356
assert connect_and_execute_simple_query(
54-
connection_params
57+
connection_params, expected_user=None
5558
), "Failed to connect using WIF with OIDC provider"
5659

5760

61+
@pytest.mark.wif
62+
@pytest.mark.skip("Impersonation is still being developed")
63+
def test_should_authenticate_with_impersonation():
64+
if not isinstance(IMPERSONATION_PATH, str) or not IMPERSONATION_PATH:
65+
pytest.skip("Skipping test - IMPERSONATION_PATH is not set")
66+
67+
logger.debug(f"Using impersonation path: {IMPERSONATION_PATH}")
68+
impersonation_path_list = IMPERSONATION_PATH.split(",")
69+
70+
connection_params = {
71+
"host": HOST,
72+
"account": ACCOUNT,
73+
"authenticator": "WORKLOAD_IDENTITY",
74+
"workload_identity_provider": PROVIDER,
75+
"workload_identity_impersonation_path": impersonation_path_list,
76+
}
77+
78+
assert connect_and_execute_simple_query(
79+
connection_params, EXPECTED_USERNAME_IMPERSONATION
80+
), f"Failed to connect using WIF with provider {PROVIDER}"
81+
82+
5883
def is_provider_gcp() -> bool:
5984
return PROVIDER == "GCP"
6085

6186

62-
def connect_and_execute_simple_query(connection_params) -> bool:
87+
def connect_and_execute_simple_query(connection_params, expected_user=None) -> bool:
6388
try:
6489
logger.info("Trying to connect to Snowflake")
6590
with snowflake.connector.connect(**connection_params) as con:
66-
result = con.cursor().execute("select 1;")
67-
logger.debug(result.fetchall())
68-
logger.info("Successfully connected to Snowflake")
91+
result = con.cursor().execute("select current_user();")
92+
(user,) = result.fetchone()
93+
logger.debug(user)
94+
if expected_user:
95+
assert (
96+
expected_user == user
97+
), f"Expected user '{expected_user}', got user '{user}'"
98+
logger.info(f"Successfully connected to Snowflake as {user}")
6999
return True
70100
except Exception as e:
71101
logger.error(e)

0 commit comments

Comments
 (0)