Skip to content

Commit 9a10017

Browse files
Merge branch 'main' into owner-type-tagging
2 parents b2f7a1b + 991ae11 commit 9a10017

27 files changed

Lines changed: 825 additions & 118 deletions

File tree

code/go/internal/validator/semantic/validate_minimum_kibana_version.go

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,24 @@ func ValidateMinimumKibanaVersion(fsys fspath.FS) ve.ValidationErrors {
3333
return ve.ValidationErrors{err}
3434
}
3535

36+
var errs ve.ValidationErrors
3637
err = validateMinimumKibanaVersionInputPackages(pkg.Type, *pkg.Version, kibanaVersionCondition)
3738
if err != nil {
38-
return ve.ValidationErrors{err}
39+
errs.Append(ve.ValidationErrors{err})
3940
}
4041

4142
err = validateMinimumKibanaVersionRuntimeFields(fsys, *pkg.Version, kibanaVersionCondition)
4243
if err != nil {
43-
return ve.ValidationErrors{err}
44+
errs.Append(ve.ValidationErrors{err})
45+
}
46+
47+
err = validateMinimumKibanaVersionSavedObjectTags(fsys, pkg.Type, *pkg.Version, kibanaVersionCondition)
48+
if err != nil {
49+
errs.Append(ve.ValidationErrors{err})
50+
}
51+
52+
if errs != nil {
53+
return errs
4454
}
4555

4656
return nil
@@ -65,7 +75,7 @@ func validateMinimumKibanaVersionInputPackages(packageType string, packageVersio
6575
return fmt.Errorf("conditions.kibana.version must be ^%s or greater for non experimental input packages (version > 1.0.0)", minimumKibanaVersion)
6676
}
6777

68-
// validateMinimumKibanaVersionInputPackages ensures the minimum kibana version if the package defines any runtime field,
78+
// validateMinimumKibanaVersionRuntimeFields ensures the minimum kibana version if the package defines any runtime field,
6979
// then the kibana version condition for the package must be >= 8.10.0
7080
func validateMinimumKibanaVersionRuntimeFields(fsys fspath.FS, packageVersion semver.Version, kibanaVersionCondition string) error {
7181
const minimumKibanaVersion = "8.10.0"
@@ -81,6 +91,31 @@ func validateMinimumKibanaVersionRuntimeFields(fsys fspath.FS, packageVersion se
8191
return fmt.Errorf("conditions.kibana.version must be ^%s or greater to include runtime fields", minimumKibanaVersion)
8292
}
8393

94+
// validateMinimumKibanaVersionSavedObjectTags ensures the minimum kibana version if the package defines saved object tags file,
95+
// then the kibana version condition for the package must be >= 8.10.0
96+
func validateMinimumKibanaVersionSavedObjectTags(fsys fspath.FS, packageType string, packageVersion semver.Version, kibanaVersionCondition string) error {
97+
const minimumKibanaVersion = "8.10.0"
98+
if packageType == "input" {
99+
return nil
100+
}
101+
102+
manifestPath := "kibana/tags.yml"
103+
f, err := pkgpath.Files(fsys, manifestPath)
104+
if err != nil {
105+
return fmt.Errorf("can't locate files with %v: %w", manifestPath, err)
106+
}
107+
108+
if len(f) == 0 {
109+
return nil
110+
}
111+
112+
if kibanaVersionConditionIsGreaterThanOrEqualTo(kibanaVersionCondition, minimumKibanaVersion) {
113+
return nil
114+
}
115+
116+
return fmt.Errorf("conditions.kibana.version must be ^%s or greater to include saved object tags file: %s", minimumKibanaVersion, manifestPath)
117+
}
118+
84119
func readManifest(fsys fspath.FS) (*pkgpath.File, error) {
85120
manifestPath := "manifest.yml"
86121
f, err := pkgpath.Files(fsys, manifestPath)

code/go/internal/validator/semantic/validate_minimum_kibana_version_test.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111

1212
"github.com/Masterminds/semver/v3"
1313
"github.com/stretchr/testify/assert"
14+
"github.com/stretchr/testify/require"
1415

1516
"github.com/elastic/package-spec/v2/code/go/internal/fspath"
1617
)
@@ -111,6 +112,7 @@ func TestValidateMinimumKibanaVersionInputPackages(t *testing.T) {
111112
if test.expectedErr == nil {
112113
assert.Nil(t, res)
113114
} else {
115+
require.Error(t, res)
114116
assert.Equal(t, test.expectedErr.Error(), res.Error())
115117
}
116118
})
@@ -164,6 +166,60 @@ func TestValidateMinimumKibanaVersionRuntimeFields(t *testing.T) {
164166
if test.expectedErr == nil {
165167
assert.Nil(t, res)
166168
} else {
169+
require.Error(t, res)
170+
assert.Equal(t, test.expectedErr.Error(), res.Error())
171+
}
172+
})
173+
}
174+
}
175+
176+
func TestValidateMinimumKibanaVersionSavedObjectsTags(t *testing.T) {
177+
kbnVersionError := errors.New("conditions.kibana.version must be ^8.10.0 or greater to include saved object tags file: kibana/tags.yml")
178+
var tests = []struct {
179+
pkgRoot string
180+
pkgType string
181+
packageVersion semver.Version
182+
kibanaVersionCondition string
183+
expectedErr error
184+
}{
185+
{
186+
"../../../../../test/packages/good_v2",
187+
"integration",
188+
*semver.MustParse("1.0.0"),
189+
"^7.14.0",
190+
kbnVersionError,
191+
},
192+
{
193+
"../../../../../test/packages/good_v2",
194+
"integration",
195+
*semver.MustParse("1.0.0"),
196+
"^8.10.0 || ^7.14.0",
197+
kbnVersionError,
198+
},
199+
{
200+
"../../../../../test/packages/good_v2",
201+
"integration",
202+
*semver.MustParse("1.0.0"),
203+
"^8.10.0",
204+
nil,
205+
},
206+
{
207+
"../../../../../test/packages/good_input",
208+
"input",
209+
*semver.MustParse("1.0.0"),
210+
"^7.17.0",
211+
nil,
212+
},
213+
}
214+
215+
for _, test := range tests {
216+
t.Run(filepath.Base(test.pkgRoot)+"--"+test.packageVersion.String()+"--"+test.kibanaVersionCondition, func(t *testing.T) {
217+
res := validateMinimumKibanaVersionSavedObjectTags(fspath.DirFS(test.pkgRoot), test.pkgType, test.packageVersion, test.kibanaVersionCondition)
218+
219+
if test.expectedErr == nil {
220+
assert.Nil(t, res)
221+
} else {
222+
require.Error(t, res)
167223
assert.Equal(t, test.expectedErr.Error(), res.Error())
168224
}
169225
})

code/go/internal/validator/spec.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ func processErrors(errs ve.ValidationErrors) ve.ValidationErrors {
9292
"Must validate \"else\" as \"if\" was not valid",
9393
"Must validate all the schemas (allOf)",
9494
"Must validate at least one schema (anyOf)",
95+
"Must validate one and only one schema (oneOf)",
9596
}
9697
for _, e := range errs {
9798
for _, msg := range msgTransforms {

code/go/pkg/validator/validator_test.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,16 @@ func TestValidateFile(t *testing.T) {
190190
"field (root): Additional property max_age is not allowed",
191191
},
192192
},
193+
"bad_saved_object_tags": {
194+
"kibana/tags.yml",
195+
[]string{
196+
`field 0.asset_types.11: 0.asset_types.11 must be one of the following: "dashboard", "visualization", "search", "map", "lens", "index_pattern", "security_rule", "csp_rule_template", "ml_module", "osquery_pack_asset", "osquery_saved_query"`,
197+
`field 0.asset_types.12: 0.asset_types.12 must be one of the following: "dashboard", "visualization", "search", "map", "lens", "index_pattern", "security_rule", "csp_rule_template", "ml_module", "osquery_pack_asset", "osquery_saved_query"`,
198+
`field 1.asset_ids.1: Invalid type. Expected: string, given: integer`,
199+
`field 2: text is required`,
200+
`field 3: asset_types is required`,
201+
},
202+
},
193203
}
194204

195205
for pkgName, test := range tests {
@@ -445,6 +455,9 @@ func TestValidateMinimumKibanaVersions(t *testing.T) {
445455
"bad_runtime_kibana_version": []string{
446456
"conditions.kibana.version must be ^8.10.0 or greater to include runtime fields",
447457
},
458+
"bad_saved_object_tags_kibana_version": []string{
459+
"conditions.kibana.version must be ^8.10.0 or greater to include saved object tags file: kibana/tags.yml",
460+
},
448461
}
449462

450463
for pkgName, expectedErrorMessages := range tests {
@@ -469,7 +482,7 @@ func TestValidateMinimumKibanaVersions(t *testing.T) {
469482
}
470483
}
471484
if !found {
472-
t.Errorf("expected error: %q", expectedError)
485+
t.Errorf("expected error: %q, found: %q", expectedError, errs)
473486
}
474487
}
475488
})

