# Copyright 2018 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Demonstrates how to perform basic access management with Google Cloud IAM. For more information, see the documentation at https://cloud.google.com/iam/docs/granting-changing-revoking-access. """ import argparse import os from google.oauth2 import service_account import googleapiclient.discovery # [START iam_get_policy] def get_policy(project_id, version=1): """Gets IAM policy for a project.""" credentials = service_account.Credentials.from_service_account_file( filename=os.environ["GOOGLE_APPLICATION_CREDENTIALS"], scopes=["https://www.googleapis.com/auth/cloud-platform"], ) service = googleapiclient.discovery.build( "cloudresourcemanager", "v1", credentials=credentials ) policy = ( service.projects() .getIamPolicy( resource=project_id, body={"options": {"requestedPolicyVersion": version}}, ) .execute() ) print(policy) return policy # [END iam_get_policy] # [START iam_modify_policy_add_member] def modify_policy_add_member(policy, role, member): """Adds a new member to a role binding.""" binding = next(b for b in policy["bindings"] if b["role"] == role) binding["members"].append(member) print(binding) return policy # [END iam_modify_policy_add_member] # [START iam_modify_policy_add_role] def modify_policy_add_role(policy, role, member): """Adds a new role binding to a policy.""" binding = {"role": role, "members": [member]} policy["bindings"].append(binding) print(policy) return policy # [END iam_modify_policy_add_role] # [START iam_modify_policy_remove_member] def modify_policy_remove_member(policy, role, member): """Removes a member from a role binding.""" binding = next(b for b in policy["bindings"] if b["role"] == role) if "members" in binding and member in binding["members"]: binding["members"].remove(member) print(binding) return policy # [END iam_modify_policy_remove_member] # [START iam_set_policy] def set_policy(project_id, policy): """Sets IAM policy for a project.""" credentials = service_account.Credentials.from_service_account_file( filename=os.environ["GOOGLE_APPLICATION_CREDENTIALS"], scopes=["https://www.googleapis.com/auth/cloud-platform"], ) service = googleapiclient.discovery.build( "cloudresourcemanager", "v1", credentials=credentials ) policy = ( service.projects() .setIamPolicy(resource=project_id, body={"policy": policy}) .execute() ) print(policy) return policy # [END iam_set_policy] # [START iam_test_permissions] def test_permissions(project_id): """Tests IAM permissions of the caller""" credentials = service_account.Credentials.from_service_account_file( filename=os.environ["GOOGLE_APPLICATION_CREDENTIALS"], scopes=["https://www.googleapis.com/auth/cloud-platform"], ) service = googleapiclient.discovery.build( "cloudresourcemanager", "v1", credentials=credentials ) permissions = { "permissions": [ "resourcemanager.projects.get", "resourcemanager.projects.delete", ] } request = service.projects().testIamPermissions( resource=project_id, body=permissions ) returnedPermissions = request.execute() print(returnedPermissions) return returnedPermissions # [END iam_test_permissions] def main(): parser = argparse.ArgumentParser( description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter, ) subparsers = parser.add_subparsers(dest="command") # Get get_parser = subparsers.add_parser("get", help=get_policy.__doc__) get_parser.add_argument("project_id") # Modify: add member modify_member_parser = subparsers.add_parser( "modify_member", help=get_policy.__doc__ ) modify_member_parser.add_argument("project_id") modify_member_parser.add_argument("role") modify_member_parser.add_argument("member") # Modify: add role modify_role_parser = subparsers.add_parser( "modify_role", help=get_policy.__doc__ ) modify_role_parser.add_argument("project_id") modify_role_parser.add_argument("project_id") modify_role_parser.add_argument("role") modify_role_parser.add_argument("member") # Modify: remove member modify_member_parser = subparsers.add_parser( "modify_member", help=get_policy.__doc__ ) modify_member_parser.add_argument("project_id") modify_member_parser.add_argument("role") modify_member_parser.add_argument("member") # Set set_parser = subparsers.add_parser("set", help=set_policy.__doc__) set_parser.add_argument("project_id") set_parser.add_argument("policy") # Test permissions test_permissions_parser = subparsers.add_parser( "test_permissions", help=get_policy.__doc__ ) test_permissions_parser.add_argument("project_id") args = parser.parse_args() if args.command == "get": get_policy(args.project_id) elif args.command == "set": set_policy(args.project_id, args.policy) elif args.command == "add_member": modify_policy_add_member(args.policy, args.role, args.member) elif args.command == "remove_member": modify_policy_remove_member(args.policy, args.role, args.member) elif args.command == "add_binding": modify_policy_add_role(args.policy, args.role, args.member) elif args.command == "test_permissions": test_permissions(args.project_id) if __name__ == "__main__": main()