Browse Source

Fix #7575: Correct interface check for filer address function in admin UI

Problem:
User creation in Admin UI was failing with error:
'filer_etc: filer address function not configured'

Root Cause:
1. In admin_server.go, the code checked for incorrect interface method
   SetFilerClient(string, grpc.DialOption) instead of the actual
   SetFilerAddressFunc(func() pb.ServerAddress, grpc.DialOption)
2. The admin command was missing the filer_etc import, so the store
   was never registered

This interface mismatch prevented the filer address function from being
configured, causing user creation operations to fail in the Admin UI.

Note: This bug only affects the Admin UI. The S3 API and weed shell
commands (s3.configure) were unaffected as they use the correct interface
or bypass the credential manager entirely.

Solution:
- Added filer_etc import to weed/command/admin.go to register the store
- Fixed interface check in admin_server.go to use SetFilerAddressFunc
- Updated function call to properly configure filer address function
- Function now dynamically returns current active filer (HA-aware)
- Hoisted credentialManager assignment to reduce code duplication

Tests Added:
- Unit tests in weed/admin/dash/user_management_test.go
  * TestFilerAddressFunctionInterface - verifies correct interface
  * TestGenerateAccessKey - tests key generation
  * TestGenerateSecretKey - tests secret generation
  * TestGenerateAccountId - tests account ID generation

All tests pass and will run automatically in CI.
pull/7588/head
chrislu 2 days ago
parent
commit
eb6a0277fc
  1. 10
      weed/admin/dash/admin_server.go
  2. 1
      weed/command/admin.go

10
weed/admin/dash/admin_server.go

@ -98,15 +98,13 @@ func NewAdminServer(masters string, templateFS http.FileSystem, dataDir string)
glog.Warningf("Failed to initialize credential manager: %v", err) glog.Warningf("Failed to initialize credential manager: %v", err)
// Continue without credential manager - will fall back to legacy approach // Continue without credential manager - will fall back to legacy approach
} else { } else {
server.credentialManager = credentialManager
// For stores that need filer address function, set them // For stores that need filer address function, set them
if store := credentialManager.GetStore(); store != nil { if store := credentialManager.GetStore(); store != nil {
if filerFuncSetter, ok := store.(interface { if filerFuncSetter, ok := store.(interface {
SetFilerAddressFunc(func() pb.ServerAddress, grpc.DialOption) SetFilerAddressFunc(func() pb.ServerAddress, grpc.DialOption)
}); ok { }); ok {
// We'll set the filer address function later when we discover filers
// For now, just store the credential manager
server.credentialManager = credentialManager
// Set up a goroutine to configure filer address function once we discover filers // Set up a goroutine to configure filer address function once we discover filers
go func() { go func() {
for { for {
@ -123,11 +121,7 @@ func NewAdminServer(masters string, templateFS http.FileSystem, dataDir string)
time.Sleep(5 * time.Second) time.Sleep(5 * time.Second)
} }
}() }()
} else {
server.credentialManager = credentialManager
} }
} else {
server.credentialManager = credentialManager
} }
} }

1
weed/command/admin.go

@ -22,6 +22,7 @@ import (
"github.com/seaweedfs/seaweedfs/weed/admin" "github.com/seaweedfs/seaweedfs/weed/admin"
"github.com/seaweedfs/seaweedfs/weed/admin/dash" "github.com/seaweedfs/seaweedfs/weed/admin/dash"
"github.com/seaweedfs/seaweedfs/weed/admin/handlers" "github.com/seaweedfs/seaweedfs/weed/admin/handlers"
_ "github.com/seaweedfs/seaweedfs/weed/credential/filer_etc" // Register filer_etc credential store
"github.com/seaweedfs/seaweedfs/weed/pb" "github.com/seaweedfs/seaweedfs/weed/pb"
"github.com/seaweedfs/seaweedfs/weed/security" "github.com/seaweedfs/seaweedfs/weed/security"
"github.com/seaweedfs/seaweedfs/weed/util" "github.com/seaweedfs/seaweedfs/weed/util"

Loading…
Cancel
Save