15531: Working on properly migrating usernames
authorPeter Amstutz <pamstutz@veritasgenetics.com>
Fri, 13 Sep 2019 20:39:59 +0000 (16:39 -0400)
committerPeter Amstutz <pamstutz@veritasgenetics.com>
Fri, 13 Sep 2019 20:39:59 +0000 (16:39 -0400)
Arvados-DCO-1.1-Signed-off-by: Peter Amstutz <pamstutz@veritasgenetics.com>

sdk/python/arvados/commands/federation_migrate.py
services/api/app/models/repository.rb
services/api/app/models/user.rb

index 9211f060813bd29c555d91e35d60cb0f09e5f964..386c0ef9bed46ad530fc6c94f854802ee19c1e62 100755 (executable)
@@ -160,11 +160,24 @@ def main():
                 if len(userhome) == 5 and userhome not in clusters:
                     print("(%s) Cannot migrate %s, unknown home cluster %s (typo?)" % (email, old_user_uuid, userhome))
                     continue
-                print("(%s) No user listed with same email to migrate %s to %s, will create new user" % (email, old_user_uuid, userhome))
+                print("(%s) No user listed with same email to migrate %s to %s, will create new user with username '%s'" % (email, old_user_uuid, userhome, username))
                 if not args.dry_run:
                     newhomecluster = userhome[0:5]
                     homearv = clusters[userhome]
-                    user = homearv.users().create({"email": email, "username": username}).execute()
+                    user = None
+                    try:
+                        user = homearv.users().create(body={"user": {"email": email, "username": username}}).execute()
+                    except arvados.errors.ApiError as e:
+                        if "Username" in str(e):
+                            other = homearv.users().list(filters=[["username", "=", username]]).execute()
+                            if other['items'] and other['items'][0]['email'] == email:
+                                conflicting_user = other['items'][0]
+                                homearv.users().update(uuid=conflicting_user["uuid"], body={"user": {"username": username+"migrate"}}).execute()
+                                user = homearv.users().create(body={"user": {"email": email, "username": username}}).execute()
+                        if not user:
+                            print("(%s) Could not create user: %s" % (email, str(e)))
+                            continue
+
                     candidates.append((email, username, user["uuid"], userhome))
                 else:
                     candidates.append((email, username, "%s-tpzed-xfakexfakexfake" % (userhome[0:5]), userhome))
@@ -229,7 +242,6 @@ def main():
                     print("(%s) Not migrating %s because user is admin but target user %s is not admin on %s" % (email, old_user_uuid, new_user_uuid, migratecluster))
                     continue
 
-
                 print("(%s) Migrating %s to %s on %s" % (email, old_user_uuid, new_user_uuid, migratecluster))
 
                 try:
@@ -242,9 +254,16 @@ def main():
                         migratearv.users().merge(old_user_uuid=old_user_uuid,
                                                  new_user_uuid=new_user_uuid,
                                                  new_owner_uuid=grp["uuid"],
-                                                 redirect_to_new_user=True).execute()
+                                                 redirect_to_new_user=old_user_uuid.startswith(migratecluster)).execute()
                 except arvados.errors.ApiError as e:
                     print("(%s) Error migrating user: %s" % (email, e))
 
+                if newuser['username'] != username:
+                    print("%s != %s" % (newuser['username'], username))
+                    try:
+                        migratearv.users().update(uuid=new_user_uuid, body={"user": {"username": username}}).execute()
+                    except arvados.errors.ApiError as e:
+                        print("(%s) Error updating username of %s to '%s' on %s: %s" % (email, new_user_uuid, username, migratecluster, e))
+
 if __name__ == "__main__":
     main()
index e6a0795402b36415cc6bc4019a6b760fd4396435..46f2de6ee44f6dab98b315e66ede50296d1b4b84 100644 (file)
@@ -92,7 +92,7 @@ class Repository < ArvadosModel
     end
     if not (/^#{prefix_match}[A-Za-z][A-Za-z0-9]*$/.match(name))
       errors.add(:name,
-                 "#{errmsg_start} a letter followed by alphanumerics")
+                 "#{errmsg_start} a letter followed by alphanumerics, expected pattern '#{prefix_match}[A-Za-z][A-Za-z0-9]*' but was '#{name}'")
       false
     end
   end
index 65cb75306f384a3eb4c3c863889b034e45988814..e309d999d309ac63c9b9fbd788a3d279059de64a 100644 (file)
@@ -339,7 +339,7 @@ class User < ArvadosModel
         klass.where(owner_uuid: uuid).update_all(owner_uuid: new_owner_uuid)
       end
 
-      update_attributes!(redirect_to_user_uuid: new_user.uuid)
+      update_attributes!(redirect_to_user_uuid: new_user.uuid, username: nil)
       invalidate_permissions_cache
     end
   end