Skip to content

Commit 4fb6a39

Browse files
authored
Cleanup iam tests (GoogleCloudPlatform#2701)
* clean up access & add optl policy version param * Cleanup custom roles test * Blacken and lint
1 parent 4f4c66b commit 4fb6a39

File tree

3 files changed

+218
-108
lines changed

3 files changed

+218
-108
lines changed

iam/api-client/access.py

+86-60
Original file line numberDiff line numberDiff line change
@@ -26,54 +26,67 @@
2626

2727

2828
# [START iam_get_policy]
29-
def get_policy(project_id):
29+
def get_policy(project_id, version=1):
3030
"""Gets IAM policy for a project."""
3131

3232
credentials = service_account.Credentials.from_service_account_file(
33-
filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
34-
scopes=['https://www.googleapis.com/auth/cloud-platform'])
33+
filename=os.environ["GOOGLE_APPLICATION_CREDENTIALS"],
34+
scopes=["https://www.googleapis.com/auth/cloud-platform"],
35+
)
3536
service = googleapiclient.discovery.build(
36-
'cloudresourcemanager', 'v1', credentials=credentials)
37-
policy = service.projects().getIamPolicy(
38-
resource=project_id, body={}).execute()
37+
"cloudresourcemanager", "v1", credentials=credentials
38+
)
39+
policy = (
40+
service.projects()
41+
.getIamPolicy(
42+
resource=project_id,
43+
body={"options": {"requestedPolicyVersion": version}},
44+
)
45+
.execute()
46+
)
3947
print(policy)
4048
return policy
49+
50+
4151
# [END iam_get_policy]
4252

4353

4454
# [START iam_modify_policy_add_member]
4555
def modify_policy_add_member(policy, role, member):
4656
"""Adds a new member to a role binding."""
4757

48-
binding = next(b for b in policy['bindings'] if b['role'] == role)
49-
binding['members'].append(member)
58+
binding = next(b for b in policy["bindings"] if b["role"] == role)
59+
binding["members"].append(member)
5060
print(binding)
5161
return policy
62+
63+
5264
# [END iam_modify_policy_add_member]
5365

5466

5567
# [START iam_modify_policy_add_role]
5668
def modify_policy_add_role(policy, role, member):
5769
"""Adds a new role binding to a policy."""
5870

59-
binding = {
60-
'role': role,
61-
'members': [member]
62-
}
63-
policy['bindings'].append(binding)
71+
binding = {"role": role, "members": [member]}
72+
policy["bindings"].append(binding)
6473
print(policy)
6574
return policy
75+
76+
6677
# [END iam_modify_policy_add_role]
6778

6879

6980
# [START iam_modify_policy_remove_member]
7081
def modify_policy_remove_member(policy, role, member):
7182
"""Removes a member from a role binding."""
72-
binding = next(b for b in policy['bindings'] if b['role'] == role)
73-
if 'members' in binding and member in binding['members']:
74-
binding['members'].remove(member)
83+
binding = next(b for b in policy["bindings"] if b["role"] == role)
84+
if "members" in binding and member in binding["members"]:
85+
binding["members"].remove(member)
7586
print(binding)
7687
return policy
88+
89+
7790
# [END iam_modify_policy_remove_member]
7891

7992

@@ -82,17 +95,22 @@ def set_policy(project_id, policy):
8295
"""Sets IAM policy for a project."""
8396

8497
credentials = service_account.Credentials.from_service_account_file(
85-
filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
86-
scopes=['https://www.googleapis.com/auth/cloud-platform'])
98+
filename=os.environ["GOOGLE_APPLICATION_CREDENTIALS"],
99+
scopes=["https://www.googleapis.com/auth/cloud-platform"],
100+
)
87101
service = googleapiclient.discovery.build(
88-
'cloudresourcemanager', 'v1', credentials=credentials)
89-
90-
policy = service.projects().setIamPolicy(
91-
resource=project_id, body={
92-
'policy': policy
93-
}).execute()
102+
"cloudresourcemanager", "v1", credentials=credentials
103+
)
104+
105+
policy = (
106+
service.projects()
107+
.setIamPolicy(resource=project_id, body={"policy": policy})
108+
.execute()
109+
)
94110
print(policy)
95111
return policy
112+
113+
96114
# [END iam_set_policy]
97115

