66from databricks .labs .blueprint .parallel import ManyError
77from databricks .labs .blueprint .tui import MockPrompts
88from databricks .sdk import WorkspaceClient
9- from databricks .sdk .errors import DatabricksError , ResourceDoesNotExist
9+ from databricks .sdk .errors import DatabricksError , NotFound , ResourceDoesNotExist
1010from databricks .sdk .service import iam
1111from databricks .sdk .service .iam import ComplexValue , Group , ResourceMeta
1212
@@ -836,23 +836,121 @@ def test_validate_group_diff_membership():
836836 external_id = "1234" ,
837837 display_name = "test_(1234)" ,
838838 meta = ResourceMeta (resource_type = "WorkspaceGroup" ),
839- members = [ComplexValue (display = "test-user-1" , value = "20 " ), ComplexValue (display = "test-user-2" , value = "21 " )],
839+ members = [ComplexValue (display = "test-user-1" , value = "1 " ), ComplexValue (display = "test-user-2" , value = "2 " )],
840840 roles = [
841841 ComplexValue (value = "arn:aws:iam::123456789098:instance-profile/ip1" ),
842842 ComplexValue (value = "arn:aws:iam::123456789098:instance-profile/ip2" ),
843843 ],
844844 entitlements = [ComplexValue (value = "allow-cluster-create" ), ComplexValue (value = "allow-instance-pool-create" )],
845845 )
846846 wsclient .groups .list .return_value = [group ]
847- wsclient .groups .get .return_value = group
848- account_admins_group = Group (id = "1234" , external_id = "1234" , display_name = "ac_test_1234" )
849- wsclient .api_client .do .return_value = {
850- "Resources" : [g .as_dict () for g in [account_admins_group ]],
851- }
847+ account_admins_group = Group (
848+ id = "1234" ,
849+ external_id = "1234" ,
850+ display_name = "ac_test_1234" ,
851+ members = [ComplexValue (display = "test-user-3" , value = "3" )],
852+ )
853+
854+ def do_api_side_effect (* args , ** kwargs ):
855+ if args [0 ] == "GET" :
856+ if args [1 ] == "/api/2.0/account/scim/v2/Groups" :
857+ return {"Resources" : [g .as_dict () for g in [account_admins_group ]]}
858+ else :
859+ return account_admins_group .as_dict ()
860+ else :
861+ raise RuntimeError ()
862+
863+ wsclient .api_client .do .side_effect = do_api_side_effect
864+ wsclient .groups .get .side_effect = lambda group_id : group if group_id == "1" else account_admins_group
865+ grp_membership = GroupManager (
866+ backend , wsclient , inventory_database = "inv" , workspace_group_regex = r"\(([1-9]+)\)" , account_group_regex = "[1-9]+"
867+ ).validate_group_membership ()
868+ assert grp_membership == [
869+ {
870+ "wf_group_name" : "test_(1234)" ,
871+ "wf_group_members_count" : 2 ,
872+ "acc_group_name" : "ac_test_1234" ,
873+ "acc_group_members_count" : 1 ,
874+ }
875+ ]
876+
877+
878+ def test_validate_group_diff_membership_no_members ():
879+ backend = create_autospec (SqlBackend )
880+ wsclient = create_autospec (WorkspaceClient )
881+ group = Group (
882+ id = "1" ,
883+ external_id = "1234" ,
884+ display_name = "test_(1234)" ,
885+ meta = ResourceMeta (resource_type = "WorkspaceGroup" ),
886+ members = None ,
887+ roles = [
888+ ComplexValue (value = "arn:aws:iam::123456789098:instance-profile/ip1" ),
889+ ],
890+ entitlements = [ComplexValue (value = "allow-cluster-create" ), ComplexValue (value = "allow-instance-pool-create" )],
891+ )
892+ wsclient .groups .list .return_value = [group ]
893+ account_admins_group = Group (
894+ id = "1234" ,
895+ external_id = "1234" ,
896+ display_name = "ac_test_1234" ,
897+ members = None ,
898+ )
899+
900+ def do_api_side_effect (* args , ** kwargs ):
901+ if args [0 ] == "GET" :
902+ if args [1 ] == "/api/2.0/account/scim/v2/Groups" :
903+ return {"Resources" : [g .as_dict () for g in [account_admins_group ]]}
904+ else :
905+ return account_admins_group .as_dict ()
906+ else :
907+ raise RuntimeError ()
908+
909+ wsclient .api_client .do .side_effect = do_api_side_effect
910+ wsclient .groups .get .side_effect = lambda group_id : group if group_id == "1" else account_admins_group
852911 grp_membership = GroupManager (
853912 backend , wsclient , inventory_database = "inv" , workspace_group_regex = r"\(([1-9]+)\)" , account_group_regex = "[1-9]+"
854913 ).validate_group_membership ()
855- assert grp_membership == [{"wf_group_name" : "test_(1234)" , "ac_group_name" : "ac_test_1234" }]
914+ assert grp_membership == []
915+
916+
917+ def test_validate_group_diff_membership_no_account_group_found ():
918+ backend = create_autospec (SqlBackend )
919+ wsclient = create_autospec (WorkspaceClient )
920+ group = Group (
921+ id = "1" ,
922+ external_id = "1234" ,
923+ display_name = "test_(1234)" ,
924+ meta = ResourceMeta (resource_type = "WorkspaceGroup" ),
925+ members = None ,
926+ roles = [
927+ ComplexValue (value = "arn:aws:iam::123456789098:instance-profile/ip1" ),
928+ ],
929+ entitlements = [ComplexValue (value = "allow-cluster-create" ), ComplexValue (value = "allow-instance-pool-create" )],
930+ )
931+ wsclient .groups .list .return_value = [group ]
932+ account_admins_group = Group (
933+ id = "1234" ,
934+ external_id = "1234" ,
935+ display_name = "ac_test_1234" ,
936+ members = None ,
937+ )
938+
939+ def do_api_side_effect (* args , ** kwargs ):
940+ if args [0 ] == "GET" :
941+ if args [1 ] == "/api/2.0/account/scim/v2/Groups" :
942+ return {"Resources" : [g .as_dict () for g in [account_admins_group ]]}
943+ else :
944+ return account_admins_group .as_dict ()
945+ else :
946+ raise RuntimeError ()
947+
948+ wsclient .api_client .do .side_effect = do_api_side_effect
949+ wsclient .groups .get .side_effect = lambda group_id : group if group_id == "1" else None
950+ grp_membership = GroupManager (
951+ backend , wsclient , inventory_database = "inv" , workspace_group_regex = r"\(([1-9]+)\)" , account_group_regex = "[1-9]+"
952+ ).validate_group_membership ()
953+ assert grp_membership == []
856954
857955
858956def test_validate_group_same_membership ():
@@ -878,9 +976,57 @@ def test_validate_group_same_membership():
878976 display_name = "ac_test_1234" ,
879977 members = [ComplexValue (display = "test-user-1" , value = "01" ), ComplexValue (display = "test-user-2" , value = "02" )],
880978 )
881- wsclient .api_client .do .return_value = {
882- "Resources" : [g .as_dict () for g in [account_admins_group ]],
883- }
979+
980+ def do_api_side_effect (* args , ** kwargs ):
981+ if args [0 ] == "GET" :
982+ if args [1 ] == "/api/2.0/account/scim/v2/Groups" :
983+ return {"Resources" : [g .as_dict () for g in [account_admins_group ]]}
984+ else :
985+ return account_admins_group .as_dict ()
986+ else :
987+ raise RuntimeError ()
988+
989+ wsclient .api_client .do .side_effect = do_api_side_effect
990+ grp_membership = GroupManager (
991+ backend , wsclient , inventory_database = "inv" , workspace_group_regex = r"\(([1-9]+)\)" , account_group_regex = "[1-9]+"
992+ ).validate_group_membership ()
993+ assert grp_membership == []
994+
995+
996+ def test_validate_acc_group_removed_after_listing ():
997+ backend = MockBackend ()
998+ wsclient = MagicMock ()
999+ group = Group (
1000+ id = "1" ,
1001+ external_id = "1234" ,
1002+ display_name = "test_(1234)" ,
1003+ meta = ResourceMeta (resource_type = "WorkspaceGroup" ),
1004+ members = [ComplexValue (display = "test-user-1" , value = "01" ), ComplexValue (display = "test-user-2" , value = "02" )],
1005+ roles = [
1006+ ComplexValue (value = "arn:aws:iam::123456789098:instance-profile/test_ip1" ),
1007+ ComplexValue (value = "arn:aws:iam::123456789098:instance-profile/test_ip2" ),
1008+ ],
1009+ entitlements = [ComplexValue (value = "allow-cluster-create" ), ComplexValue (value = "allow-instance-pool-create" )],
1010+ )
1011+ wsclient .groups .list .return_value = [group ]
1012+ wsclient .groups .get .return_value = group
1013+ account_admins_group = Group (
1014+ id = "1234" ,
1015+ external_id = "1234" ,
1016+ display_name = "ac_test_1234" ,
1017+ members = [ComplexValue (display = "test-user-1" , value = "01" ), ComplexValue (display = "test-user-2" , value = "02" )],
1018+ )
1019+
1020+ def do_api_side_effect (* args , ** kwargs ):
1021+ if args [0 ] == "GET" :
1022+ if args [1 ] == "/api/2.0/account/scim/v2/Groups" :
1023+ return {"Resources" : [g .as_dict () for g in [account_admins_group ]]}
1024+ else :
1025+ raise NotFound ()
1026+ else :
1027+ raise RuntimeError ()
1028+
1029+ wsclient .api_client .do .side_effect = do_api_side_effect
8841030 grp_membership = GroupManager (
8851031 backend , wsclient , inventory_database = "inv" , workspace_group_regex = r"\(([1-9]+)\)" , account_group_regex = "[1-9]+"
8861032 ).validate_group_membership ()
0 commit comments