Skip to content
This repository was archived by the owner on Nov 7, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ci/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ services:
volumes:
- ./quesma/logs/:/var/quesma/logs
- ../examples/kibana-sample-data/quesma/config/local-dev.yaml:/mnt/ci-config.yaml
restart: unless-stopped
restart: on-failure
log-generator:
build: log-generator
image: log-generator:latest
Expand Down
2 changes: 1 addition & 1 deletion ci/e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ services:
- "9200:8080"
volumes:
- ./quesma/config/ci-config.yaml:/mnt/ci-config.yaml
restart: unless-stopped
restart: on-failure
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.11.1
container_name: elasticsearch
Expand Down
5 changes: 4 additions & 1 deletion cmd/experimental/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,10 @@ func main() {
signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)
doneCh := make(chan struct{})

var newConfiguration = config.LoadV2Config()
var newConfiguration, configErr = config.LoadV2Config()
if configErr != nil {
return // We log error in LoadV2Config
}
var cfg = newConfiguration.TranslateToLegacyConfig()

if err := cfg.Validate(); err != nil {
Expand Down
5 changes: 4 additions & 1 deletion cmd/experimental/v2_quesma_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,10 @@ import (
// BuildNewQuesma creates a new quesma instance with both Ingest And Query Processors, unused yet
func BuildNewQuesma() quesma_api.QuesmaBuilder {

var newConfiguration = config.LoadV2Config()
var newConfiguration, configErr = config.LoadV2Config()
if configErr != nil {
os.Exit(0) // We log error in LoadV2Config, likely replace with returning an error
}
var cfg = newConfiguration.TranslateToLegacyConfig()

if err := cfg.Validate(); err != nil {
Expand Down
5 changes: 4 additions & 1 deletion cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,10 @@ func main() {
signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)
doneCh := make(chan struct{})

var newConfiguration = config.LoadV2Config()
var newConfiguration, configErr = config.LoadV2Config()
if configErr != nil {
return // We log error in LoadV2Config
}
var cfg = newConfiguration.TranslateToLegacyConfig()

if err := cfg.Validate(); err != nil {
Expand Down
5 changes: 4 additions & 1 deletion cmd/v2_quesma_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,10 @@ import (
// BuildNewQuesma creates a new quesma instance with both Ingest And Query Processors, unused yet
func BuildNewQuesma() quesma_api.QuesmaBuilder {

var newConfiguration = config.LoadV2Config()
var newConfiguration, configErr = config.LoadV2Config()
if configErr != nil {
os.Exit(0) // We log error in LoadV2Config, likely replace with returning an error
}
var cfg = newConfiguration.TranslateToLegacyConfig()

if err := cfg.Validate(); err != nil {
Expand Down
2 changes: 1 addition & 1 deletion examples/kibana-sample-data/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ services:
resources:
limits:
memory: 512M
restart: unless-stopped
restart: on-failure
log-generator:
build: log-generator
depends_on:
Expand Down
11 changes: 6 additions & 5 deletions platform/config/config_v2.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,21 +152,23 @@ func (p *QuesmaProcessorConfig) IsFieldMapSyntaxEnabled(indexName string) bool {
return false
}

func LoadV2Config() QuesmaNewConfiguration {
func LoadV2Config() (QuesmaNewConfiguration, error) {
var v2config QuesmaNewConfiguration
loadConfigFile()
// We have to use custom env provider to allow array overrides
if err := k.Load(Env2JsonProvider("QUESMA_", "_", nil), json.Parser(), koanf.WithMergeFunc(mergeDictFunc)); err != nil {
log.Fatalf("error loading config form supplied env vars: %v", err)
log.Printf("error loading config form supplied env vars: %v", err)
return v2config, err
}
if err := k.Unmarshal("", &v2config); err != nil {
log.Fatalf("error unmarshalling config: %v", err)
}

if err := v2config.Validate(); err != nil {
log.Fatalf("Config validation failed: %v", err)
log.Printf("Config validation failed: %v", err)
return v2config, err
}
return v2config
return v2config, nil
}

// validate at this level verifies the basic assumptions behind pipelines/processors/connectors,
Expand All @@ -189,7 +191,6 @@ func (c *QuesmaNewConfiguration) Validate() error {
var multiErr *multierror.Error
if errors.As(errAcc, &multiErr) {
if len(multiErr.Errors) > 0 {
log.Fatalf("Config validation failed: %v", multiErr)
return multiErr
}
}
Expand Down
89 changes: 27 additions & 62 deletions platform/config/config_v2_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,15 @@ import (
"testing"
)

func loadConfig(t *testing.T) QuesmaNewConfiguration {
cfg, cfgErr := LoadV2Config()
assert.NoError(t, cfgErr, "error loading config")
if err := cfg.Validate(); err != nil {
t.Fatalf("error validating config: %v", err)
}
return cfg
}

func TestQuesmaConfigurationLoading(t *testing.T) {

os.Setenv(configFileLocationEnvVar, "./test_configs/test_config_v2.yaml")
Expand All @@ -26,11 +35,7 @@ func TestQuesmaConfigurationLoading(t *testing.T) {
os.Unsetenv("QUESMA_licenseKey")
os.Unsetenv("QUESMA_backendConnectors_1_config_user")
})
cfg := LoadV2Config()
if err := cfg.Validate(); err != nil {
t.Fatalf("error validating config: %v", err)
}

cfg := loadConfig(t)
legacyCfg := cfg.TranslateToLegacyConfig()

assert.Equal(t, licenseKeyPassedAsEnvVar, legacyCfg.LicenseKey)
Expand Down Expand Up @@ -74,10 +79,7 @@ func TestQuesmaConfigurationLoading(t *testing.T) {

func TestQuesmaTransparentProxyConfiguration(t *testing.T) {
os.Setenv(configFileLocationEnvVar, "./test_configs/quesma_as_transparent_proxy.yml")
cfg := LoadV2Config()
if err := cfg.Validate(); err != nil {
t.Fatalf("error validating config: %v", err)
}
cfg := loadConfig(t)
legacyConf := cfg.TranslateToLegacyConfig()
assert.True(t, legacyConf.TransparentProxy)
assert.Equal(t, false, legacyConf.EnableIngest)
Expand All @@ -88,10 +90,8 @@ func TestQuesmaTransparentProxyWithoutNoopConfiguration(t *testing.T) {
t.Skip("not working yet")

os.Setenv(configFileLocationEnvVar, "./test_configs/quesma_as_transparent_proxy_without_noop.yml")
cfg := LoadV2Config()
if err := cfg.Validate(); err != nil {
t.Fatalf("error validating config: %v", err)
}
cfg := loadConfig(t)

legacyConf := cfg.TranslateToLegacyConfig()
assert.False(t, legacyConf.TransparentProxy) // even though transparent proxy would work similarly, the user explicitly requested two Quesma pipelines
assert.Equal(t, 2, len(legacyConf.IndexConfig))
Expand All @@ -109,10 +109,7 @@ func TestQuesmaTransparentProxyWithoutNoopConfiguration(t *testing.T) {

func TestQuesmaAddingHydrolixTablesToExistingElasticsearch(t *testing.T) {
os.Setenv(configFileLocationEnvVar, "./test_configs/quesma_adding_two_hydrolix_tables.yaml")
cfg := LoadV2Config()
if err := cfg.Validate(); err != nil {
t.Fatalf("error validating config: %v", err)
}
cfg := loadConfig(t)
legacyConf := cfg.TranslateToLegacyConfig()
assert.False(t, legacyConf.TransparentProxy)
assert.Equal(t, 2, len(legacyConf.IndexConfig))
Expand All @@ -130,10 +127,7 @@ func TestQuesmaAddingHydrolixTablesToExistingElasticsearch(t *testing.T) {

func TestIngestWithSingleConnector(t *testing.T) {
os.Setenv(configFileLocationEnvVar, "./test_configs/ingest_with_single_connector.yaml")
cfg := LoadV2Config()
if err := cfg.Validate(); err != nil {
t.Fatalf("error validating config: %v", err)
}
cfg := loadConfig(t)
legacyConf := cfg.TranslateToLegacyConfig()
assert.False(t, legacyConf.TransparentProxy)
assert.Equal(t, 2, len(legacyConf.IndexConfig))
Expand All @@ -151,10 +145,7 @@ func TestIngestWithSingleConnector(t *testing.T) {

func TestQuesmaHydrolixQueryOnly(t *testing.T) {
os.Setenv(configFileLocationEnvVar, "./test_configs/quesma_hydrolix_tables_query_only.yaml")
cfg := LoadV2Config()
if err := cfg.Validate(); err != nil {
t.Fatalf("error validating config: %v", err)
}
cfg := loadConfig(t)
legacyConf := cfg.TranslateToLegacyConfig()
assert.False(t, legacyConf.TransparentProxy)
assert.Equal(t, 2, len(legacyConf.IndexConfig))
Expand All @@ -175,10 +166,7 @@ func TestQuesmaHydrolixQueryOnly(t *testing.T) {

func TestHasCommonTable(t *testing.T) {
os.Setenv(configFileLocationEnvVar, "./test_configs/has_common_table.yaml")
cfg := LoadV2Config()
if err := cfg.Validate(); err != nil {
t.Fatalf("error validating config: %v", err)
}
cfg := loadConfig(t)
legacyConf := cfg.TranslateToLegacyConfig()

assert.Equal(t, true, legacyConf.EnableIngest)
Expand All @@ -187,7 +175,8 @@ func TestHasCommonTable(t *testing.T) {

func TestInvalidDualTarget(t *testing.T) {
os.Setenv(configFileLocationEnvVar, "./test_configs/invalid_dual_target.yaml")
cfg := LoadV2Config()
cfg, cfgErr := LoadV2Config()
assert.NoError(t, cfgErr, "error loading config")
if err := cfg.Validate(); err != nil {

if !strings.Contains(err.Error(), "has invalid dual query target configuration - when you specify two targets") {
Expand Down Expand Up @@ -233,10 +222,7 @@ func TestMatchName(t *testing.T) {

func TestTargetNewVariant(t *testing.T) {
os.Setenv(configFileLocationEnvVar, "./test_configs/target_new_variant.yaml")
cfg := LoadV2Config()
if err := cfg.Validate(); err != nil {
t.Fatalf("error validating config: %v", err)
}
cfg := loadConfig(t)
legacyConf := cfg.TranslateToLegacyConfig()
assert.False(t, legacyConf.TransparentProxy)
assert.Equal(t, 4, len(legacyConf.IndexConfig))
Expand Down Expand Up @@ -271,10 +257,7 @@ func TestTargetNewVariant(t *testing.T) {

func TestTargetLegacyVariant(t *testing.T) {
os.Setenv(configFileLocationEnvVar, "./test_configs/target_legacy_variant.yaml")
cfg := LoadV2Config()
if err := cfg.Validate(); err != nil {
t.Fatalf("error validating config: %v", err)
}
cfg := loadConfig(t)
legacyConf := cfg.TranslateToLegacyConfig()
assert.False(t, legacyConf.TransparentProxy)
assert.Equal(t, 3, len(legacyConf.IndexConfig))
Expand All @@ -300,10 +283,7 @@ func TestTargetLegacyVariant(t *testing.T) {

func TestUseCommonTableGlobalProperty(t *testing.T) {
os.Setenv(configFileLocationEnvVar, "./test_configs/use_common_table_global_property.yaml")
cfg := LoadV2Config()
if err := cfg.Validate(); err != nil {
t.Fatalf("error validating config: %v", err)
}
cfg := loadConfig(t)
legacyConf := cfg.TranslateToLegacyConfig()
assert.False(t, legacyConf.TransparentProxy)
assert.Equal(t, 2, len(legacyConf.IndexConfig))
Expand All @@ -322,10 +302,7 @@ func TestUseCommonTableGlobalProperty(t *testing.T) {

func TestIngestOptimizers(t *testing.T) {
os.Setenv(configFileLocationEnvVar, "./test_configs/ingest_only_optimizers.yaml")
cfg := LoadV2Config()
if err := cfg.Validate(); err != nil {
t.Fatalf("error validating config: %v", err)
}
cfg := loadConfig(t)
legacyConf := cfg.TranslateToLegacyConfig()
assert.False(t, legacyConf.TransparentProxy)
assert.Equal(t, 1, len(legacyConf.IndexConfig))
Expand All @@ -343,10 +320,7 @@ func TestIngestOptimizers(t *testing.T) {

func TestPartitionBy(t *testing.T) {
os.Setenv(configFileLocationEnvVar, "./test_configs/partition_by.yaml")
cfg := LoadV2Config()
if err := cfg.Validate(); err != nil {
t.Fatalf("error validating config: %v", err)
}
cfg := loadConfig(t)
legacyConf := cfg.TranslateToLegacyConfig()

assert.Equal(t, 2, len(legacyConf.IndexConfig))
Expand All @@ -363,10 +337,7 @@ func TestPartitionBy(t *testing.T) {
func TestIndexNameRewriteRules(t *testing.T) {

os.Setenv(configFileLocationEnvVar, "./test_configs/index_name_rewrite_rules.yaml")
cfg := LoadV2Config()
if err := cfg.Validate(); err != nil {
t.Fatalf("error validating config: %v", err)
}
cfg := loadConfig(t)
legacyConf := cfg.TranslateToLegacyConfig()

assert.Equal(t, 4, len(legacyConf.IndexNameRewriteRules))
Expand All @@ -383,10 +354,7 @@ func TestIndexNameRewriteRules(t *testing.T) {

func TestStringColumnIsTextDefaultBehavior(t *testing.T) {
os.Setenv(configFileLocationEnvVar, "./test_configs/partition_by.yaml")
cfg := LoadV2Config()
if err := cfg.Validate(); err != nil {
t.Fatalf("error validating config: %v", err)
}
cfg := loadConfig(t)
legacyConf := cfg.TranslateToLegacyConfig()

assert.Equal(t, "text", legacyConf.DefaultStringColumnType)
Expand All @@ -395,10 +363,7 @@ func TestStringColumnIsTextDefaultBehavior(t *testing.T) {

func TestStringColumnIsKeyword(t *testing.T) {
os.Setenv(configFileLocationEnvVar, "./test_configs/string_column_is_keyword_field.yaml")
cfg := LoadV2Config()
if err := cfg.Validate(); err != nil {
t.Fatalf("error validating config: %v", err)
}
cfg := loadConfig(t)
legacyConf := cfg.TranslateToLegacyConfig()

assert.Equal(t, "keyword", legacyConf.DefaultStringColumnType)
Expand Down
3 changes: 2 additions & 1 deletion platform/config/env2json_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ func TestEnv2Json_arraysByName(t *testing.T) {
os.Unsetenv("QUESMA_backendConnectors_my-clickhouse-data-source_config_password")
})

cfg := LoadV2Config()
cfg, err := LoadV2Config()
assert.NoError(t, err)
assert.Len(t, cfg.BackendConnectors, 2)
clickHouseBackend := cfg.BackendConnectors[1]
assert.Equal(t, "my-clickhouse-data-source", clickHouseBackend.Name)
Expand Down
Loading