18858: Fixes unlisted account deactivation logic. Improves logging.
authorLucas Di Pentima <lucas.dipentima@curii.com>
Tue, 21 Jun 2022 14:16:08 +0000 (11:16 -0300)
committerLucas Di Pentima <lucas.dipentima@curii.com>
Wed, 29 Jun 2022 12:15:57 +0000 (09:15 -0300)
Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima <lucas.dipentima@curii.com>

tools/sync-users/sync-users.go

index 23f1118178a8f385f7bd5b66191e5bdde1be70a7..969e101febb5598401ece4ddd42256ff0d95703a 100644 (file)
@@ -190,33 +190,29 @@ func doMain(cfg *ConfigParams) error {
        }
        log.Printf("Loaded %d records from input file", len(loadedRecords))
 
-       updatesSucceeded, updatesFailed := 0, 0
+       updatesSucceeded := map[string]bool{}
+       updatesFailed := map[string]bool{}
+       updatesSkipped := map[string]bool{}
+
        for _, record := range loadedRecords {
+               processedUsers[record.Email] = true
                if record.Email == cfg.CurrentUser.Email {
+                       updatesSkipped[record.Email] = true
                        log.Printf("Skipping current user %q from processing", record.Email)
                        continue
                }
                if updated, err := ProcessRecord(cfg, record, allUsers); err != nil {
                        log.Printf("error processing record %q: %s", record.Email, err)
-                       updatesFailed++
+                       updatesFailed[record.Email] = true
                } else if updated {
-                       processedUsers[strings.ToLower(record.Email)] = true
-                       updatesSucceeded++
+                       updatesSucceeded[record.Email] = true
                }
        }
 
        if cfg.DeactivateUnlisted {
                for email, user := range allUsers {
-                       switch user.UUID {
-                       case cfg.SysUserUUID, cfg.AnonUserUUID:
-                               if cfg.Verbose {
-                                       log.Printf("Skipping system user deactivation: %s", user.UUID)
-                               }
-                               continue
-                       case cfg.CurrentUser.UUID:
-                               if cfg.Verbose {
-                                       log.Printf("Skipping current user deactivation: %s (%s)", user.Email, user.UUID)
-                               }
+                       if shouldSkip(cfg, user) {
+                               updatesSkipped[email] = true
                                continue
                        }
                        if !processedUsers[email] && allUsers[email].IsActive {
@@ -226,20 +222,30 @@ func doMain(cfg *ConfigParams) error {
                                var updatedUser arvados.User
                                if err := UnsetupUser(cfg.Client, user.UUID, &updatedUser); err != nil {
                                        log.Printf("error deactivating unlisted user %q: %s", user.UUID, err)
-                                       updatesFailed++
+                                       updatesFailed[email] = true
                                } else {
                                        allUsers[email] = updatedUser
-                                       updatesSucceeded++
+                                       updatesSucceeded[email] = true
                                }
                        }
                }
        }
 
-       log.Printf("Updated %d user(s), failed to update %d user(s)", updatesSucceeded, updatesFailed)
+       log.Printf("User update successes: %d, skips: %d, failures: %d", len(updatesSucceeded), len(updatesSkipped), len(updatesFailed))
 
        return nil
 }
 
+func shouldSkip(cfg *ConfigParams, user arvados.User) bool {
+       switch user.UUID {
+       case cfg.SysUserUUID, cfg.AnonUserUUID:
+               return true
+       case cfg.CurrentUser.UUID:
+               return true
+       }
+       return false
+}
+
 type userRecord struct {
        Email     string
        FirstName string