Skip to content

Commit

Permalink
Add saved object tags definitions file under kibana folder (#567)
Browse files Browse the repository at this point in the history
* Add support for saved object tags file
* Add changelog entry
* Filter out input packages
* Allow asset_types and asset_ids to be defined together
* Remove tag as available item in asset_types
* Update description for asset fields
  • Loading branch information
mrodm authored Jul 24, 2023
1 parent 7990807 commit 2489d6d
Show file tree
Hide file tree
Showing 22 changed files with 788 additions and 117 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,24 @@ func ValidateMinimumKibanaVersion(fsys fspath.FS) ve.ValidationErrors {
return ve.ValidationErrors{err}
}

var errs ve.ValidationErrors
err = validateMinimumKibanaVersionInputPackages(pkg.Type, *pkg.Version, kibanaVersionCondition)
if err != nil {
return ve.ValidationErrors{err}
errs.Append(ve.ValidationErrors{err})
}

err = validateMinimumKibanaVersionRuntimeFields(fsys, *pkg.Version, kibanaVersionCondition)
if err != nil {
return ve.ValidationErrors{err}
errs.Append(ve.ValidationErrors{err})
}

err = validateMinimumKibanaVersionSavedObjectTags(fsys, pkg.Type, *pkg.Version, kibanaVersionCondition)
if err != nil {
errs.Append(ve.ValidationErrors{err})
}

if errs != nil {
return errs
}

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

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

// validateMinimumKibanaVersionSavedObjectTags ensures the minimum kibana version if the package defines saved object tags file,
// then the kibana version condition for the package must be >= 8.10.0
func validateMinimumKibanaVersionSavedObjectTags(fsys fspath.FS, packageType string, packageVersion semver.Version, kibanaVersionCondition string) error {
const minimumKibanaVersion = "8.10.0"
if packageType == "input" {
return nil
}

manifestPath := "kibana/tags.yml"
f, err := pkgpath.Files(fsys, manifestPath)
if err != nil {
return fmt.Errorf("can't locate files with %v: %w", manifestPath, err)
}

if len(f) == 0 {
return nil
}

if kibanaVersionConditionIsGreaterThanOrEqualTo(kibanaVersionCondition, minimumKibanaVersion) {
return nil
}

return fmt.Errorf("conditions.kibana.version must be ^%s or greater to include saved object tags file: %s", minimumKibanaVersion, manifestPath)
}

func readManifest(fsys fspath.FS) (*pkgpath.File, error) {
manifestPath := "manifest.yml"
f, err := pkgpath.Files(fsys, manifestPath)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (

"github.com/Masterminds/semver/v3"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

"github.com/elastic/package-spec/v2/code/go/internal/fspath"
)
Expand Down Expand Up @@ -111,6 +112,7 @@ func TestValidateMinimumKibanaVersionInputPackages(t *testing.T) {
if test.expectedErr == nil {
assert.Nil(t, res)
} else {
require.Error(t, res)
assert.Equal(t, test.expectedErr.Error(), res.Error())
}
})
Expand Down Expand Up @@ -164,6 +166,60 @@ func TestValidateMinimumKibanaVersionRuntimeFields(t *testing.T) {
if test.expectedErr == nil {
assert.Nil(t, res)
} else {
require.Error(t, res)
assert.Equal(t, test.expectedErr.Error(), res.Error())
}
})
}
}

func TestValidateMinimumKibanaVersionSavedObjectsTags(t *testing.T) {
kbnVersionError := errors.New("conditions.kibana.version must be ^8.10.0 or greater to include saved object tags file: kibana/tags.yml")
var tests = []struct {
pkgRoot string
pkgType string
packageVersion semver.Version
kibanaVersionCondition string
expectedErr error
}{
{
"../../../../../test/packages/good_v2",
"integration",
*semver.MustParse("1.0.0"),
"^7.14.0",
kbnVersionError,
},
{
"../../../../../test/packages/good_v2",
"integration",
*semver.MustParse("1.0.0"),
"^8.10.0 || ^7.14.0",
kbnVersionError,
},
{
"../../../../../test/packages/good_v2",
"integration",
*semver.MustParse("1.0.0"),
"^8.10.0",
nil,
},
{
"../../../../../test/packages/good_input",
"input",
*semver.MustParse("1.0.0"),
"^7.17.0",
nil,
},
}

for _, test := range tests {
t.Run(filepath.Base(test.pkgRoot)+"--"+test.packageVersion.String()+"--"+test.kibanaVersionCondition, func(t *testing.T) {
res := validateMinimumKibanaVersionSavedObjectTags(fspath.DirFS(test.pkgRoot), test.pkgType, test.packageVersion, test.kibanaVersionCondition)

if test.expectedErr == nil {
assert.Nil(t, res)
} else {
require.Error(t, res)
assert.Equal(t, test.expectedErr.Error(), res.Error())
}
})
Expand Down
1 change: 1 addition & 0 deletions code/go/internal/validator/spec.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ func processErrors(errs ve.ValidationErrors) ve.ValidationErrors {
"Must validate \"else\" as \"if\" was not valid",
"Must validate all the schemas (allOf)",
"Must validate at least one schema (anyOf)",
"Must validate one and only one schema (oneOf)",
}
for _, e := range errs {
for _, msg := range msgTransforms {
Expand Down
15 changes: 14 additions & 1 deletion code/go/pkg/validator/validator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,16 @@ func TestValidateFile(t *testing.T) {
"field (root): Additional property max_age is not allowed",
},
},
"bad_saved_object_tags": {
"kibana/tags.yml",
[]string{
`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"`,
`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"`,
`field 1.asset_ids.1: Invalid type. Expected: string, given: integer`,
`field 2: text is required`,
`field 3: asset_types is required`,
},
},
}

for pkgName, test := range tests {
Expand Down Expand Up @@ -439,6 +449,9 @@ func TestValidateMinimumKibanaVersions(t *testing.T) {
"bad_runtime_kibana_version": []string{
"conditions.kibana.version must be ^8.10.0 or greater to include runtime fields",
},
"bad_saved_object_tags_kibana_version": []string{
"conditions.kibana.version must be ^8.10.0 or greater to include saved object tags file: kibana/tags.yml",
},
}

for pkgName, expectedErrorMessages := range tests {
Expand All @@ -463,7 +476,7 @@ func TestValidateMinimumKibanaVersions(t *testing.T) {
}
}
if !found {
t.Errorf("expected error: %q", expectedError)
t.Errorf("expected error: %q, found: %q", expectedError, errs)
}
}
})
Expand Down
5 changes: 4 additions & 1 deletion spec/changelog.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,12 @@
- description: Add specific settings for data retention lifecycle configuration (for DLM).
type: enhancement
link: https://github.com/elastic/package-spec/pull/556
- description: Add new validation for usages of metric_type field
- description: Add new validation for usages of metric_type field.
type: enhancement
link: https://github.com/elastic/package-spec/pull/527
- description: Add asset tags to package level under kibana folder.
type: enhancement
link: https://github.com/elastic/package-spec/pull/567
- version: 2.9.0
changes:
- description: Update minimum kibana version required for runtime fields
Expand Down
Loading

0 comments on commit 2489d6d

Please sign in to comment.