98116

@@ -101,86 +119,94 @@ def test_permissions(project_id):
101119
"""Tests IAM permissions of the caller"""
102120

103121
credentials = service_account.Credentials.from_service_account_file(
104-
filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
105-
scopes=['https://www.googleapis.com/auth/cloud-platform'])
122+
filename=os.environ["GOOGLE_APPLICATION_CREDENTIALS"],
123+
scopes=["https://www.googleapis.com/auth/cloud-platform"],
124+
)
106125
service = googleapiclient.discovery.build(
107-
'cloudresourcemanager', 'v1', credentials=credentials)
126+
"cloudresourcemanager", "v1", credentials=credentials
127+
)
108128

109129
permissions = {
110130
"permissions": [
111131
"resourcemanager.projects.get",
112-
"resourcemanager.projects.delete"
132+
"resourcemanager.projects.delete",
113133
]
114134
}
115135

116136
request = service.projects().testIamPermissions(
117-
resource=project_id, body=permissions)
137+
resource=project_id, body=permissions
138+
)
118139
returnedPermissions = request.execute()
119140
print(returnedPermissions)
120141
return returnedPermissions
142+
143+
121144
# [END iam_test_permissions]
122145

123146

124147
def main():
125148
parser = argparse.ArgumentParser(
126149
description=__doc__,
127-
formatter_class=argparse.RawDescriptionHelpFormatter)
150+
formatter_class=argparse.RawDescriptionHelpFormatter,
151+
)
128152

129-
subparsers = parser.add_subparsers(dest='command')
153+
subparsers = parser.add_subparsers(dest="command")
130154

131155
# Get
132-
get_parser = subparsers.add_parser(
133-
'get', help=get_policy.__doc__)
134-
get_parser.add_argument('project_id')
156+
get_parser = subparsers.add_parser("get", help=get_policy.__doc__)
157+
get_parser.add_argument("project_id")
135158

136159
# Modify: add member
137160
modify_member_parser = subparsers.add_parser(
138-
'modify_member', help=get_policy.__doc__)
139-
modify_member_parser.add_argument('project_id')
140-
modify_member_parser.add_argument('role')
141-
modify_member_parser.add_argument('member')
161+
"modify_member", help=get_policy.__doc__
162+
)
163+
modify_member_parser.add_argument("project_id")
164+
modify_member_parser.add_argument("role")
165+
modify_member_parser.add_argument("member")
142166

143167
# Modify: add role
144168
modify_role_parser = subparsers.add_parser(
145-
'modify_role', help=get_policy.__doc__)
146-
modify_role_parser.add_argument('project_id')
147-
modify_role_parser.add_argument('project_id')
148-
modify_role_parser.add_argument('role')
149-
modify_role_parser.add_argument('member')
169+
"modify_role", help=get_policy.__doc__
170+
)
171+
modify_role_parser.add_argument("project_id")
172+
modify_role_parser.add_argument("project_id")
173+
modify_role_parser.add_argument("role")
174+
modify_role_parser.add_argument("member")
150175

151176
# Modify: remove member
152177
modify_member_parser = subparsers.add_parser(
153-
'modify_member', help=get_policy.__doc__)
154-
modify_member_parser.add_argument('project_id')
155-
modify_member_parser.add_argument('role')
156-
modify_member_parser.add_argument('member')
178+
"modify_member", help=get_policy.__doc__
179+
)
180+
modify_member_parser.add_argument("project_id")
181+
modify_member_parser.add_argument("role")
182+
modify_member_parser.add_argument("member")
157183

158184
# Set
159-
set_parser = subparsers.add_parser(
160-
'set', help=set_policy.__doc__)
161-
set_parser.add_argument('project_id')
162-
set_parser.add_argument('policy')
185+
set_parser = subparsers.add_parser("set", help=set_policy.__doc__)
186+
set_parser.add_argument("project_id")
187+
set_parser.add_argument("policy")
163188

164189
# Test permissions
165190
test_permissions_parser = subparsers.add_parser(
166-
'test_permissions', help=get_policy.__doc__)
167-
test_permissions_parser.add_argument('project_id')
191+
"test_permissions", help=get_policy.__doc__
192+
)
193+
test_permissions_parser.add_argument("project_id")
168194

