rbac_backup_test.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. // Licensed to the LF AI & Data foundation under one
  2. // or more contributor license agreements. See the NOTICE file
  3. // distributed with this work for additional information
  4. // regarding copyright ownership. The ASF licenses this file
  5. // to you under the Apache License, Version 2.0 (the
  6. // "License"); you may not use this file except in compliance
  7. // with the License. You may obtain a copy of the License at
  8. //
  9. // http://www.apache.org/licenses/LICENSE-2.0
  10. //
  11. // Unless required by applicable law or agreed to in writing, software
  12. // distributed under the License is distributed on an "AS IS" BASIS,
  13. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. // See the License for the specific language governing permissions and
  15. // limitations under the License.
  16. package rbac
  17. import (
  18. "context"
  19. "strings"
  20. "testing"
  21. "github.com/stretchr/testify/suite"
  22. "google.golang.org/grpc/metadata"
  23. "github.com/milvus-io/milvus-proto/go-api/v2/commonpb"
  24. "github.com/milvus-io/milvus-proto/go-api/v2/milvuspb"
  25. "github.com/milvus-io/milvus/pkg/util"
  26. "github.com/milvus-io/milvus/pkg/util/crypto"
  27. "github.com/milvus-io/milvus/pkg/util/merr"
  28. "github.com/milvus-io/milvus/pkg/util/paramtable"
  29. "github.com/milvus-io/milvus/tests/integration"
  30. )
  31. const (
  32. dim = 128
  33. dbName = ""
  34. collectionName = "test_load_collection"
  35. )
  36. type RBACBackupTestSuite struct {
  37. integration.MiniClusterSuite
  38. }
  39. func (s *RBACBackupTestSuite) SetupSuite() {
  40. paramtable.Init()
  41. paramtable.Get().Save(paramtable.Get().QueryCoordCfg.BalanceCheckInterval.Key, "1000")
  42. paramtable.Get().Save(paramtable.Get().QueryNodeCfg.GracefulStopTimeout.Key, "1")
  43. paramtable.Get().Save(paramtable.Get().CommonCfg.AuthorizationEnabled.Key, "true")
  44. s.Require().NoError(s.SetupEmbedEtcd())
  45. }
  46. func GetContext(ctx context.Context, originValue string) context.Context {
  47. authKey := strings.ToLower(util.HeaderAuthorize)
  48. authValue := crypto.Base64Encode(originValue)
  49. contextMap := map[string]string{
  50. authKey: authValue,
  51. }
  52. md := metadata.New(contextMap)
  53. return metadata.NewIncomingContext(ctx, md)
  54. }
  55. func (s *RBACBackupTestSuite) TestBackup() {
  56. ctx := GetContext(context.Background(), "root:123456")
  57. // test empty rbac content
  58. resp, err := s.Cluster.Proxy.BackupRBAC(ctx, &milvuspb.BackupRBACMetaRequest{})
  59. s.NoError(err)
  60. s.True(merr.Ok(resp.GetStatus()))
  61. s.Equal("", resp.GetRBACMeta().String())
  62. // generate some rbac content
  63. roleName := "test_role"
  64. resp1, err := s.Cluster.Proxy.CreateRole(ctx, &milvuspb.CreateRoleRequest{
  65. Entity: &milvuspb.RoleEntity{
  66. Name: roleName,
  67. },
  68. })
  69. s.NoError(err)
  70. s.True(merr.Ok(resp1))
  71. resp2, err := s.Cluster.Proxy.OperatePrivilege(ctx, &milvuspb.OperatePrivilegeRequest{
  72. Type: milvuspb.OperatePrivilegeType_Grant,
  73. Entity: &milvuspb.GrantEntity{
  74. Role: &milvuspb.RoleEntity{Name: roleName},
  75. Object: &milvuspb.ObjectEntity{Name: commonpb.ObjectType_Collection.String()},
  76. ObjectName: util.AnyWord,
  77. DbName: util.AnyWord,
  78. Grantor: &milvuspb.GrantorEntity{
  79. User: &milvuspb.UserEntity{Name: util.UserRoot},
  80. Privilege: &milvuspb.PrivilegeEntity{Name: "Search"},
  81. },
  82. },
  83. })
  84. s.NoError(err)
  85. s.True(merr.Ok(resp2))
  86. s.Equal("", resp2.GetReason())
  87. userName := "test_user"
  88. passwd := "test_passwd"
  89. resp3, err := s.Cluster.Proxy.CreateCredential(ctx, &milvuspb.CreateCredentialRequest{
  90. Username: userName,
  91. Password: crypto.Base64Encode(passwd),
  92. })
  93. s.NoError(err)
  94. s.True(merr.Ok(resp3))
  95. resp4, err := s.Cluster.Proxy.OperateUserRole(ctx, &milvuspb.OperateUserRoleRequest{
  96. Username: userName,
  97. RoleName: roleName,
  98. })
  99. s.NoError(err)
  100. s.True(merr.Ok(resp4))
  101. // test back up rbac
  102. resp5, err := s.Cluster.Proxy.BackupRBAC(ctx, &milvuspb.BackupRBACMetaRequest{})
  103. s.NoError(err)
  104. s.True(merr.Ok(resp5.GetStatus()))
  105. // test restore, expect to failed due to role/user already exist
  106. resp6, err := s.Cluster.Proxy.RestoreRBAC(ctx, &milvuspb.RestoreRBACMetaRequest{
  107. RBACMeta: resp5.GetRBACMeta(),
  108. })
  109. s.NoError(err)
  110. s.False(merr.Ok(resp6))
  111. // drop exist role/user, successful to restore
  112. resp7, err := s.Cluster.Proxy.OperatePrivilege(ctx, &milvuspb.OperatePrivilegeRequest{
  113. Type: milvuspb.OperatePrivilegeType_Revoke,
  114. Entity: &milvuspb.GrantEntity{
  115. Role: &milvuspb.RoleEntity{Name: roleName},
  116. Object: &milvuspb.ObjectEntity{Name: commonpb.ObjectType_Collection.String()},
  117. ObjectName: util.AnyWord,
  118. DbName: util.AnyWord,
  119. Grantor: &milvuspb.GrantorEntity{
  120. User: &milvuspb.UserEntity{Name: util.UserRoot},
  121. Privilege: &milvuspb.PrivilegeEntity{Name: "Search"},
  122. },
  123. },
  124. })
  125. s.NoError(err)
  126. s.True(merr.Ok(resp7))
  127. resp8, err := s.Cluster.Proxy.DropRole(ctx, &milvuspb.DropRoleRequest{
  128. RoleName: roleName,
  129. })
  130. s.NoError(err)
  131. s.True(merr.Ok(resp8))
  132. resp9, err := s.Cluster.Proxy.DeleteCredential(ctx, &milvuspb.DeleteCredentialRequest{
  133. Username: userName,
  134. })
  135. s.NoError(err)
  136. s.True(merr.Ok(resp9))
  137. resp10, err := s.Cluster.Proxy.RestoreRBAC(ctx, &milvuspb.RestoreRBACMetaRequest{
  138. RBACMeta: resp5.GetRBACMeta(),
  139. })
  140. s.NoError(err)
  141. s.True(merr.Ok(resp10))
  142. // check the restored rbac, should be same as the original one
  143. resp11, err := s.Cluster.Proxy.BackupRBAC(ctx, &milvuspb.BackupRBACMetaRequest{})
  144. s.NoError(err)
  145. s.True(merr.Ok(resp11.GetStatus()))
  146. s.Equal(resp11.GetRBACMeta().String(), resp5.GetRBACMeta().String())
  147. // clean rbac meta
  148. resp12, err := s.Cluster.Proxy.OperatePrivilege(ctx, &milvuspb.OperatePrivilegeRequest{
  149. Type: milvuspb.OperatePrivilegeType_Revoke,
  150. Entity: &milvuspb.GrantEntity{
  151. Role: &milvuspb.RoleEntity{Name: roleName},
  152. Object: &milvuspb.ObjectEntity{Name: commonpb.ObjectType_Collection.String()},
  153. ObjectName: util.AnyWord,
  154. DbName: util.AnyWord,
  155. Grantor: &milvuspb.GrantorEntity{
  156. User: &milvuspb.UserEntity{Name: util.UserRoot},
  157. Privilege: &milvuspb.PrivilegeEntity{Name: "Search"},
  158. },
  159. },
  160. })
  161. s.NoError(err)
  162. s.True(merr.Ok(resp12))
  163. resp13, err := s.Cluster.Proxy.DropRole(ctx, &milvuspb.DropRoleRequest{
  164. RoleName: roleName,
  165. })
  166. s.NoError(err)
  167. s.True(merr.Ok(resp13))
  168. resp14, err := s.Cluster.Proxy.DeleteCredential(ctx, &milvuspb.DeleteCredentialRequest{
  169. Username: userName,
  170. })
  171. s.NoError(err)
  172. s.True(merr.Ok(resp14))
  173. }
  174. func TestRBACBackup(t *testing.T) {
  175. suite.Run(t, new(RBACBackupTestSuite))
  176. }