You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.2 KiB
85 lines
2.2 KiB
package memory
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/seaweedfs/seaweedfs/weed/credential"
|
|
"github.com/seaweedfs/seaweedfs/weed/pb/iam_pb"
|
|
)
|
|
|
|
func (store *MemoryStore) CreateServiceAccount(ctx context.Context, sa *iam_pb.ServiceAccount) error {
|
|
store.mu.Lock()
|
|
defer store.mu.Unlock()
|
|
|
|
if _, exists := store.serviceAccounts[sa.Id]; exists {
|
|
return fmt.Errorf("service account already exists")
|
|
}
|
|
store.serviceAccounts[sa.Id] = sa
|
|
if sa.Credential != nil && sa.Credential.AccessKey != "" {
|
|
store.serviceAccountAccessKeys[sa.Credential.AccessKey] = sa.Id
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (store *MemoryStore) UpdateServiceAccount(ctx context.Context, id string, sa *iam_pb.ServiceAccount) error {
|
|
store.mu.Lock()
|
|
defer store.mu.Unlock()
|
|
|
|
_, exists := store.serviceAccounts[id]
|
|
if !exists {
|
|
return credential.ErrServiceAccountNotFound
|
|
}
|
|
if sa.Id != id {
|
|
return fmt.Errorf("service account ID mismatch")
|
|
}
|
|
|
|
// Update access key index: remove any existing keys for this SA
|
|
for k, v := range store.serviceAccountAccessKeys {
|
|
if v == id {
|
|
delete(store.serviceAccountAccessKeys, k)
|
|
}
|
|
}
|
|
|
|
store.serviceAccounts[id] = sa
|
|
|
|
if sa.Credential != nil && sa.Credential.AccessKey != "" {
|
|
store.serviceAccountAccessKeys[sa.Credential.AccessKey] = sa.Id
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (store *MemoryStore) DeleteServiceAccount(ctx context.Context, id string) error {
|
|
store.mu.Lock()
|
|
defer store.mu.Unlock()
|
|
|
|
if sa, ok := store.serviceAccounts[id]; ok {
|
|
if sa.Credential != nil && sa.Credential.AccessKey != "" {
|
|
delete(store.serviceAccountAccessKeys, sa.Credential.AccessKey)
|
|
}
|
|
delete(store.serviceAccounts, id)
|
|
return nil
|
|
}
|
|
return credential.ErrServiceAccountNotFound
|
|
}
|
|
|
|
func (store *MemoryStore) GetServiceAccount(ctx context.Context, id string) (*iam_pb.ServiceAccount, error) {
|
|
store.mu.RLock()
|
|
defer store.mu.RUnlock()
|
|
|
|
if sa, exists := store.serviceAccounts[id]; exists {
|
|
return sa, nil
|
|
}
|
|
return nil, credential.ErrServiceAccountNotFound
|
|
}
|
|
|
|
func (store *MemoryStore) ListServiceAccounts(ctx context.Context) ([]*iam_pb.ServiceAccount, error) {
|
|
store.mu.RLock()
|
|
defer store.mu.RUnlock()
|
|
|
|
var accounts []*iam_pb.ServiceAccount
|
|
for _, sa := range store.serviceAccounts {
|
|
accounts = append(accounts, sa)
|
|
}
|
|
return accounts, nil
|
|
}
|