Skip to content

Commit 442efa4

Browse files
author
Takashi Matsuo
authored
[iam] fix: reduce flakiness (#3293)
fixes #3292 * use `uuid.uuid4()` instead of random * retry write operations in the tests
1 parent c676778 commit 442efa4

File tree

2 files changed

+36
-15
lines changed

2 files changed

+36
-15
lines changed

iam/api-client/access_test.py

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@
1414

1515
import os
1616
import pytest
17-
import random
17+
import uuid
18+
19+
from googleapiclient import errors
20+
from retrying import retry
1821

1922
import access
2023
import service_accounts
@@ -26,11 +29,16 @@
2629
GCP_ROLE = "roles/owner"
2730

2831

32+
def retry_if_conflict(exception):
33+
return (isinstance(exception, errors.HttpError)
34+
and 'There were concurrent policy changes' in str(exception))
35+
36+
2937
@pytest.fixture(scope="module")
3038
def test_member():
3139
# section to create service account to test policy updates.
32-
rand = str(random.randint(0, 1000))
33-
name = "python-test-" + rand
40+
# we use the first portion of uuid4 because full version is too long.
41+
name = "python-test-" + str(uuid.uuid4()).split('-')[0]
3442
email = name + "@" + GCLOUD_PROJECT + ".iam.gserviceaccount.com"
3543
member = "serviceAccount:" + email
3644
service_accounts.create_service_account(
@@ -50,24 +58,36 @@ def test_get_policy(capsys):
5058

5159

5260
def test_modify_policy_add_role(test_member, capsys):
53-
policy = access.get_policy(GCLOUD_PROJECT, version=3)
54-
access.modify_policy_add_role(policy, GCLOUD_PROJECT, test_member)
55-
out, _ = capsys.readouterr()
56-
assert u"etag" in out
61+
@retry(wait_exponential_multiplier=1000, wait_exponential_max=10000,
62+
stop_max_attempt_number=5, retry_on_exception=retry_if_conflict)
63+
def test_call():
64+
policy = access.get_policy(GCLOUD_PROJECT, version=3)
65+
access.modify_policy_add_role(policy, GCLOUD_PROJECT, test_member)
66+
out, _ = capsys.readouterr()
67+
assert u"etag" in out
68+
test_call()
5769

5870

5971
def test_modify_policy_remove_member(test_member, capsys):
60-
policy = access.get_policy(GCLOUD_PROJECT, version=3)
61-
access.modify_policy_remove_member(policy, GCP_ROLE, test_member)
62-
out, _ = capsys.readouterr()
63-
assert "iam.gserviceaccount.com" in out
72+
@retry(wait_exponential_multiplier=1000, wait_exponential_max=10000,
73+
stop_max_attempt_number=5, retry_on_exception=retry_if_conflict)
74+
def test_call():
75+
policy = access.get_policy(GCLOUD_PROJECT, version=3)
76+
access.modify_policy_remove_member(policy, GCP_ROLE, test_member)
77+
out, _ = capsys.readouterr()
78+
assert "iam.gserviceaccount.com" in out
79+
test_call()
6480

6581

6682
def test_set_policy(capsys):
67-
policy = access.get_policy(GCLOUD_PROJECT, version=3)
68-
access.set_policy(GCLOUD_PROJECT, policy)
69-
out, _ = capsys.readouterr()
70-
assert u"etag" in out
83+
@retry(wait_exponential_multiplier=1000, wait_exponential_max=10000,
84+
stop_max_attempt_number=5, retry_on_exception=retry_if_conflict)
85+
def test_call():
86+
policy = access.get_policy(GCLOUD_PROJECT, version=3)
87+
access.set_policy(GCLOUD_PROJECT, policy)
88+
out, _ = capsys.readouterr()
89+
assert u"etag" in out
90+
test_call()
7191

7292

7393
def test_permissions(capsys):

iam/api-client/requirements-test.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
pytest==5.3.2
22
gcp-devrel-py-tools==0.0.15
3+
retrying==1.3.3

0 commit comments

Comments
 (0)