Files
es-demo/operations/index/ism_test.go
mouseleee fc14798af5 feat: 增加ism管理接口
test: 索引模板和ism的单元测试和集成测试
2025-11-16 23:00:31 +08:00

335 lines
6.9 KiB
Go

package index
import (
"context"
"testing"
"es-demo/client"
"es-demo/config"
)
// setupISMIntegrationTest loads configuration and creates a client for ISM integration tests.
func setupISMIntegrationTest(t *testing.T) *client.Client {
t.Helper()
// Load configuration from project root
if err := config.Load("../../.env"); err != nil {
t.Logf("warning: failed to load .env file: %v", err)
}
cfg := &client.Config{
Endpoint: config.Endpoint,
Region: config.Region,
AccessKey: config.AccessKey,
SecretKey: config.SecretKey,
}
c, err := client.NewClient(cfg)
if err != nil {
t.Fatalf("failed to create client: %v", err)
}
return c
}
// TestISMPutPolicy tests creating and updating ISM policies.
func TestISMPutPolicy(t *testing.T) {
if testing.Short() {
t.Skip("skipping integration test in short mode")
}
c := setupISMIntegrationTest(t)
// Create policy manager
pm := NewISMPolicyManager(c)
// Test policy
testPolicy := &Policy{
Description: "Test ISM policy",
DefaultState: "hot",
States: []State{
{
Name: "hot",
Actions: []Action{
NewAction("rollover", map[string]interface{}{
"min_index_age": "1d",
}),
},
Transitions: []Transition{
{
StateName: "delete",
Conditions: &Conditions{
MinIndexAge: "7d",
},
},
},
},
{
Name: "delete",
Actions: []Action{
NewAction("delete", map[string]interface{}{}),
},
},
},
ISMTemplate: []ISMTemplate{
{
IndexPatterns: []string{"test-*"},
Priority: 100,
},
},
}
ctx := context.Background()
policyName := "test-ism-policy"
// Create policy
if err := pm.PutPolicy(ctx, policyName, testPolicy); err != nil {
t.Fatalf("PutPolicy() error = %v", err)
}
// Cleanup
defer func() {
if err := pm.DeletePolicy(ctx, policyName); err != nil {
t.Logf("cleanup: failed to delete policy: %v", err)
}
}()
t.Logf("Successfully created ISM policy: %s", policyName)
}
// TestISMGetPolicy tests retrieving ISM policies.
func TestISMGetPolicy(t *testing.T) {
if testing.Short() {
t.Skip("skipping integration test in short mode")
}
c := setupISMIntegrationTest(t)
pm := NewISMPolicyManager(c)
ctx := context.Background()
policyName := "test-get-policy"
// Create a policy first
testPolicy := &Policy{
Description: "Test get policy",
DefaultState: "hot",
States: []State{
{
Name: "hot",
Actions: []Action{
NewAction("rollover", map[string]interface{}{
"min_index_age": "1d",
}),
},
},
},
}
if err := pm.PutPolicy(ctx, policyName, testPolicy); err != nil {
t.Fatalf("setup: failed to create policy: %v", err)
}
defer func() {
if err := pm.DeletePolicy(ctx, policyName); err != nil {
t.Logf("cleanup: failed to delete policy: %v", err)
}
}()
// Get the policy
retrievedPolicy, err := pm.GetPolicy(ctx, policyName)
if err != nil {
t.Fatalf("GetPolicy() error = %v", err)
}
if retrievedPolicy.Description != testPolicy.Description {
t.Errorf("Description = %v, want %v", retrievedPolicy.Description, testPolicy.Description)
}
if retrievedPolicy.DefaultState != testPolicy.DefaultState {
t.Errorf("DefaultState = %v, want %v", retrievedPolicy.DefaultState, testPolicy.DefaultState)
}
if len(retrievedPolicy.States) != len(testPolicy.States) {
t.Errorf("States count = %v, want %v", len(retrievedPolicy.States), len(testPolicy.States))
}
}
// TestISMDeletePolicy tests deleting ISM policies.
func TestISMDeletePolicy(t *testing.T) {
if testing.Short() {
t.Skip("skipping integration test in short mode")
}
c := setupISMIntegrationTest(t)
pm := NewISMPolicyManager(c)
ctx := context.Background()
policyName := "test-delete-policy"
// Create a policy
testPolicy := &Policy{
Description: "Test delete policy",
DefaultState: "hot",
States: []State{
{
Name: "hot",
},
},
}
if err := pm.PutPolicy(ctx, policyName, testPolicy); err != nil {
t.Fatalf("setup: failed to create policy: %v", err)
}
// Delete the policy
if err := pm.DeletePolicy(ctx, policyName); err != nil {
t.Fatalf("DeletePolicy() error = %v", err)
}
// Verify it's deleted
_, err := pm.GetPolicy(ctx, policyName)
if err == nil {
t.Error("GetPolicy() should return error for deleted policy")
}
}
// TestISMListPolicies tests listing all ISM policies.
func TestISMListPolicies(t *testing.T) {
if testing.Short() {
t.Skip("skipping integration test in short mode")
}
c := setupISMIntegrationTest(t)
pm := NewISMPolicyManager(c)
ctx := context.Background()
// List policies
policies, err := pm.ListPolicies(ctx)
if err != nil {
t.Fatalf("ListPolicies() error = %v", err)
}
t.Logf("Found %d policies", len(policies))
// Create a test policy to verify it appears in the list
policyName := "test-list-policy"
testPolicy := &Policy{
Description: "Test list policy",
DefaultState: "hot",
States: []State{
{
Name: "hot",
},
},
}
if err := pm.PutPolicy(ctx, policyName, testPolicy); err != nil {
t.Fatalf("setup: failed to create policy: %v", err)
}
defer func() {
if err := pm.DeletePolicy(ctx, policyName); err != nil {
t.Logf("cleanup: failed to delete policy: %v", err)
}
}()
// List again and verify the new policy exists
policies, err = pm.ListPolicies(ctx)
if err != nil {
t.Fatalf("ListPolicies() error = %v", err)
}
if _, exists := policies[policyName]; !exists {
t.Errorf("ListPolicies() should include policy %q", policyName)
}
}
// TestPolicy_Validate tests policy validation.
func TestPolicy_Validate(t *testing.T) {
tests := []struct {
name string
policy *Policy
wantErr bool
}{
{
name: "valid ISM policy",
policy: &Policy{
Description: "Test policy",
DefaultState: "hot",
States: []State{
{Name: "hot"},
{Name: "warm"},
},
},
wantErr: false,
},
{
name: "nil policy",
policy: nil,
wantErr: true,
},
{
name: "missing default_state",
policy: &Policy{
States: []State{
{Name: "hot"},
},
},
wantErr: true,
},
{
name: "default_state not in states",
policy: &Policy{
DefaultState: "cold",
States: []State{
{Name: "hot"},
{Name: "warm"},
},
},
wantErr: true,
},
{
name: "no states or phases",
policy: &Policy{
Description: "Empty policy",
},
wantErr: true,
},
{
name: "both ISM and ILM defined",
policy: &Policy{
DefaultState: "hot",
States: []State{{Name: "hot"}},
Phases: map[string]Phase{
"hot": {},
},
},
wantErr: true,
},
{
name: "valid ILM policy",
policy: &Policy{
Phases: map[string]Phase{
"hot": {
MinAge: "0ms",
},
"delete": {
MinAge: "30d",
},
},
},
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := tt.policy.Validate()
if (err != nil) != tt.wantErr {
t.Errorf("Policy.Validate() error = %v, wantErr %v", err, tt.wantErr)
}
})
}
}