169195
args = parser.parse_args()
170196

171-
if args.command == 'get':
197+
if args.command == "get":
172198
get_policy(args.project_id)
173-
elif args.command == 'set':
199+
elif args.command == "set":
174200
set_policy(args.project_id, args.policy)
175-
elif args.command == 'add_member':
201+
elif args.command == "add_member":
176202
modify_policy_add_member(args.policy, args.role, args.member)
177-
elif args.command == 'remove_member':
203+
elif args.command == "remove_member":
178204
modify_policy_remove_member(args.policy, args.role, args.member)
179-
elif args.command == 'add_binding':
205+
elif args.command == "add_binding":
180206
modify_policy_add_role(args.policy, args.role, args.member)
181-
elif args.command == 'test_permissions':
207+
elif args.command == "test_permissions":
182208
test_permissions(args.project_id)
183209

184210

185-
if __name__ == '__main__':
211+
if __name__ == "__main__":
186212
main()

iam/api-client/access_test.py

+40-23
Original file line numberDiff line numberDiff line change
@@ -13,47 +13,64 @@
1313
# limitations under the License.
1414

1515
import os
16+
import pytest
1617
import random
1718

1819
import access
1920
import service_accounts
2021

22+
# Setting up variables for testing
23+
GCLOUD_PROJECT = os.environ["GCLOUD_PROJECT"]
2124

22-
def test_access(capsys):
23-
# Setting up variables for testing
24-
project_id = os.environ['GCLOUD_PROJECT']
25+
# specifying a sample role to be assigned
26+
GCP_ROLE = "roles/owner"
2527

26-
# specifying a sample role to be assigned
27-
gcp_role = 'roles/owner'
2828

29+
@pytest.fixture(scope="module")
30+
def test_member():
2931
# section to create service account to test policy updates.
3032
rand = str(random.randint(0, 1000))
31-
name = 'python-test-' + rand
32-
email = name + '@' + project_id + '.iam.gserviceaccount.com'
33-
member = 'serviceAccount:' + email
33+
name = "python-test-" + rand
34+
email = name + "@" + GCLOUD_PROJECT + ".iam.gserviceaccount.com"
35+
member = "serviceAccount:" + email
3436
service_accounts.create_service_account(
35-
project_id, name, 'Py Test Account')
37+
GCLOUD_PROJECT, name, "Py Test Account"
38+
)
3639

37-
policy = access.get_policy(project_id)
38-
out, _ = capsys.readouterr()
39-
assert u'etag' in out
40+
yield member
41+
42+
# deleting the service account created above
43+
service_accounts.delete_service_account(email)
4044

41-
policy = access.modify_policy_add_role(policy, gcp_role, member)
45+
46+
def test_get_policy(capsys):
47+
access.get_policy(GCLOUD_PROJECT, version=3)
4248
out, _ = capsys.readouterr()
43-
assert u'etag' in out
49+
assert u"etag" in out
50+
4451

45-
policy = access.modify_policy_remove_member(policy, gcp_role, member)
52+
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)
4655
out, _ = capsys.readouterr()
47-
assert 'iam.gserviceaccount.com' in out
56+
assert u"etag" in out
4857

49-
policy = access.set_policy(project_id, policy)
58+
59+
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)
5062
out, _ = capsys.readouterr()
51-
assert u'etag' in out
63+
assert "iam.gserviceaccount.com" in out
64+
5265

53-
access.test_permissions(project_id)
66+
def test_set_policy(capsys):
67+
policy = access.get_policy(GCLOUD_PROJECT, version=3)
68+
access.set_policy(GCLOUD_PROJECT, policy)
5469
out, _ = capsys.readouterr()
55-
assert u'permissions' in out
70+
assert u"etag" in out
5671

57-
# deleting the service account created above
58-
service_accounts.delete_service_account(
59-
email)
72+
73+
def test_permissions(capsys):
74+
access.test_permissions(GCLOUD_PROJECT)
75+
out, _ = capsys.readouterr()
76+
assert u"permissions" in out

0 commit comments

Comments
 (0)