code/go/internal/validator/semantic/validate_capabilities_required.go (54 lines of code) (raw):

// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. package semantic import ( "fmt" "path" "slices" "github.com/elastic/package-spec/v3/code/go/internal/fspath" "github.com/elastic/package-spec/v3/code/go/internal/pkgpath" "github.com/elastic/package-spec/v3/code/go/pkg/specerrors" ) // ValidateCapabilitiesRequired verifies that the required capabilities are added in package manifest func ValidateCapabilitiesRequired(fsys fspath.FS) specerrors.ValidationErrors { err := ensureSecurityRulesHasSecurityCapability(fsys) if err != nil { return err } return nil } func ensureSecurityRulesHasSecurityCapability(fsys fspath.FS) specerrors.ValidationErrors { securityRuleFilePaths := path.Join("kibana", "security_rule", "*.json") files, err := pkgpath.Files(fsys, securityRuleFilePaths) if err != nil { return specerrors.ValidationErrors{specerrors.NewStructuredErrorf("error finding Kibana security_rule folder: %w", err)} } if len(files) == 0 { return nil } capabilities, err := readCapabilities(fsys) if err != nil { return specerrors.ValidationErrors{specerrors.NewStructuredError(err, specerrors.UnassignedCode)} } if !slices.Contains(capabilities, "security") { return specerrors.ValidationErrors{ specerrors.NewStructuredErrorf("file \"%s\" is invalid: found security rule assets in package but security capability is missing", fsys.Path("manifest.yml")), } } return nil } func readCapabilities(fsys fspath.FS) ([]string, error) { manifest, err := readManifest(fsys) if err != nil { return nil, err } vals, err := manifest.Values("$.conditions[\"elastic.capabilities\"]") if err != nil { vals, err = manifest.Values("$.conditions.elastic.capabilities") if err != nil { return nil, nil } } capabilities, err := toStringSlice(vals) if err != nil { return nil, fmt.Errorf("can't convert slice entries: %w", err) } return capabilities, nil }