Skip to content

Commit

Permalink
Optimize: refactor rbac datasource interface (#1189)
Browse files Browse the repository at this point in the history
  • Loading branch information
little-cui committed Dec 29, 2021
1 parent f450576 commit 7243b23
Show file tree
Hide file tree
Showing 33 changed files with 541 additions and 489 deletions.
121 changes: 0 additions & 121 deletions datasource/account_test.go

This file was deleted.

3 changes: 0 additions & 3 deletions datasource/datasource.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,6 @@ package datasource
// DataSource is the DAO layer
type DataSource interface {
SystemManager() SystemManager
AccountManager() AccountManager
AccountLockManager() AccountLockManager
RoleManager() RoleManager
DependencyManager() DependencyManager
MetadataManager() MetadataManager
SCManager() SCManager
Expand Down
46 changes: 28 additions & 18 deletions datasource/etcd/account.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,21 +22,31 @@ import (
"strconv"
"time"

"github.com/apache/servicecomb-service-center/datasource"
"github.com/apache/servicecomb-service-center/datasource/etcd/path"
"github.com/apache/servicecomb-service-center/datasource/rbac"
"github.com/apache/servicecomb-service-center/pkg/etcdsync"
"github.com/apache/servicecomb-service-center/pkg/log"
"github.com/apache/servicecomb-service-center/pkg/privacy"
"github.com/apache/servicecomb-service-center/pkg/util"
"github.com/go-chassis/cari/rbac"
rbacmodel "github.com/go-chassis/cari/rbac"
"github.com/go-chassis/foundation/stringutil"
"github.com/little-cui/etcdadpt"
)

type AccountManager struct {
func init() {
rbac.Install("etcd", NewRbacDAO)
rbac.Install("embeded_etcd", NewRbacDAO)
rbac.Install("embedded_etcd", NewRbacDAO)
}

func (ds *AccountManager) CreateAccount(ctx context.Context, a *rbac.Account) error {
func NewRbacDAO(opts rbac.Options) (rbac.DAO, error) {
return &RbacDAO{}, nil
}

type RbacDAO struct {
}

func (ds *RbacDAO) CreateAccount(ctx context.Context, a *rbacmodel.Account) error {
lock, err := etcdsync.Lock("/account-creating/"+a.Name, -1, false)
if err != nil {
return fmt.Errorf("account %s is creating", a.Name)
Expand All @@ -53,7 +63,7 @@ func (ds *AccountManager) CreateAccount(ctx context.Context, a *rbac.Account) er
return err
}
if exist {
return datasource.ErrAccountDuplicated
return rbac.ErrAccountDuplicated
}
a.Password, err = privacy.ScryptPassword(a.Password)
if err != nil {
Expand All @@ -78,7 +88,7 @@ func (ds *AccountManager) CreateAccount(ctx context.Context, a *rbac.Account) er
log.Info("create new account: " + a.ID)
return nil
}
func GenAccountOpts(a *rbac.Account, action etcdadpt.Action) ([]etcdadpt.OpOptions, error) {
func GenAccountOpts(a *rbacmodel.Account, action etcdadpt.Action) ([]etcdadpt.OpOptions, error) {
opts := make([]etcdadpt.OpOptions, 0)
value, err := json.Marshal(a)
if err != nil {
Expand All @@ -100,18 +110,18 @@ func GenAccountOpts(a *rbac.Account, action etcdadpt.Action) ([]etcdadpt.OpOptio

return opts, nil
}
func (ds *AccountManager) AccountExist(ctx context.Context, name string) (bool, error) {
func (ds *RbacDAO) AccountExist(ctx context.Context, name string) (bool, error) {
return etcdadpt.Exist(ctx, path.GenerateRBACAccountKey(name))
}
func (ds *AccountManager) GetAccount(ctx context.Context, name string) (*rbac.Account, error) {
func (ds *RbacDAO) GetAccount(ctx context.Context, name string) (*rbacmodel.Account, error) {
kv, err := etcdadpt.Get(ctx, path.GenerateRBACAccountKey(name))
if err != nil {
return nil, err
}
if kv == nil {
return nil, datasource.ErrAccountNotExist
return nil, rbac.ErrAccountNotExist
}
account := &rbac.Account{}
account := &rbacmodel.Account{}
err = json.Unmarshal(kv.Value, account)
if err != nil {
log.Error("account info format invalid", err)
Expand All @@ -121,7 +131,7 @@ func (ds *AccountManager) GetAccount(ctx context.Context, name string) (*rbac.Ac
return account, nil
}

func (ds *AccountManager) compatibleOldVersionAccount(a *rbac.Account) {
func (ds *RbacDAO) compatibleOldVersionAccount(a *rbacmodel.Account) {
// old version use Role, now use Roles
// Role/Roles will not exist at the same time
if len(a.Role) == 0 {
Expand All @@ -131,14 +141,14 @@ func (ds *AccountManager) compatibleOldVersionAccount(a *rbac.Account) {
a.Role = ""
}

func (ds *AccountManager) ListAccount(ctx context.Context) ([]*rbac.Account, int64, error) {
func (ds *RbacDAO) ListAccount(ctx context.Context) ([]*rbacmodel.Account, int64, error) {
kvs, n, err := etcdadpt.List(ctx, path.GenerateRBACAccountKey(""))
if err != nil {
return nil, 0, err
}
accounts := make([]*rbac.Account, 0, n)
accounts := make([]*rbacmodel.Account, 0, n)
for _, v := range kvs {
a := &rbac.Account{}
a := &rbacmodel.Account{}
err = json.Unmarshal(v.Value, a)
if err != nil {
log.Error("account info format invalid:", err)
Expand All @@ -150,7 +160,7 @@ func (ds *AccountManager) ListAccount(ctx context.Context) ([]*rbac.Account, int
}
return accounts, n, nil
}
func (ds *AccountManager) DeleteAccount(ctx context.Context, names []string) (bool, error) {
func (ds *RbacDAO) DeleteAccount(ctx context.Context, names []string) (bool, error) {
if len(names) == 0 {
return false, nil
}
Expand All @@ -172,13 +182,13 @@ func (ds *AccountManager) DeleteAccount(ctx context.Context, names []string) (bo
}
err = etcdadpt.Txn(ctx, opts)
if err != nil {
log.Error(datasource.ErrDeleteAccountFailed.Error(), err)
log.Error(rbac.ErrDeleteAccountFailed.Error(), err)
return false, err
}
}
return true, nil
}
func (ds *AccountManager) UpdateAccount(ctx context.Context, name string, account *rbac.Account) error {
func (ds *RbacDAO) UpdateAccount(ctx context.Context, name string, account *rbacmodel.Account) error {
var (
opts []etcdadpt.OpOptions
err error
Expand Down Expand Up @@ -216,7 +226,7 @@ func (ds *AccountManager) UpdateAccount(ctx context.Context, name string, accoun
return err
}

func hasRole(account *rbac.Account, r string) bool {
func hasRole(account *rbacmodel.Account, r string) bool {
for _, n := range account.Roles {
if r == n {
return true
Expand Down
31 changes: 12 additions & 19 deletions datasource/etcd/account_lock.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,13 @@ import (
"encoding/json"
"fmt"

"github.com/apache/servicecomb-service-center/datasource"
"github.com/apache/servicecomb-service-center/datasource/etcd/path"
"github.com/apache/servicecomb-service-center/datasource/rbac"
"github.com/apache/servicecomb-service-center/pkg/log"
"github.com/little-cui/etcdadpt"
)

type AccountLockManager struct {
}

func (al AccountLockManager) UpsertLock(ctx context.Context, lock *datasource.AccountLock) error {
func (al *RbacDAO) UpsertLock(ctx context.Context, lock *rbac.Lock) error {
value, err := json.Marshal(lock)
if err != nil {
log.Error("account lock is invalid", err)
Expand All @@ -46,15 +43,15 @@ func (al AccountLockManager) UpsertLock(ctx context.Context, lock *datasource.Ac
return nil
}

func (al AccountLockManager) GetLock(ctx context.Context, key string) (*datasource.AccountLock, error) {
func (al *RbacDAO) GetLock(ctx context.Context, key string) (*rbac.Lock, error) {
kv, err := etcdadpt.Get(ctx, path.GenerateAccountLockKey(key))
if err != nil {
return nil, err
}
if kv == nil {
return nil, datasource.ErrAccountLockNotExist
return nil, rbac.ErrAccountLockNotExist
}
lock := &datasource.AccountLock{}
lock := &rbac.Lock{}
err = json.Unmarshal(kv.Value, lock)
if err != nil {
log.Error(fmt.Sprintf("key %s format invalid", key), err)
Expand All @@ -63,14 +60,14 @@ func (al AccountLockManager) GetLock(ctx context.Context, key string) (*datasour
return lock, nil
}

func (al AccountLockManager) ListLock(ctx context.Context) ([]*datasource.AccountLock, int64, error) {
func (al *RbacDAO) ListLock(ctx context.Context) ([]*rbac.Lock, int64, error) {
kvs, n, err := etcdadpt.List(ctx, path.GenerateAccountLockKey(""))
if err != nil {
return nil, 0, err
}
locks := make([]*datasource.AccountLock, 0, n)
locks := make([]*rbac.Lock, 0, n)
for _, v := range kvs {
lock := &datasource.AccountLock{}
lock := &rbac.Lock{}
err = json.Unmarshal(v.Value, lock)
if err != nil {
log.Error("account lock info format invalid:", err)
Expand All @@ -81,17 +78,17 @@ func (al AccountLockManager) ListLock(ctx context.Context) ([]*datasource.Accoun
return locks, n, nil
}

func (al AccountLockManager) DeleteLock(ctx context.Context, key string) error {
func (al *RbacDAO) DeleteLock(ctx context.Context, key string) error {
_, err := etcdadpt.Delete(ctx, path.GenerateAccountLockKey(key))
if err != nil {
log.Error(fmt.Sprintf("remove lock %s failed", key), err)
return datasource.ErrCannotReleaseLock
return rbac.ErrCannotReleaseLock
}
log.Info(fmt.Sprintf("%s is released", key))
return nil
}

func (al AccountLockManager) DeleteLockList(ctx context.Context, keys []string) error {
func (al *RbacDAO) DeleteLockList(ctx context.Context, keys []string) error {
var opts []etcdadpt.OpOptions
for _, key := range keys {
opts = append(opts, etcdadpt.OpDel(etcdadpt.WithStrKey(path.GenerateAccountLockKey(key))))
Expand All @@ -102,12 +99,8 @@ func (al AccountLockManager) DeleteLockList(ctx context.Context, keys []string)
err := etcdadpt.Txn(ctx, opts)
if err != nil {
log.Error(fmt.Sprintf("remove locks %v failed", keys), err)
return datasource.ErrCannotReleaseLock
return rbac.ErrCannotReleaseLock
}
log.Info(fmt.Sprintf("%v are released", keys))
return nil
}

func NewAccountLockManager() datasource.AccountLockManager {
return &AccountLockManager{}
}
Loading

0 comments on commit 7243b23

Please sign in to comment.