3939 'api_group_get_user_role' ,
4040 'api_group_remove_user_from_group' ,
4141 'rule_group_sram_sync' ,
42- 'rule_external_users_sram_sync' ]
42+ 'rule_external_users_sram_sync' ,
43+ 'rule_sram_migration' ]
4344
4445
4546def get_groups_data (ctx : rule .Context ) -> Iterable [Any ]:
@@ -1376,23 +1377,105 @@ def rule_external_users_sram_sync(ctx: rule.Context) -> None:
13761377 group_name = group ["name" ]
13771378 members = group ['members' ] + group ['read' ] + group ['managers' ]
13781379 invited = group ['invited' ]
1380+ co_identifier = sram .get_co_identifier (ctx , group_name )
1381+ sram_co = group ['sram_co' ]
1382+
1383+ if not co_identifier and sram_co :
1384+ log .write (ctx , f"Sync members of group { group_name } with SRAM external users CO" )
1385+
1386+ for member in members :
1387+ # Check if member has valid email and is an external user.
1388+ username , _ = user .from_str (ctx , member )
1389+ if yoda_names .is_email_username (username ) and not yoda_names .is_internal_user (username ):
1390+ # Remove invitation metadata if user is member of the external users CO.
1391+ if username in co_members and member in invited :
1392+ log .write (ctx , f"User { username } is member of group { group_name } , removing invitation metadata" )
1393+ if sram .is_user_marked_invited (ctx , username , group_name ):
1394+ msi .sudo_obj_meta_remove (ctx , member , "-u" , "" , constants .UUORGMETADATAPREFIX + "sram_invited" , group_name , "" , "" )
1395+ # Put invite and add invitation metadata if user is not member of the external users CO.
1396+ elif username not in co_members and member not in invited :
1397+ sram .put_collaboration_invitation (ctx , group_name , username , config .sram_external_users_co )
1398+ if not sram .is_user_marked_invited (ctx , username , group_name ):
1399+ msi .sudo_obj_meta_add (ctx , member , "-u" , constants .UUORGMETADATAPREFIX + "sram_invited" , group_name , "" , "" )
1400+ log .write (ctx , f"User { username } invited to group { group_name } " )
13791401
1380- log .write (ctx , f"Sync members of group { group_name } with SRAM external users CO" )
1402+ log .write (ctx , "Finished syncing external users with SRAM" )
1403+
1404+
1405+ @rule .make (inputs = [0 , 1 , 2 , 3 ])
1406+ def rule_sram_migration (ctx : rule .Context , log_file : bool , dry_run :bool , convert_group : str , group_name : str ) -> None :
1407+ """ Migrate existing groups to SRAM or non-SRAM group.
1408+
1409+ :param ctx: Combined type of a ctx and rei struct
1410+ :param log_file: If True, the log file will be generated at /var/lib/irods/log/sram-migration.log
1411+ :param dry_run: If True, the migration will run all the steps without making the changes.
1412+ :param convert_group: Convert group to either 'SRAM' or 'non-SRAM' group.
1413+ :param group_name: Name of the group to be migrated
1414+ """
1415+
1416+
1417+ if not user .is_rodsadmin (ctx ):
1418+ log .write (ctx , "SRAM migration requires rodsadmin privileges" )
1419+ return
1420+
1421+ if not config .enable_sram :
1422+ log .write (ctx , "SRAM needs to be enabled to migrate existing group" )
1423+ return
1424+
1425+ if not config .sram_external_users_co :
1426+ log .write (ctx , "SRAM external user CO needs to be configured for migration" )
1427+ return
1428+
1429+ # Get group data
1430+ group = get_group_data (ctx , group_name )
1431+
1432+ # Get SRAM related metadata
1433+ co_identifier = sram .get_co_identifier (ctx , group_name )
1434+ sram_co = group ['sram_co' ]
1435+
1436+ # Migrating SRAM to non-SRAM group
1437+ if convert_group == 'non-sram' :
1438+ # Get external users CO members from SRAM
1439+ try :
1440+ co_members = [member ['email' ] for member in sram .get_co_members (ctx , config .sram_external_users_co )]
1441+ except Exception as e :
1442+ log .write (ctx , f"Migration failed during fetch: { e } " )
1443+
1444+ # Check if external user exists in the group
1445+ members = group ['members' ] + group ['read' ] + group ['managers' ]
13811446
13821447 for member in members :
1383- # Check if member has valid email and is an external user.
13841448 username , _ = user .from_str (ctx , member )
13851449 if yoda_names .is_email_username (username ) and not yoda_names .is_internal_user (username ):
1386- # Remove invitation metadata if user is member of the external users CO.
1387- if username in co_members and member in invited :
1388- log .write (ctx , f"User { username } is member of group { group_name } , removing invitation metadata" )
1389- if sram .is_user_marked_invited (ctx , username , group_name ):
1390- msi .sudo_obj_meta_remove (ctx , member , "-u" , "" , constants .UUORGMETADATAPREFIX + "sram_invited" , group_name , "" , "" )
1391- # Put invite and add invitation metadata if user is not member of the external users CO.
1392- elif username not in co_members and member not in invited :
1393- sram .put_collaboration_invitation (ctx , group_name , username , config .sram_external_users_co )
1394- if not sram .is_user_marked_invited (ctx , username , group_name ):
1450+ # Check if sram invitation metadata exists for this external user
1451+ if sram .is_user_marked_invited (ctx , username , group_name ):
1452+ # Delete invitation from SRAM
1453+ try :
1454+ sram .delete_pending_invitation (ctx , co_identifier , username )
1455+ except Exception :
1456+ log .write (ctx , f"Something went wrong while deleting the open invitation for user { username } in SRAM CO { group_name } ." )
1457+
1458+ # Delete SRAM invited metadata
1459+ msi .sudo_obj_meta_remove (ctx , member , "-u" , "" , constants .UUORGMETADATAPREFIX + "sram_invited" , group_name , "" , "" )
1460+ else :
1461+ # Check if the user exists in SRAM external users CO, if not, then send the invitation
1462+ if username not in co_members :
1463+ sram .put_collaboration_invitation (ctx , group_name , username , config .sram_external_users_co )
13951464 msi .sudo_obj_meta_add (ctx , member , "-u" , constants .UUORGMETADATAPREFIX + "sram_invited" , group_name , "" , "" )
1396- log .write (ctx , f"User { username } invited to group { group_name } " )
1465+ log .write (ctx , f"User { username } invited to group { group_name } " )
1466+ else :
1467+ log .write (ctx , f"User { username } already exists in SRAM external users CO." )
1468+ # Delete SRAM CO metadata
1469+ msi .sudo_obj_meta_remove (ctx , group_name , "-u" , "" , "co_identifier" , co_identifier , "" , "" )
1470+ msi .sudo_obj_meta_remove (ctx , group_name , "-u" , "" , "sram_co" , sram_co , "" , "" )
13971471
1398- log .write (ctx , "Finished syncing external users with SRAM" )
1472+ # Delete collaboration in SRAM
1473+ if co_identifier and not sram .delete_collaboration (ctx , co_identifier ):
1474+ return api .Error ('sram_error' , 'Something went wrong deleting group "{}" in SRAM' .format (group_name ))
1475+ elif convert_group == 'sram' :
1476+ if not sram_co and co_identifier :
1477+ # Add sram_co metadata to SRAM group
1478+ msi .sudo_obj_meta_add (ctx , group_name , "-u" , "sram_co" , sram_co , "" , "" )
1479+ else :
1480+ log .write (ctx , "Could not convert group to {}. Invalid argument." .format (convert_group ))
1481+
0 commit comments