role_store_test.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package integration
  2. import (
  3. "context"
  4. "testing"
  5. "time"
  6. "github.com/seaweedfs/seaweedfs/weed/iam/policy"
  7. "github.com/seaweedfs/seaweedfs/weed/iam/sts"
  8. "github.com/stretchr/testify/assert"
  9. "github.com/stretchr/testify/require"
  10. )
  11. func TestMemoryRoleStore(t *testing.T) {
  12. ctx := context.Background()
  13. store := NewMemoryRoleStore()
  14. // Test storing a role
  15. roleDef := &RoleDefinition{
  16. RoleName: "TestRole",
  17. RoleArn: "arn:seaweed:iam::role/TestRole",
  18. Description: "Test role for unit testing",
  19. AttachedPolicies: []string{"TestPolicy"},
  20. TrustPolicy: &policy.PolicyDocument{
  21. Version: "2012-10-17",
  22. Statement: []policy.Statement{
  23. {
  24. Effect: "Allow",
  25. Action: []string{"sts:AssumeRoleWithWebIdentity"},
  26. Principal: map[string]interface{}{
  27. "Federated": "test-provider",
  28. },
  29. },
  30. },
  31. },
  32. }
  33. err := store.StoreRole(ctx, "", "TestRole", roleDef)
  34. require.NoError(t, err)
  35. // Test retrieving the role
  36. retrievedRole, err := store.GetRole(ctx, "", "TestRole")
  37. require.NoError(t, err)
  38. assert.Equal(t, "TestRole", retrievedRole.RoleName)
  39. assert.Equal(t, "arn:seaweed:iam::role/TestRole", retrievedRole.RoleArn)
  40. assert.Equal(t, "Test role for unit testing", retrievedRole.Description)
  41. assert.Equal(t, []string{"TestPolicy"}, retrievedRole.AttachedPolicies)
  42. // Test listing roles
  43. roles, err := store.ListRoles(ctx, "")
  44. require.NoError(t, err)
  45. assert.Contains(t, roles, "TestRole")
  46. // Test deleting the role
  47. err = store.DeleteRole(ctx, "", "TestRole")
  48. require.NoError(t, err)
  49. // Verify role is deleted
  50. _, err = store.GetRole(ctx, "", "TestRole")
  51. assert.Error(t, err)
  52. }
  53. func TestRoleStoreConfiguration(t *testing.T) {
  54. // Test memory role store creation
  55. memoryStore, err := NewMemoryRoleStore(), error(nil)
  56. require.NoError(t, err)
  57. assert.NotNil(t, memoryStore)
  58. // Test filer role store creation without filerAddress in config
  59. filerStore2, err := NewFilerRoleStore(map[string]interface{}{
  60. // filerAddress not required in config
  61. "basePath": "/test/roles",
  62. }, nil)
  63. assert.NoError(t, err)
  64. assert.NotNil(t, filerStore2)
  65. // Test filer role store creation with valid config
  66. filerStore, err := NewFilerRoleStore(map[string]interface{}{
  67. "filerAddress": "localhost:8888",
  68. "basePath": "/test/roles",
  69. }, nil)
  70. require.NoError(t, err)
  71. assert.NotNil(t, filerStore)
  72. }
  73. func TestDistributedIAMManagerWithRoleStore(t *testing.T) {
  74. ctx := context.Background()
  75. // Create IAM manager with role store configuration
  76. config := &IAMConfig{
  77. STS: &sts.STSConfig{
  78. TokenDuration: sts.FlexibleDuration{time.Duration(3600) * time.Second},
  79. MaxSessionLength: sts.FlexibleDuration{time.Duration(43200) * time.Second},
  80. Issuer: "test-issuer",
  81. SigningKey: []byte("test-signing-key-32-characters-long"),
  82. },
  83. Policy: &policy.PolicyEngineConfig{
  84. DefaultEffect: "Deny",
  85. StoreType: "memory",
  86. },
  87. Roles: &RoleStoreConfig{
  88. StoreType: "memory",
  89. },
  90. }
  91. iamManager := NewIAMManager()
  92. err := iamManager.Initialize(config, func() string {
  93. return "localhost:8888" // Mock filer address for testing
  94. })
  95. require.NoError(t, err)
  96. // Test creating a role
  97. roleDef := &RoleDefinition{
  98. RoleName: "DistributedTestRole",
  99. RoleArn: "arn:seaweed:iam::role/DistributedTestRole",
  100. Description: "Test role for distributed IAM",
  101. AttachedPolicies: []string{"S3ReadOnlyPolicy"},
  102. }
  103. err = iamManager.CreateRole(ctx, "", "DistributedTestRole", roleDef)
  104. require.NoError(t, err)
  105. // Test that role is accessible through the IAM manager
  106. // Note: We can't directly test GetRole as it's not exposed,
  107. // but we can test through IsActionAllowed which internally uses the role store
  108. assert.True(t, iamManager.initialized)
  109. }