Skip to content

Commit 6b7182f

Browse files
committed
internal/testrunner/runners/system: export fields query and result container type
1 parent f5ad3db commit 6b7182f

File tree

2 files changed

+120
-113
lines changed

2 files changed

+120
-113
lines changed

internal/testrunner/runners/system/tester.go

Lines changed: 113 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -41,40 +41,75 @@ import (
4141
"github.com/elastic/elastic-package/internal/wait"
4242
)
4343

44+
const FieldsQuery = `{
45+
"fields": [
46+
"*"
47+
],
48+
"runtime_mappings": {
49+
"my_ignored": {
50+
"type": "keyword",
51+
"script": {
52+
"source": "for (def v : params['_fields']._ignored.values) { emit(v); }"
53+
}
54+
}
55+
},
56+
"aggs": {
57+
"all_ignored": {
58+
"filter": {
59+
"exists": {
60+
"field": "_ignored"
61+
}
62+
},
63+
"aggs": {
64+
"ignored_fields": {
65+
"terms": {
66+
"size": 100,
67+
"field": "my_ignored"
68+
}
69+
},
70+
"ignored_docs": {
71+
"top_hits": {
72+
"size": 5
73+
}
74+
}
75+
}
76+
}
77+
}
78+
}`
79+
80+
type FieldsQueryResult struct {
81+
Hits struct {
82+
Total struct {
83+
Value int
84+
}
85+
Hits []struct {
86+
Source common.MapStr `json:"_source"`
87+
Fields common.MapStr `json:"fields"`
88+
}
89+
}
90+
Aggregations struct {
91+
AllIgnored struct {
92+
DocCount int `json:"doc_count"`
93+
IgnoredFields struct {
94+
Buckets []struct {
95+
Key string `json:"key"`
96+
} `json:"buckets"`
97+
} `json:"ignored_fields"`
98+
IgnoredDocs struct {
99+
Hits struct {
100+
Hits []common.MapStr `json:"hits"`
101+
} `json:"hits"`
102+
} `json:"ignored_docs"`
103+
} `json:"all_ignored"`
104+
} `json:"aggregations"`
105+
Error *struct {
106+
Type string
107+
Reason string
108+
}
109+
Status int
110+
}
111+
44112
const (
45-
checkFieldsBody = `{
46-
"fields": ["*"],
47-
"runtime_mappings": {
48-
"my_ignored": {
49-
"type": "keyword",
50-
"script": {
51-
"source": "for (def v : params['_fields']._ignored.values) { emit(v); }"
52-
}
53-
}
54-
},
55-
"aggs": {
56-
"all_ignored": {
57-
"filter": {
58-
"exists": {
59-
"field": "_ignored"
60-
}
61-
},
62-
"aggs": {
63-
"ignored_fields": {
64-
"terms": {
65-
"size": 100,
66-
"field": "my_ignored"
67-
}
68-
},
69-
"ignored_docs": {
70-
"top_hits": {
71-
"size": 5
72-
}
73-
}
74-
}
75-
}
76-
}
77-
}`
78113
DevDeployDir = "_dev/deploy"
79114

80115
// TestType defining system tests
@@ -764,7 +799,7 @@ func (r *tester) getDocs(ctx context.Context, dataStream string) (*hits, error)
764799
r.esAPI.Search.WithSort("@timestamp:asc"),
765800
r.esAPI.Search.WithSize(elasticsearchQuerySize),
766801
r.esAPI.Search.WithSource("true"),
767-
r.esAPI.Search.WithBody(strings.NewReader(checkFieldsBody)),
802+
r.esAPI.Search.WithBody(strings.NewReader(FieldsQuery)),
768803
r.esAPI.Search.WithIgnoreUnavailable(true),
769804
)
770805
if err != nil {
@@ -781,38 +816,7 @@ func (r *tester) getDocs(ctx context.Context, dataStream string) (*hits, error)
781816
return nil, fmt.Errorf("failed to search docs for data stream %s: %s", dataStream, resp.String())
782817
}
783818

