This is an automated email from the ASF dual-hosted git repository.

littlecui pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-service-center.git


The following commit(s) were added to refs/heads/master by this push:
     new 1885b50c Change:  add old role migrate function, old role has config 
permission default (#1355)
1885b50c is described below

commit 1885b50c6f5d347fa2fbc8cf5cc8014ba90b46ac
Author: kkf1 <[email protected]>
AuthorDate: Wed Nov 9 21:25:20 2022 +0800

    Change:  add old role migrate function, old role has config permission 
default (#1355)
    
    * Change: sc gov-resource pass-through Authorization to kie
    
    * Change: sc gov-resource pass-through Authorization to kie
---
 datasource/etcd/role.go             | 39 ++++++++++++++++++++++++
 datasource/etcd/role_test.go        | 61 +++++++++++++++++++++++++++++++++++--
 datasource/mongo/role.go            |  4 +++
 datasource/rbac/role.go             |  1 +
 server/service/rbac/permission.go   |  2 +-
 server/service/rbac/rbac.go         |  1 +
 server/service/rbac/resource.go     |  1 +
 server/service/rbac/role_service.go | 21 +++++++++++++
 8 files changed, 126 insertions(+), 4 deletions(-)

diff --git a/datasource/etcd/role.go b/datasource/etcd/role.go
index d58d60c0..ec2233cb 100644
--- a/datasource/etcd/role.go
+++ b/datasource/etcd/role.go
@@ -20,6 +20,7 @@ package etcd
 import (
        "context"
        "encoding/json"
+       "fmt"
        "strconv"
        "time"
 
@@ -32,6 +33,17 @@ import (
        "github.com/apache/servicecomb-service-center/datasource/rbac"
        "github.com/apache/servicecomb-service-center/pkg/log"
        "github.com/apache/servicecomb-service-center/pkg/util"
+       rbacsvc 
"github.com/apache/servicecomb-service-center/server/service/rbac"
+)
+
+const isMigrated = "/cse-sr/role-migrated"
+
+var (
+       resources   = crbac.BuildResourceList(rbacsvc.ResourceConfig)
+       configPerms = &crbac.Permission{
+               Resources: resources,
+               Verbs:     []string{"*"},
+       }
 )
 
 func (rm *RbacDAO) CreateRole(ctx context.Context, r *crbac.Role) error {
@@ -156,3 +168,30 @@ func (rm *RbacDAO) UpdateRole(ctx context.Context, name 
string, role *crbac.Role
        opts = append(opts, syncOpts...)
        return etcdadpt.Txn(ctx, opts)
 }
+func (rm *RbacDAO) MigrateOldRoles(ctx context.Context) error {
+       exist, err := etcdadpt.Exist(ctx, isMigrated)
+       if err != nil {
+               return err
+       }
+       if exist {
+               return nil
+       }
+       rs, _, err := rbac.Instance().ListRole(ctx)
+       if err != nil {
+               return err
+       }
+       for _, role := range rs {
+               role.Perms = append(role.Perms, configPerms)
+               err = rbac.Instance().UpdateRole(ctx, role.Name, role)
+               if err != nil {
+                       log.Error(fmt.Sprintf("edit role [%s] info faied", 
role.Name), err)
+                       return err
+               }
+       }
+       err = etcdadpt.Put(ctx, isMigrated, "true")
+       if err != nil {
+               log.Error("can not save migrated flag", err)
+               return err
+       }
+       return nil
+}
diff --git a/datasource/etcd/role_test.go b/datasource/etcd/role_test.go
index 24f8e2d6..a5848957 100644
--- a/datasource/etcd/role_test.go
+++ b/datasource/etcd/role_test.go
@@ -22,9 +22,6 @@ import (
        "strconv"
        "testing"
 
-       crbac "github.com/go-chassis/cari/rbac"
-       "github.com/stretchr/testify/assert"
-
        "github.com/apache/servicecomb-service-center/datasource"
        "github.com/apache/servicecomb-service-center/datasource/rbac"
        "github.com/apache/servicecomb-service-center/eventbase/model"
@@ -32,6 +29,9 @@ import (
        
"github.com/apache/servicecomb-service-center/eventbase/service/tombstone"
        "github.com/apache/servicecomb-service-center/pkg/util"
        _ "github.com/apache/servicecomb-service-center/test"
+       crbac "github.com/go-chassis/cari/rbac"
+       "github.com/little-cui/etcdadpt"
+       "github.com/stretchr/testify/assert"
 )
 
 func roleContext() context.Context {
@@ -126,4 +126,59 @@ func TestSyncRole(t *testing.T) {
 
                        })
        })
+
+       t.Run("migrate old role", func(t *testing.T) {
+               t.Run("create two roles, then migrate them, and migrate again, 
should paas test", func(t *testing.T) {
+                       ctx := context.Background()
+                       r4 := crbac.Role{
+                               ID:    "migrate-44444",
+                               Name:  "migrate-role-44444",
+                               Perms: nil,
+                       }
+                       r5 := crbac.Role{
+                               ID:    "migrate-55555",
+                               Name:  "migrate-role-55555",
+                               Perms: nil,
+                       }
+
+                       err := rbac.Instance().CreateRole(ctx, &r4)
+                       assert.NoError(t, err)
+                       err = rbac.Instance().CreateRole(ctx, &r5)
+                       assert.NoError(t, err)
+                       r, err := rbac.Instance().GetRole(ctx, 
"migrate-role-44444")
+                       assert.NoError(t, err)
+                       assert.Equal(t, 0, len(r.Perms))
+                       r, err = rbac.Instance().GetRole(ctx, 
"migrate-role-55555")
+                       assert.NoError(t, err)
+                       assert.Equal(t, 0, len(r.Perms))
+
+                       _, err = etcdadpt.Delete(ctx, "/cse-sr/role-migrated")
+                       assert.NoError(t, err)
+                       err = rbac.Instance().MigrateOldRoles(ctx)
+                       assert.NoError(t, err)
+
+                       r, err = rbac.Instance().GetRole(ctx, 
"migrate-role-44444")
+                       assert.NoError(t, err)
+                       assert.Equal(t, r.Perms[0].Resources[0].Type, "config")
+                       assert.Equal(t, r.Perms[0].Verbs[0], "*")
+                       r, err = rbac.Instance().GetRole(ctx, 
"migrate-role-55555")
+                       assert.NoError(t, err)
+                       assert.Equal(t, r.Perms[0].Resources[0].Type, "config")
+                       assert.Equal(t, r.Perms[0].Verbs[0], "*")
+
+                       err = rbac.Instance().MigrateOldRoles(ctx)
+                       assert.NoError(t, err)
+                       r, err = rbac.Instance().GetRole(ctx, 
"migrate-role-44444")
+                       assert.NoError(t, err)
+                       assert.Equal(t, 1, len(r.Perms))
+                       r, err = rbac.Instance().GetRole(ctx, 
"migrate-role-55555")
+                       assert.NoError(t, err)
+                       assert.Equal(t, 1, len(r.Perms))
+
+                       _, err = rbac.Instance().DeleteRole(ctx, r4.Name)
+                       assert.NoError(t, err)
+                       _, err = rbac.Instance().DeleteRole(ctx, r5.Name)
+                       assert.NoError(t, err)
+               })
+       })
 }
diff --git a/datasource/mongo/role.go b/datasource/mongo/role.go
index e1e96785..022696f7 100644
--- a/datasource/mongo/role.go
+++ b/datasource/mongo/role.go
@@ -165,3 +165,7 @@ func updateRoleTxn(ctx context.Context, filter bson.M, 
updateFilter bson.M, role
                return sync.DoUpdateOpts(sessionContext, 
datasource.ResourceRole, role)
        })
 }
