Skip to content

Commit 3059fae

Browse files
fix: [2.5] fix restore rbac empty meta crash (#39143)
cp from master: #39141 related: #38985 Signed-off-by: shaoting-huang <[email protected]>
1 parent 0aa592b commit 3059fae

File tree

3 files changed

+25
-18
lines changed

3 files changed

+25
-18
lines changed

internal/metastore/kv/rootcoord/kv_catalog.go

+17-17
Original file line numberDiff line numberDiff line change
@@ -1489,7 +1489,7 @@ func (kc *Catalog) RestoreRBAC(ctx context.Context, tenant string, meta *milvusp
14891489
log.Ctx(ctx).Warn("failed to restore rbac, try to rollback", zap.Error(err))
14901490
// roll back role
14911491
for _, role := range needRollbackRole {
1492-
err = kc.DropRole(ctx, tenant, role.Name)
1492+
err = kc.DropRole(ctx, tenant, role.GetName())
14931493
if err != nil {
14941494
log.Ctx(ctx).Warn("failed to rollback roles after restore failed", zap.Error(err))
14951495
}
@@ -1505,15 +1505,15 @@ func (kc *Catalog) RestoreRBAC(ctx context.Context, tenant string, meta *milvusp
15051505

15061506
for _, user := range needRollbackUser {
15071507
// roll back user
1508-
err = kc.DropCredential(ctx, user.User)
1508+
err = kc.DropCredential(ctx, user.GetUser())
15091509
if err != nil {
15101510
log.Ctx(ctx).Warn("failed to rollback users after restore failed", zap.Error(err))
15111511
}
15121512
}
15131513

15141514
// roll back privilege group
15151515
for _, group := range needRollbackPrivilegeGroups {
1516-
err = kc.DropPrivilegeGroup(ctx, group.GroupName)
1516+
err = kc.DropPrivilegeGroup(ctx, group.GetGroupName())
15171517
if err != nil {
15181518
log.Ctx(ctx).Warn("failed to rollback privilege groups after restore failed", zap.Error(err))
15191519
}
@@ -1527,7 +1527,7 @@ func (kc *Catalog) RestoreRBAC(ctx context.Context, tenant string, meta *milvusp
15271527
return err
15281528
}
15291529
existRoleMap := lo.SliceToMap(existRoles, func(entity *milvuspb.RoleResult) (string, struct{}) { return entity.GetRole().GetName(), struct{}{} })
1530-
for _, role := range meta.Roles {
1530+
for _, role := range meta.GetRoles() {
15311531
if _, ok := existRoleMap[role.GetName()]; ok {
15321532
log.Ctx(ctx).Warn("failed to restore, role already exists", zap.String("role", role.GetName()))
15331533
err = errors.Newf("role [%s] already exists", role.GetName())
@@ -1545,11 +1545,11 @@ func (kc *Catalog) RestoreRBAC(ctx context.Context, tenant string, meta *milvusp
15451545
if err != nil {
15461546
return err
15471547
}
1548-
existPrivGroupMap := lo.SliceToMap(existPrivGroups, func(entity *milvuspb.PrivilegeGroupInfo) (string, struct{}) { return entity.GroupName, struct{}{} })
1549-
for _, group := range meta.PrivilegeGroups {
1550-
if _, ok := existPrivGroupMap[group.GroupName]; ok {
1551-
log.Ctx(ctx).Warn("failed to restore, privilege group already exists", zap.String("group", group.GroupName))
1552-
err = errors.Newf("privilege group [%s] already exists", group.GroupName)
1548+
existPrivGroupMap := lo.SliceToMap(existPrivGroups, func(entity *milvuspb.PrivilegeGroupInfo) (string, struct{}) { return entity.GetGroupName(), struct{}{} })
1549+
for _, group := range meta.GetPrivilegeGroups() {
1550+
if _, ok := existPrivGroupMap[group.GetGroupName()]; ok {
1551+
log.Ctx(ctx).Warn("failed to restore, privilege group already exists", zap.String("group", group.GetGroupName()))
1552+
err = errors.Newf("privilege group [%s] already exists", group.GetGroupName())
15531553
return err
15541554
}
15551555
err = kc.SavePrivilegeGroup(ctx, group)
@@ -1564,9 +1564,9 @@ func (kc *Catalog) RestoreRBAC(ctx context.Context, tenant string, meta *milvusp
15641564
if err != nil {
15651565
return err
15661566
}
1567-
existPrivGroupMap = lo.SliceToMap(existPrivGroups, func(entity *milvuspb.PrivilegeGroupInfo) (string, struct{}) { return entity.GroupName, struct{}{} })
1568-
for _, grant := range meta.Grants {
1569-
privName := grant.Grantor.Privilege.Name
1567+
existPrivGroupMap = lo.SliceToMap(existPrivGroups, func(entity *milvuspb.PrivilegeGroupInfo) (string, struct{}) { return entity.GetGroupName(), struct{}{} })
1568+
for _, grant := range meta.GetGrants() {
1569+
privName := grant.GetGrantor().GetPrivilege().GetName()
15701570
if util.IsPrivilegeNameDefined(privName) {
15711571
grant.Grantor.Privilege.Name = util.PrivilegeNameForMetastore(privName)
15721572
} else if _, ok := existPrivGroupMap[privName]; ok {
@@ -1589,16 +1589,16 @@ func (kc *Catalog) RestoreRBAC(ctx context.Context, tenant string, meta *milvusp
15891589
return err
15901590
}
15911591
existUserMap := lo.SliceToMap(existUser, func(entity *milvuspb.UserResult) (string, struct{}) { return entity.GetUser().GetName(), struct{}{} })
1592-
for _, user := range meta.Users {
1592+
for _, user := range meta.GetUsers() {
15931593
if _, ok := existUserMap[user.GetUser()]; ok {
15941594
log.Ctx(ctx).Info("failed to restore, user already exists", zap.String("user", user.GetUser()))
15951595
err = errors.Newf("user [%s] already exists", user.GetUser())
15961596
return err
15971597
}
15981598
// restore user
15991599
err = kc.CreateCredential(ctx, &model.Credential{
1600-
Username: user.User,
1601-
EncryptedPassword: user.Password,
1600+
Username: user.GetUser(),
1601+
EncryptedPassword: user.GetPassword(),
16021602
})
16031603
if err != nil {
16041604
return err
@@ -1607,9 +1607,9 @@ func (kc *Catalog) RestoreRBAC(ctx context.Context, tenant string, meta *milvusp
16071607

16081608
// restore user role mapping
16091609
entity := &milvuspb.UserEntity{
1610-
Name: user.User,
1610+
Name: user.GetUser(),
16111611
}
1612-
for _, role := range user.Roles {
1612+
for _, role := range user.GetRoles() {
16131613
err = kc.AlterUserRole(ctx, tenant, entity, role, milvuspb.OperateUserRoleType_AddUserToRole)
16141614
if err != nil {
16151615
return err

internal/proxy/impl.go

+3
Original file line numberDiff line numberDiff line change
@@ -5656,6 +5656,9 @@ func (node *Proxy) RestoreRBAC(ctx context.Context, req *milvuspb.RestoreRBACMet
56565656
if err := merr.CheckHealthy(node.GetStateCode()); err != nil {
56575657
return merr.Status(err), nil
56585658
}
5659+
if req.RBACMeta == nil {
5660+
return merr.Success(), nil
5661+
}
56595662

56605663
result, err := node.rootCoord.RestoreRBAC(ctx, req)
56615664
if err != nil {

tests/integration/rbac/rbac_backup_test.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,12 @@ func (s *RBACBackupTestSuite) TestBackup() {
154154
s.Equal(groupName, backupRBACResp.GetRBACMeta().PrivilegeGroups[0].GroupName)
155155
s.Equal(2, len(backupRBACResp.GetRBACMeta().PrivilegeGroups[0].Privileges))
156156

157+
restoreRBACResp, err := s.Cluster.Proxy.RestoreRBAC(ctx, &milvuspb.RestoreRBACMetaRequest{})
158+
s.NoError(err)
159+
s.True(merr.Ok(restoreRBACResp))
160+
157161
// test restore, expect to failed due to role/user already exist
158-
restoreRBACResp, err := s.Cluster.Proxy.RestoreRBAC(ctx, &milvuspb.RestoreRBACMetaRequest{
162+
restoreRBACResp, err = s.Cluster.Proxy.RestoreRBAC(ctx, &milvuspb.RestoreRBACMetaRequest{
159163
RBACMeta: backupRBACResp.GetRBACMeta(),
160164
})
161165
s.NoError(err)

0 commit comments

Comments
 (0)