784-
var results struct {
785-
Hits struct {
786-
Total struct {
787-
Value int
788-
}
789-
Hits []struct {
790-
Source common.MapStr `json:"_source"`
791-
Fields common.MapStr `json:"fields"`
792-
}
793-
}
794-
Aggregations struct {
795-
AllIgnored struct {
796-
DocCount int `json:"doc_count"`
797-
IgnoredFields struct {
798-
Buckets []struct {
799-
Key string `json:"key"`
800-
} `json:"buckets"`
801-
} `json:"ignored_fields"`
802-
IgnoredDocs struct {
803-
Hits struct {
804-
Hits []common.MapStr `json:"hits"`
805-
} `json:"hits"`
806-
} `json:"ignored_docs"`
807-
} `json:"all_ignored"`
808-
} `json:"aggregations"`
809-
Error *struct {
810-
Type string
811-
Reason string
812-
}
813-
Status int
814-
}
815-
819+
var results FieldsQueryResult
816820
if err := json.NewDecoder(resp.Body).Decode(&results); err != nil {
817821
return nil, fmt.Errorf("could not decode search results response: %w", err)
818822
}
@@ -1013,17 +1017,16 @@ func (r *tester) prepareScenario(ctx context.Context, config *testConfig, stackC
10131017
}
10141018

10151019
serviceOptions.DeployIndependentAgent = r.runIndependentElasticAgent
1016-
10171020
policyTemplateName := config.PolicyTemplate
10181021
if policyTemplateName == "" {
1019-
policyTemplateName, err = findPolicyTemplateForInput(*r.pkgManifest, r.dataStreamManifest, config.Input)
1022+
policyTemplateName, err = FindPolicyTemplateForInput(r.pkgManifest, r.dataStreamManifest, config.Input)
10201023
if err != nil {
10211024
return nil, fmt.Errorf("failed to determine the associated policy_template: %w", err)
10221025
}
10231026
}
10241027
scenario.policyTemplateName = policyTemplateName
10251028

