16263: Add local_user_list flag to bypass LoginCluster behavior
authorPeter Amstutz <peter.amstutz@curii.com>
Fri, 27 Mar 2020 21:08:48 +0000 (17:08 -0400)
committerPeter Amstutz <peter.amstutz@curii.com>
Mon, 13 Apr 2020 15:27:03 +0000 (11:27 -0400)
Required by federation migrate script.

Arvados-DCO-1.1-Signed-off-by: Peter Amstutz <peter.amstutz@curii.com>

lib/controller/federation/conn.go
sdk/go/arvados/api.go
sdk/python/arvados/commands/federation_migrate.py
services/api/app/controllers/arvados/v1/users_controller.rb

index 226bfabf13a84aabebbe036710f15488165fa90c..dc676c2639729ec86383ed978e6610a30cb5fcf5 100644 (file)
@@ -388,7 +388,7 @@ var userAttrsCachedFromLoginCluster = map[string]bool{
 
 func (conn *Conn) UserList(ctx context.Context, options arvados.ListOptions) (arvados.UserList, error) {
        logger := ctxlog.FromContext(ctx)
-       if id := conn.cluster.Login.LoginCluster; id != "" && id != conn.cluster.ClusterID {
+       if id := conn.cluster.Login.LoginCluster; id != "" && id != conn.cluster.ClusterID && !options.LocalUserList {
                resp, err := conn.chooseBackend(id).UserList(ctx, options)
                if err != nil {
                        return resp, err
index 4eb5b61b3a1200e46119c1c15e7823a4496be64a..7bb3bfaa748a50adcbd60c2fa2b6add4312ec3dd 100644 (file)
@@ -84,6 +84,7 @@ type ListOptions struct {
        Count              string                 `json:"count"`
        IncludeTrash       bool                   `json:"include_trash"`
        IncludeOldVersions bool                   `json:"include_old_versions"`
+       LocalUserList      bool                   `json:"local_user_list"`
 }
 
 type CreateOptions struct {
index e74d6215c79cb76af6fdab7170f3cd989a77143e..b66aa5d7cb0a315c153ed09dbb53cdc5dd785e35 100755 (executable)
@@ -98,7 +98,7 @@ def fetch_users(clusters, loginCluster):
     users = []
     for c, arv in clusters.items():
         print("Getting user list from %s" % c)
-        ul = arvados.util.list_all(arv.users().list)
+        ul = arvados.util.list_all(arv.users().list, local_user_list=True)
         for l in ul:
             if l["uuid"].startswith(c):
                 users.append(l)
@@ -171,7 +171,7 @@ def update_username(args, email, user_uuid, username, migratecluster, migratearv
     print("(%s) Updating username of %s to '%s' on %s" % (email, user_uuid, username, migratecluster))
     if not args.dry_run:
         try:
-            conflicts = migratearv.users().list(filters=[["username", "=", username]]).execute()
+            conflicts = migratearv.users().list(filters=[["username", "=", username]], local_user_list=True).execute()
             if conflicts["items"]:
                 migratearv.users().update(uuid=conflicts["items"][0]["uuid"], body={"user": {"username": username+"migrate"}}).execute()
             migratearv.users().update(uuid=user_uuid, body={"user": {"username": username}}).execute()
@@ -204,7 +204,7 @@ def choose_new_user(args, by_email, email, userhome, username, old_user_uuid, cl
             user = None
             try:
                 olduser = oldhomearv.users().get(uuid=old_user_uuid).execute()
-                conflicts = homearv.users().list(filters=[["username", "=", username]]).execute()
+                conflicts = homearv.users().list(filters=[["username", "=", username]], local_user_list=True).execute()
                 if conflicts["items"]:
                     homearv.users().update(uuid=conflicts["items"][0]["uuid"], body={"user": {"username": username+"migrate"}}).execute()
                 user = homearv.users().create(body={"user": {"email": email, "username": username, "is_active": olduser["is_active"]}}).execute()
index eb2402b80821c8fdeff02f33c85073fc77db99cf..c94fa113e7f226979a34cea6b604d14865f3c3de 100644 (file)
@@ -254,6 +254,12 @@ class Arvados::V1::UsersController < ApplicationController
     }
   end
 
+  def self._index_requires_parameters
+    super.merge(
+      { local_user_list: {required: false, type: 'boolean',
+                          description: 'only list users from local database, no effect if LoginCluster is not set'} })
+  end
+
   def apply_filters(model_class=nil)
     return super if @read_users.any?(&:is_admin)
     if params[:uuid] != current_user.andand.uuid