| package test |
| |
| import ( |
| "os" |
| "os/exec" |
| "testing" |
| |
| "github.com/stretchr/testify/require" |
| "gopkg.in/yaml.v2" |
| ) |
| |
| type replicas struct { |
| Replicas int `yaml:"replicas"` |
| } |
| type loki struct { |
| Storage struct { |
| Type string `yaml:"type"` |
| } `yaml:"storage"` |
| } |
| |
| type values struct { |
| DeploymentMode string `yaml:"deploymentMode"` |
| Backend replicas `yaml:"backend"` |
| Compactor replicas `yaml:"compactor"` |
| Distributor replicas `yaml:"distributor"` |
| IndexGateway replicas `yaml:"indexGateway"` |
| Ingester replicas `yaml:"ingester"` |
| Querier replicas `yaml:"querier"` |
| QueryFrontend replicas `yaml:"queryFrontend"` |
| QueryScheduler replicas `yaml:"queryScheduler"` |
| Read replicas `yaml:"read"` |
| Ruler replicas `yaml:"ruler"` |
| SingleBinary replicas `yaml:"singleBinary"` |
| Write replicas `yaml:"write"` |
| |
| Loki loki `yaml:"loki"` |
| } |
| |
| func templateConfig(t *testing.T, vals values) error { |
| y, err := yaml.Marshal(&vals) |
| require.NoError(t, err) |
| require.Greater(t, len(y), 0) |
| |
| f, err := os.CreateTemp("", "values.yaml") |
| require.NoError(t, err) |
| |
| _, err = f.Write(y) |
| require.NoError(t, err) |
| |
| cmd := exec.Command("helm", "dependency", "build") |
| // Dependency build needs to be run from the parent directory where the chart is located. |
| cmd.Dir = "../" |
| var cmdOutput []byte |
| if cmdOutput, err = cmd.CombinedOutput(); err != nil { |
| t.Log("dependency build failed", "err", string(cmdOutput)) |
| return err |
| } |
| |
| cmd = exec.Command("helm", "template", "../", "--values", f.Name()) |
| if cmdOutput, err := cmd.CombinedOutput(); err != nil { |
| t.Log("template failed", "err", string(cmdOutput)) |
| return err |
| } |
| |
| return nil |
| } |
| |
| // E.Welch these tests fail because the templateConfig function above can't resolve the chart dependencies and I'm not sure how to fix this.... |
| |
| //func Test_InvalidConfigs(t *testing.T) { |
| // t.Run("running both single binary and scalable targets", func(t *testing.T) { |
| // vals := values{ |
| // SingleBinary: replicas{Replicas: 1}, |
| // Write: replicas{Replicas: 1}, |
| // Loki: loki{ |
| // Storage: struct { |
| // Type string `yaml:"type"` |
| // }{Type: "gcs"}, |
| // }, |
| // } |
| // require.Error(t, templateConfig(t, vals)) |
| // }) |
| // |
| // t.Run("running both single binary and distributed targets", func(t *testing.T) { |
| // vals := values{ |
| // SingleBinary: replicas{Replicas: 1}, |
| // Distributor: replicas{Replicas: 1}, |
| // Loki: loki{ |
| // Storage: struct { |
| // Type string `yaml:"type"` |
| // }{Type: "gcs"}, |
| // }, |
| // } |
| // require.Error(t, templateConfig(t, vals)) |
| // }) |
| // |
| // t.Run("running both scalable and distributed targets", func(t *testing.T) { |
| // vals := values{ |
| // Read: replicas{Replicas: 1}, |
| // Distributor: replicas{Replicas: 1}, |
| // Loki: loki{ |
| // Storage: struct { |
| // Type string `yaml:"type"` |
| // }{Type: "gcs"}, |
| // }, |
| // } |
| // require.Error(t, templateConfig(t, vals)) |
| // }) |
| // |
| // t.Run("running scalable with filesystem storage", func(t *testing.T) { |
| // vals := values{ |
| // Read: replicas{Replicas: 1}, |
| // Loki: loki{ |
| // Storage: struct { |
| // Type string `yaml:"type"` |
| // }{Type: "filesystem"}, |
| // }, |
| // } |
| // |
| // require.Error(t, templateConfig(t, vals)) |
| // }) |
| // |
| // t.Run("running distributed with filesystem storage", func(t *testing.T) { |
| // vals := values{ |
| // Distributor: replicas{Replicas: 1}, |
| // Loki: loki{ |
| // Storage: struct { |
| // Type string `yaml:"type"` |
| // }{Type: "filesystem"}, |
| // }, |
| // } |
| // |
| // require.Error(t, templateConfig(t, vals)) |
| // }) |
| //} |
| // |
| //func Test_ValidConfigs(t *testing.T) { |
| // t.Run("single binary", func(t *testing.T) { |
| // vals := values{ |
| // |
| // DeploymentMode: "SingleBinary", |
| // |
| // SingleBinary: replicas{Replicas: 1}, |
| // |
| // Backend: replicas{Replicas: 0}, |
| // Compactor: replicas{Replicas: 0}, |
| // Distributor: replicas{Replicas: 0}, |
| // IndexGateway: replicas{Replicas: 0}, |
| // Ingester: replicas{Replicas: 0}, |
| // Querier: replicas{Replicas: 0}, |
| // QueryFrontend: replicas{Replicas: 0}, |
| // QueryScheduler: replicas{Replicas: 0}, |
| // Read: replicas{Replicas: 0}, |
| // Ruler: replicas{Replicas: 0}, |
| // Write: replicas{Replicas: 0}, |
| // |
| // Loki: loki{ |
| // Storage: struct { |
| // Type string `yaml:"type"` |
| // }{Type: "filesystem"}, |
| // }, |
| // } |
| // require.NoError(t, templateConfig(t, vals)) |
| // }) |
| // |
| // t.Run("scalable", func(t *testing.T) { |
| // vals := values{ |
| // |
| // DeploymentMode: "SimpleScalable", |
| // |
| // Backend: replicas{Replicas: 1}, |
| // Read: replicas{Replicas: 1}, |
| // Write: replicas{Replicas: 1}, |
| // |
| // Compactor: replicas{Replicas: 0}, |
| // Distributor: replicas{Replicas: 0}, |
| // IndexGateway: replicas{Replicas: 0}, |
| // Ingester: replicas{Replicas: 0}, |
| // Querier: replicas{Replicas: 0}, |
| // QueryFrontend: replicas{Replicas: 0}, |
| // QueryScheduler: replicas{Replicas: 0}, |
| // Ruler: replicas{Replicas: 0}, |
| // SingleBinary: replicas{Replicas: 0}, |
| // |
| // Loki: loki{ |
| // Storage: struct { |
| // Type string `yaml:"type"` |
| // }{Type: "gcs"}, |
| // }, |
| // } |
| // require.NoError(t, templateConfig(t, vals)) |
| // }) |
| // |
| // t.Run("distributed", func(t *testing.T) { |
| // vals := values{ |
| // DeploymentMode: "Distributed", |
| // |
| // Compactor: replicas{Replicas: 1}, |
| // Distributor: replicas{Replicas: 1}, |
| // IndexGateway: replicas{Replicas: 1}, |
| // Ingester: replicas{Replicas: 1}, |
| // Querier: replicas{Replicas: 1}, |
| // QueryFrontend: replicas{Replicas: 1}, |
| // QueryScheduler: replicas{Replicas: 1}, |
| // Ruler: replicas{Replicas: 1}, |
| // |
| // Backend: replicas{Replicas: 0}, |
| // Read: replicas{Replicas: 0}, |
| // SingleBinary: replicas{Replicas: 0}, |
| // Write: replicas{Replicas: 0}, |
| // |
| // Loki: loki{ |
| // Storage: struct { |
| // Type string `yaml:"type"` |
| // }{Type: "gcs"}, |
| // }, |
| // } |
| // require.NoError(t, templateConfig(t, vals)) |
| // }) |
| //} |