1026-
policyTemplate, err := selectPolicyTemplateByName(r.pkgManifest.PolicyTemplates, scenario.policyTemplateName)
1029+
policyTemplate, err := SelectPolicyTemplateByName(r.pkgManifest.PolicyTemplates, scenario.policyTemplateName)
10271030
if err != nil {
10281031
return nil, fmt.Errorf("failed to find the selected policy_template: %w", err)
10291032
}
@@ -1074,7 +1077,7 @@ func (r *tester) prepareScenario(ctx context.Context, config *testConfig, stackC
10741077
scenario.startTestTime = time.Now()
10751078

10761079
logger.Debug("adding package data stream to test policy...")
1077-
ds, err := createPackageDatastream(*policyToTest, *r.pkgManifest, policyTemplate, r.dataStreamManifest, *config, policyToTest.Namespace)
1080+
ds, err := CreatePackageDatastream(policyToTest, r.pkgManifest, policyTemplate, r.dataStreamManifest, config.Input, config.Vars, config.DataStream.Vars, policyToTest.Namespace)
10781081
if err != nil {
10791082
return nil, fmt.Errorf("could not create package data stream: %w", err)
10801083
}
@@ -1087,8 +1090,8 @@ func (r *tester) prepareScenario(ctx context.Context, config *testConfig, stackC
10871090
}
10881091
scenario.kibanaDataStream = ds
10891092

1090-
scenario.indexTemplateName = r.buildIndexTemplateName(ds, config)
1091-
scenario.dataStream = r.buildDataStreamName(scenario.policyTemplateInput, ds, config)
1093+
scenario.indexTemplateName = BuildIndexTemplateName(ds, r.pkgManifest.Type, config.Vars)
1094+
scenario.dataStream = BuildDataStreamName(scenario.policyTemplateInput, ds, r.pkgManifest.Type, config.Vars)
10921095

10931096
r.cleanTestScenarioHandler = func(ctx context.Context) error {
10941097
logger.Debugf("Deleting data stream for testing %s", scenario.dataStream)
@@ -1255,10 +1258,10 @@ func (r *tester) prepareScenario(ctx context.Context, config *testConfig, stackC
12551258
return &scenario, nil
12561259
}
12571260

1258-
// buildIndexTemplateName builds the expected index template name that is installed in Elasticsearch
1261+
// BuildIndexTemplateName builds the expected index template name that is installed in Elasticsearch
12591262
// when the package data stream is added to the policy.
1260-
func (r *tester) buildIndexTemplateName(ds kibana.PackageDataStream, config *testConfig) string {
1261-
dataStreamDataset := getExpectedDatasetForTest(r.pkgManifest.Type, ds.Inputs[0].Streams[0].DataStream.Dataset, config)
1263+
func BuildIndexTemplateName(ds kibana.PackageDataStream, manType string, cfgVars common.MapStr) string {
1264+
dataStreamDataset := getExpectedDatasetForTest(manType, ds.Inputs[0].Streams[0].DataStream.Dataset, cfgVars)
12621265

12631266
indexTemplateName := fmt.Sprintf(
12641267
"%s-%s",
@@ -1268,11 +1271,13 @@ func (r *tester) buildIndexTemplateName(ds kibana.PackageDataStream, config *tes
12681271
return indexTemplateName
12691272
}
12701273

1271-
func (r *tester) buildDataStreamName(policyTemplateInput string, ds kibana.PackageDataStream, config *testConfig) string {
1272-
dataStreamDataset := getExpectedDatasetForTest(r.pkgManifest.Type, ds.Inputs[0].Streams[0].DataStream.Dataset, config)
1274+
// BuildDataStreamName builds the expected data stream name that is installed in Elasticsearch
1275+
// when the package data stream is added to the policy.
1276+
func BuildDataStreamName(policyTemplateInput string, ds kibana.PackageDataStream, manType string, cfgVars common.MapStr) string {
1277+
dataStreamDataset := getExpectedDatasetForTest(manType, ds.Inputs[0].Streams[0].DataStream.Dataset, cfgVars)
12731278

12741279
// Input packages using the otel collector input require to add a specific dataset suffix
1275-
if r.pkgManifest.Type == "input" && policyTemplateInput == otelCollectorInputName {
1280+
if manType == "input" && policyTemplateInput == otelCollectorInputName {
12761281
dataStreamDataset = fmt.Sprintf("%s.%s", dataStreamDataset, otelSuffixDataset)
12771282
}
12781283

@@ -1285,10 +1290,10 @@ func (r *tester) buildDataStreamName(policyTemplateInput string, ds kibana.Packa
12851290
return dataStreamName
12861291
}
12871292

1288-
func getExpectedDatasetForTest(pkgType, dataset string, config *testConfig) string {
1293+
func getExpectedDatasetForTest(pkgType, dataset string, cfgVars common.MapStr) string {
12891294
if pkgType == "input" {
12901295
// Input packages can set `data_stream.dataset` by convention to customize the dataset.
1291-
v, _ := config.Vars.GetValue("data_stream.dataset")
1296+
v, _ := cfgVars.GetValue("data_stream.dataset")
12921297
if ds, ok := v.(string); ok && ds != "" {
12931298
return ds
12941299
}
@@ -1904,29 +1909,31 @@ func (r *tester) checkEnrolledAgents(ctx context.Context, agentInfo agentdeploye
19041909
return &agent, nil
19051910
}
19061911

1907-
func createPackageDatastream(
1908-
kibanaPolicy kibana.Policy,
1909-
pkg packages.PackageManifest,
1912+
func CreatePackageDatastream(
1913+
kibanaPolicy *kibana.Policy,
1914+
pkg *packages.PackageManifest,
19101915
policyTemplate packages.PolicyTemplate,
19111916
ds *packages.DataStreamManifest,
1912-
config testConfig,
1917+
cfgName string,
1918+
cfgVars, cfgDSVars common.MapStr,
19131919
suffix string,
19141920
) (kibana.PackageDataStream, error) {
19151921
if pkg.Type == "input" {
1916-
return createInputPackageDatastream(kibanaPolicy, pkg, policyTemplate, config, suffix), nil
1922+
return createInputPackageDatastream(kibanaPolicy, pkg, policyTemplate, cfgVars, cfgDSVars, suffix), nil
19171923
}
19181924
if ds == nil {
19191925
return kibana.PackageDataStream{}, fmt.Errorf("data stream manifest is required for integration packages")
19201926
}
1921-
return createIntegrationPackageDatastream(kibanaPolicy, pkg, policyTemplate, *ds, config, suffix), nil
1927+
return createIntegrationPackageDatastream(kibanaPolicy, pkg, policyTemplate, ds, cfgName, cfgVars, cfgDSVars, suffix), nil
19221928
}
19231929

19241930
func createIntegrationPackageDatastream(
1925-
kibanaPolicy kibana.Policy,
1926-
pkg packages.PackageManifest,
1931+
kibanaPolicy *kibana.Policy,
1932+
pkg *packages.PackageManifest,
19271933
policyTemplate packages.PolicyTemplate,
1928-
ds packages.DataStreamManifest,
1929-
config testConfig,
1934+
ds *packages.DataStreamManifest,
1935+
cfgName string,
1936+
cfgVars, cfgDSVars common.MapStr,
19301937
suffix string,
19311938
) kibana.PackageDataStream {
19321939
r := kibana.PackageDataStream{
@@ -1945,7 +1952,7 @@ func createIntegrationPackageDatastream(
19451952
r.Package.Title = pkg.Title
19461953
r.Package.Version = pkg.Version
19471954

1948-
stream := ds.Streams[getDataStreamIndex(config.Input, ds)]
1955+
stream := ds.Streams[getDataStreamIndex(cfgName, ds)]
19491956
streamInput := stream.Input
19501957
r.Inputs[0].Type = streamInput
19511958

@@ -1965,26 +1972,26 @@ func createIntegrationPackageDatastream(
19651972
}
19661973

19671974
// Add dataStream-level vars
1968-
streams[0].Vars = setKibanaVariables(stream.Vars, config.DataStream.Vars)
1975+
streams[0].Vars = setKibanaVariables(stream.Vars, cfgDSVars)
19691976
r.Inputs[0].Streams = streams
19701977

19711978
// Add input-level vars
19721979
input := policyTemplate.FindInputByType(streamInput)
19731980
if input != nil {
1974-
r.Inputs[0].Vars = setKibanaVariables(input.Vars, config.Vars)
1981+
r.Inputs[0].Vars = setKibanaVariables(input.Vars, cfgVars)
19751982
}
19761983

19771984
// Add package-level vars
1978-
r.Vars = setKibanaVariables(pkg.Vars, config.Vars)
1985+
r.Vars = setKibanaVariables(pkg.Vars, cfgVars)
19791986

19801987
return r
19811988
}
19821989

19831990
func createInputPackageDatastream(
1984-
kibanaPolicy kibana.Policy,
1985-
pkg packages.PackageManifest,
1991+
kibanaPolicy *kibana.Policy,
1992+
pkg *packages.PackageManifest,
19861993
policyTemplate packages.PolicyTemplate,
1987-
config testConfig,
1994+
cfgVars, cfgDSVars common.MapStr,
19881995
suffix string,
19891996
) kibana.PackageDataStream {
19901997
r := kibana.PackageDataStream{
@@ -2018,10 +2025,10 @@ func createInputPackageDatastream(
20182025
}
20192026

20202027
// Add policyTemplate-level vars.
2021-
vars := setKibanaVariables(policyTemplate.Vars, config.Vars)
2028+
vars := setKibanaVariables(policyTemplate.Vars, cfgVars)
20222029
if _, found := vars["data_stream.dataset"]; !found {
20232030
dataStreamDataset := dataset
2024-
v, _ := config.Vars.GetValue("data_stream.dataset")
2031+
v, _ := cfgVars.GetValue("data_stream.dataset")
20252032
if dataset, ok := v.(string); ok && dataset != "" {
20262033
dataStreamDataset = dataset
20272034
}
@@ -2060,7 +2067,7 @@ func setKibanaVariables(definitions []packages.Variable, values common.MapStr) k
20602067

20612068
// getDataStreamIndex returns the index of the data stream whose input name
20622069
// matches. Otherwise it returns the 0.
2063-
func getDataStreamIndex(inputName string, ds packages.DataStreamManifest) int {
2070+
func getDataStreamIndex(inputName string, ds *packages.DataStreamManifest) int {
20642071
for i, s := range ds.Streams {
20652072
if s.Input == inputName {
20662073
return i
@@ -2069,20 +2076,20 @@ func getDataStreamIndex(inputName string, ds packages.DataStreamManifest) int {
20692076
return 0
20702077
}
20712078

2072-
// findPolicyTemplateForInput returns the name of the policy_template that
2079+
// FindPolicyTemplateForInput returns the name of the policy_template that
20732080
// applies to the input under test. An error is returned if no policy template
20742081
// matches or if multiple policy templates match and the response is ambiguous.
2075-
func findPolicyTemplateForInput(pkg packages.PackageManifest, ds *packages.DataStreamManifest, inputName string) (string, error) {
2082+
func FindPolicyTemplateForInput(pkg *packages.PackageManifest, ds *packages.DataStreamManifest, inputName string) (string, error) {
20762083
if pkg.Type == "input" {
20772084
return findPolicyTemplateForInputPackage(pkg, inputName)
20782085
}
20792086
if ds == nil {
20802087
return "", errors.New("data stream must be specified for integration packages")
20812088
}
2082-
return findPolicyTemplateForDataStream(pkg, *ds, inputName)
2089+
return findPolicyTemplateForDataStream(pkg, ds, inputName)
20832090
}
20842091

2085-
func findPolicyTemplateForDataStream(pkg packages.PackageManifest, ds packages.DataStreamManifest, inputName string) (string, error) {
2092+
func findPolicyTemplateForDataStream(pkg *packages.PackageManifest, ds *packages.DataStreamManifest, inputName string) (string, error) {
20862093
if inputName == "" {
20872094
if len(ds.Streams) == 0 {
20882095
return "", errors.New("no streams declared in data stream manifest")
@@ -2120,7 +2127,7 @@ func findPolicyTemplateForDataStream(pkg packages.PackageManifest, ds packages.D
21202127
}
21212128
}
21222129

2123-
func findPolicyTemplateForInputPackage(pkg packages.PackageManifest, inputName string) (string, error) {
2130+
func findPolicyTemplateForInputPackage(pkg *packages.PackageManifest, inputName string) (string, error) {
21242131
if inputName == "" {
21252132
if len(pkg.PolicyTemplates) == 0 {
21262133
return "", errors.New("no policy templates specified for input package")
@@ -2152,7 +2159,7 @@ func findPolicyTemplateForInputPackage(pkg packages.PackageManifest, inputName s
21522159
}
21532160
}
21542161

2155-
func selectPolicyTemplateByName(policies []packages.PolicyTemplate, name string) (packages.PolicyTemplate, error) {
2162+
func SelectPolicyTemplateByName(policies []packages.PolicyTemplate, name string) (packages.PolicyTemplate, error) {
21562163
for _, policy := range policies {
21572164
if policy.Name == name {
21582165
return policy, nil

0 commit comments

Comments
 (0)