+
+func (ds *RbacDAO) MigrateOldRoles(ctx context.Context) error {
+       return nil
+}
diff --git a/datasource/rbac/role.go b/datasource/rbac/role.go
index c06dd09d..6b640a1c 100644
--- a/datasource/rbac/role.go
+++ b/datasource/rbac/role.go
@@ -38,4 +38,5 @@ type RoleManager interface {
        ListRole(ctx context.Context) ([]*rbac.Role, int64, error)
        DeleteRole(ctx context.Context, name string) (bool, error)
        UpdateRole(ctx context.Context, name string, role *rbac.Role) error
+       MigrateOldRoles(ctx context.Context) error
 }
diff --git a/server/service/rbac/permission.go 
b/server/service/rbac/permission.go
index e229bb1c..9efe05d9 100644
--- a/server/service/rbac/permission.go
+++ b/server/service/rbac/permission.go
@@ -36,7 +36,7 @@ var (
 // AdminPerms allocate all resource permissions
 func AdminPerms() []*rbac.Permission {
        resources := rbac.BuildResourceList(
-               ResourceAccount, ResourceRole,
+               ResourceAccount, ResourceConfig, ResourceRole,
                ResourceService, ResourceGovern, ResourceOps, ResourceSchema)
        perm := []*rbac.Permission{
                {
diff --git a/server/service/rbac/rbac.go b/server/service/rbac/rbac.go
index 20d91bcd..cd9e8a68 100644
--- a/server/service/rbac/rbac.go
+++ b/server/service/rbac/rbac.go
@@ -57,6 +57,7 @@ func Init() {
        if err != nil {
                log.Fatal("can not enable auth module", err)
        }
+       migrateOldRoles()
        // build-in role init
        initBuildInRole()
        initBuildInAccount()
diff --git a/server/service/rbac/resource.go b/server/service/rbac/resource.go
index 7e902395..238b13d5 100644
--- a/server/service/rbac/resource.go
+++ b/server/service/rbac/resource.go
@@ -29,6 +29,7 @@ import (
 
 const (
        ResourceAccount = "account"
+       ResourceConfig  = "config"
        ResourceRole    = "role"
        ResourceService = "service"
        ResourceGovern  = "governance"
diff --git a/server/service/rbac/role_service.go 
b/server/service/rbac/role_service.go
index 658370e7..e4f08e27 100644
--- a/server/service/rbac/role_service.go
+++ b/server/service/rbac/role_service.go
@@ -32,6 +32,8 @@ import (
        rbacmodel "github.com/go-chassis/cari/rbac"
 )
 
+const isMigrated = "/cse-sr/role-migrated-lock"
+
 func CreateRole(ctx context.Context, r *rbacmodel.Role) error {
        err := validator.ValidateCreateRole(r)
        if err != nil {
@@ -157,3 +159,22 @@ func RoleUsage(ctx context.Context) (int64, error) {
        }
        return used, nil
 }
+
+func migrateOldRoles() {
+       if err := dlock.Lock(isMigrated, -1); err != nil {
+               log.Error("old role is migrating", err)
+               return
+       }
+       defer func() {
+               if err := dlock.Unlock(isMigrated); err != nil {
+                       log.Error("unlock failed", err)
+               }
+       }()
+
+       err := rbac.Instance().MigrateOldRoles(context.Background())
+       if err != nil {
+               log.Error("migrate old role failed", err)
+               return
+       }
+       log.Info("migrate old role success")
+}

Reply via email to