spec/changelog.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,15 @@
1010
- description: Add specific settings for data retention lifecycle configuration (for DLM).
1111
type: enhancement
1212
link: https://github.com/elastic/package-spec/pull/556
13-
- description: Add new validation for usages of metric_type field
13+
- description: Add new validation for usages of metric_type field.
1414
type: enhancement
1515
link: https://github.com/elastic/package-spec/pull/527
16+
- description: Add asset tags to package level under kibana folder.
17+
type: enhancement
18+
link: https://github.com/elastic/package-spec/pull/567
19+
- description: Add support for log files in deploy terraform spec
20+
type: enhancement
21+
link: https://github.com/elastic/package-spec/pull/571
1622
- description: Add owner.type field to indicate package support level
1723
type: enhancement
1824
link: https://github.com/elastic/package-spec/pull/568
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
spec:
2+
additionalContents: false
3+
contents:
4+
- description: Log / conf files to add into terraform resources
5+
type: file
6+
contentMediaType: "text/plain"
7+
pattern: '^*.(log|conf)$'
8+
required: false
9+
- description: YAML files to add into terraform resources
10+
type: file
11+
contentMediaType: "application/x-yaml"
12+
pattern: ^*.(yml|yaml)$
13+
required: false
14+
- description: JSON files to add into terraform resources
15+
type: file
16+
contentMediaType: "application/json"
17+
pattern: '^*.json$'
18+
required: false

spec/integration/_dev/deploy/tf/spec.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,8 @@ spec:
2525
type: file
2626
contentMediaType: "application/json"
2727
required: false
28+
- description: Files that can be used with Terraform resources or provisioners
29+
name: files
30+
type: folder
31+
required: false
32+
$ref: "./files/spec.yml"

0 commit comments

Comments
 (0)