From 80ac1818f9cc80fbd99b4a833a83c85179178f17 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Fri, 22 Sep 2023 09:58:49 +0200 Subject: [PATCH 01/23] Add error filtering --- cmd/lint.go | 17 ++--- internal/builder/packages.go | 7 +- internal/packages/archetype/package_test.go | 5 +- internal/packages/installer/factory.go | 5 +- internal/validation/validation.go | 76 +++++++++++++++++++++ 5 files changed, 89 insertions(+), 21 deletions(-) create mode 100644 internal/validation/validation.go diff --git a/cmd/lint.go b/cmd/lint.go index 81344609d..3336053fc 100644 --- a/cmd/lint.go +++ b/cmd/lint.go @@ -10,11 +10,10 @@ import ( "github.com/spf13/cobra" - "github.com/elastic/package-spec/v2/code/go/pkg/validator" - "github.com/elastic/elastic-package/internal/cobraext" "github.com/elastic/elastic-package/internal/docs" "github.com/elastic/elastic-package/internal/packages" + "github.com/elastic/elastic-package/internal/validation" ) const lintLongDescription = `Use this command to validate the contents of a package using the package specification (see: https://github.com/elastic/package-spec). @@ -62,17 +61,13 @@ func lintCommandAction(cmd *cobra.Command, args []string) error { } func validateSourceCommandAction(cmd *cobra.Command, args []string) error { - packageRootPath, found, err := packages.FindPackageRoot() + packageRootPath, found, allErrors := packages.FindPackageRoot() if !found { return errors.New("package root not found") } - if err != nil { - return fmt.Errorf("locating package root failed: %w", err) - } - err = validator.ValidateFromPath(packageRootPath) - if err != nil { - return fmt.Errorf("linting package failed: %w", err) + if allErrors != nil { + return fmt.Errorf("locating package root failed: %w", allErrors) } - - return nil + err := validation.ValidateAndFilterFromPath(packageRootPath) + return fmt.Errorf("linting package failed: %w", err) } diff --git a/internal/builder/packages.go b/internal/builder/packages.go index 45725be74..5923ad3e0 100644 --- a/internal/builder/packages.go +++ b/internal/builder/packages.go @@ -12,12 +12,11 @@ import ( "github.com/magefile/mage/sh" - "github.com/elastic/package-spec/v2/code/go/pkg/validator" - "github.com/elastic/elastic-package/internal/environment" "github.com/elastic/elastic-package/internal/files" "github.com/elastic/elastic-package/internal/logger" "github.com/elastic/elastic-package/internal/packages" + "github.com/elastic/elastic-package/internal/validation" ) const builtPackagesFolder = "packages" @@ -195,7 +194,7 @@ func BuildPackage(options BuildOptions) (string, error) { } logger.Debugf("Validating built package (path: %s)", destinationDir) - err = validator.ValidateFromPath(destinationDir) + err = validation.ValidateAndFilterFromPath(destinationDir) if err != nil { return "", fmt.Errorf("invalid content found in built package: %w", err) } @@ -218,7 +217,7 @@ func buildZippedPackage(options BuildOptions, destinationDir string) (string, er logger.Debug("Skip validation of the built .zip package") } else { logger.Debugf("Validating built .zip package (path: %s)", zippedPackagePath) - err = validator.ValidateFromZip(zippedPackagePath) + err = validation.ValidateAndFilterFromZip(zippedPackagePath) if err != nil { return "", fmt.Errorf("invalid content found in built zip package: %w", err) } diff --git a/internal/packages/archetype/package_test.go b/internal/packages/archetype/package_test.go index eab3c0531..01f1a059c 100644 --- a/internal/packages/archetype/package_test.go +++ b/internal/packages/archetype/package_test.go @@ -9,11 +9,10 @@ import ( "path/filepath" "testing" - "github.com/elastic/package-spec/v2/code/go/pkg/validator" - "github.com/stretchr/testify/require" "github.com/elastic/elastic-package/internal/packages" + "github.com/elastic/elastic-package/internal/validation" ) func TestPackage(t *testing.T) { @@ -83,7 +82,7 @@ func createPackageDescriptorForTest(packageType, kibanaVersion string) PackageDe } func checkPackage(packageRoot string) error { - err := validator.ValidateFromPath(packageRoot) + err := validation.ValidateFromPath(packageRoot) if err != nil { return fmt.Errorf("linting package failed: %w", err) } diff --git a/internal/packages/installer/factory.go b/internal/packages/installer/factory.go index 85d33a7c2..7429beb7c 100644 --- a/internal/packages/installer/factory.go +++ b/internal/packages/installer/factory.go @@ -10,12 +10,11 @@ import ( "github.com/Masterminds/semver/v3" - "github.com/elastic/package-spec/v2/code/go/pkg/validator" - "github.com/elastic/elastic-package/internal/builder" "github.com/elastic/elastic-package/internal/kibana" "github.com/elastic/elastic-package/internal/logger" "github.com/elastic/elastic-package/internal/packages" + "github.com/elastic/elastic-package/internal/validation" ) var semver8_7_0 = semver.MustParse("8.7.0") @@ -61,7 +60,7 @@ func NewForPackage(options Options) (Installer, error) { } if !options.SkipValidation { logger.Debugf("Validating built .zip package (path: %s)", options.ZipPath) - err := validator.ValidateFromZip(options.ZipPath) + err := validation.ValidateAndFilterFromZip(options.ZipPath) if err != nil { return nil, fmt.Errorf("invalid content found in built zip package: %w", err) } diff --git a/internal/validation/validation.go b/internal/validation/validation.go new file mode 100644 index 000000000..76acc4b72 --- /dev/null +++ b/internal/validation/validation.go @@ -0,0 +1,76 @@ +package validation + +import ( + "fmt" + "io/fs" + "os" + + "github.com/elastic/elastic-package/internal/logger" + ve "github.com/elastic/package-spec/v2/code/go/pkg/errors" + "github.com/elastic/package-spec/v2/code/go/pkg/errors/processors" + "github.com/elastic/package-spec/v2/code/go/pkg/validator" +) + +const configFilterPath = "_dev/filter.yml" + +func ValidateFromPath(rootPath string) error { + return validator.ValidateFromPath(rootPath) +} + +func ValidateFromZip(packagePath string) error { + return validator.ValidateFromPath(packagePath) +} + +func ValidateAndFilterFromPath(rootPath string) error { + allErrors := validator.ValidateFromPath(rootPath) + if allErrors == nil { + return nil + } + + errors, err := filterErrors(allErrors, rootPath, configFilterPath) + if err != nil { + return err + } + return errors +} + +func ValidateAndFilterFromZip(packagePath string) error { + allErrors := validator.ValidateFromZip(packagePath) + if allErrors == nil { + return nil + } + + errors, err := filterErrors(allErrors, packagePath, configFilterPath) + if err != nil { + return err + } + return errors +} + +func filterErrors(allErrors error, rootPath, configPath string) (error, error) { + errs, ok := allErrors.(ve.ValidationErrors) + if !ok { + return allErrors, nil + } + + fsys := os.DirFS(rootPath) + + _, err := fs.Stat(fsys, configPath) + if err != nil { + logger.Debugf("file not found: %s", configPath) + return allErrors, nil + } + + config, err := processors.LoadConfigFilter(configPath) + if err != nil { + return nil, fmt.Errorf("failed to read config filter: %w", err) + } + + filter := processors.NewFilter(config) + + filteredErrors, _, err := filter.Run(errs) + if err != nil { + return nil, fmt.Errorf("failed to filter errors: %w", err) + } + return filteredErrors, nil +} From 78e58ac7951c9f5f70b961da2903cac2f3e0205e Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Fri, 22 Sep 2023 11:51:59 +0200 Subject: [PATCH 02/23] Add filesystem to load config --- internal/validation/validation.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/validation/validation.go b/internal/validation/validation.go index 76acc4b72..7ed7cb09c 100644 --- a/internal/validation/validation.go +++ b/internal/validation/validation.go @@ -61,7 +61,7 @@ func filterErrors(allErrors error, rootPath, configPath string) (error, error) { return allErrors, nil } - config, err := processors.LoadConfigFilter(configPath) + config, err := processors.LoadConfigFilter(fsys, configPath) if err != nil { return nil, fmt.Errorf("failed to read config filter: %w", err) } From 014395d365b781ab85906b267d1eeb04405f2734 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Fri, 22 Sep 2023 12:04:59 +0200 Subject: [PATCH 03/23] Rename variable --- cmd/lint.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cmd/lint.go b/cmd/lint.go index 3336053fc..e38f5bb5a 100644 --- a/cmd/lint.go +++ b/cmd/lint.go @@ -61,13 +61,13 @@ func lintCommandAction(cmd *cobra.Command, args []string) error { } func validateSourceCommandAction(cmd *cobra.Command, args []string) error { - packageRootPath, found, allErrors := packages.FindPackageRoot() + packageRootPath, found, err := packages.FindPackageRoot() if !found { return errors.New("package root not found") } - if allErrors != nil { - return fmt.Errorf("locating package root failed: %w", allErrors) + if err != nil { + return fmt.Errorf("locating package root failed: %w", err) } - err := validation.ValidateAndFilterFromPath(packageRootPath) + err = validation.ValidateAndFilterFromPath(packageRootPath) return fmt.Errorf("linting package failed: %w", err) } From 698eabcfe827c590d4f3cf43953f328056111ef4 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Mon, 25 Sep 2023 19:23:08 +0200 Subject: [PATCH 04/23] Use correctly filesystem for zips --- internal/validation/validation.go | 39 ++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/internal/validation/validation.go b/internal/validation/validation.go index 7ed7cb09c..0889f9b29 100644 --- a/internal/validation/validation.go +++ b/internal/validation/validation.go @@ -1,6 +1,7 @@ package validation import ( + "archive/zip" "fmt" "io/fs" "os" @@ -11,7 +12,7 @@ import ( "github.com/elastic/package-spec/v2/code/go/pkg/validator" ) -const configFilterPath = "_dev/filter.yml" +const configErrorsPath = "errors.yml" func ValidateFromPath(rootPath string) error { return validator.ValidateFromPath(rootPath) @@ -27,7 +28,8 @@ func ValidateAndFilterFromPath(rootPath string) error { return nil } - errors, err := filterErrors(allErrors, rootPath, configFilterPath) + fsys := os.DirFS(rootPath) + errors, err := filterErrors(allErrors, fsys, configErrorsPath) if err != nil { return err } @@ -40,21 +42,46 @@ func ValidateAndFilterFromZip(packagePath string) error { return nil } - errors, err := filterErrors(allErrors, packagePath, configFilterPath) + fsys, err := zip.OpenReader(packagePath) + if err != nil { + return fmt.Errorf("failed to open zip file (%s): %w", packagePath, err) + } + defer fsys.Close() + + fsZip, err := fsFromPackageZip(fsys) + if err != nil { + return fmt.Errorf("failed to extract filesystem from zip file (%s): %w", packagePath, err) + } + + errors, err := filterErrors(allErrors, fsZip, configErrorsPath) if err != nil { return err } return errors } -func filterErrors(allErrors error, rootPath, configPath string) (error, error) { +func fsFromPackageZip(fsys fs.FS) (fs.FS, error) { + dirs, err := fs.ReadDir(fsys, ".") + if err != nil { + return nil, fmt.Errorf("failed to read root directory in zip file fs: %w", err) + } + if len(dirs) != 1 { + return nil, fmt.Errorf("a single directory is expected in zip file, %d found", len(dirs)) + } + + subDir, err := fs.Sub(fsys, dirs[0].Name()) + if err != nil { + return nil, err + } + return subDir, nil +} + +func filterErrors(allErrors error, fsys fs.FS, configPath string) (error, error) { errs, ok := allErrors.(ve.ValidationErrors) if !ok { return allErrors, nil } - fsys := os.DirFS(rootPath) - _, err := fs.Stat(fsys, configPath) if err != nil { logger.Debugf("file not found: %s", configPath) From 53619ac63e1369f889250e836136a9d28c646d8a Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Mon, 25 Sep 2023 20:35:28 +0200 Subject: [PATCH 05/23] Return nil if there are no validation errors --- cmd/lint.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cmd/lint.go b/cmd/lint.go index e38f5bb5a..f1e2a6867 100644 --- a/cmd/lint.go +++ b/cmd/lint.go @@ -69,5 +69,8 @@ func validateSourceCommandAction(cmd *cobra.Command, args []string) error { return fmt.Errorf("locating package root failed: %w", err) } err = validation.ValidateAndFilterFromPath(packageRootPath) - return fmt.Errorf("linting package failed: %w", err) + if err != nil { + return fmt.Errorf("linting package failed: %w", err) + } + return nil } From 246577fc34a37df024a33c4a151317266208f2b1 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Tue, 26 Sep 2023 10:55:51 +0200 Subject: [PATCH 06/23] Replace package-spec version --- go.mod | 2 ++ go.sum | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 936cfdf26..a24468334 100644 --- a/go.mod +++ b/go.mod @@ -176,3 +176,5 @@ require ( sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) + +replace github.com/elastic/package-spec/v2 => github.com/mrodm/package-spec/v2 v2.0.0-20230925184154-8c2b3aacfe6f diff --git a/go.sum b/go.sum index 262b33d09..46346d20c 100644 --- a/go.sum +++ b/go.sum @@ -100,8 +100,6 @@ github.com/elastic/go-ucfg v0.8.6 h1:stUeyh2goTgGX+/wb9gzKvTv0YB0231LTpKUgCKj4U0 github.com/elastic/go-ucfg v0.8.6/go.mod h1:4E8mPOLSUV9hQ7sgLEJ4bvt0KhMuDJa8joDT2QGAEKA= github.com/elastic/gojsonschema v1.2.1 h1:cUMbgsz0wyEB4x7xf3zUEvUVDl6WCz2RKcQPul8OsQc= github.com/elastic/gojsonschema v1.2.1/go.mod h1:biw5eBS2Z4T02wjATMRSfecfjCmwaDPvuaqf844gLrg= -github.com/elastic/package-spec/v2 v2.12.0 h1:mIiOhFjVrWCSGTGYVu5nnaTJq+9GnP2vVz7ttMgi28c= -github.com/elastic/package-spec/v2 v2.12.0/go.mod h1:hKQ0du9JO310TiTP1UZkjngMAFr+dYr1MdVJcTvvC4Q= github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ= @@ -307,6 +305,8 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/mrodm/package-spec/v2 v2.0.0-20230925184154-8c2b3aacfe6f h1:8palqDzbBtXI0O9WjEH6t9XewT711raRSf9s+WBNlN4= +github.com/mrodm/package-spec/v2 v2.0.0-20230925184154-8c2b3aacfe6f/go.mod h1:hKQ0du9JO310TiTP1UZkjngMAFr+dYr1MdVJcTvvC4Q= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= From 41d1767e57e41396400eaecf7f9d9281f3f56c4c Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Tue, 26 Sep 2023 11:38:21 +0200 Subject: [PATCH 07/23] Add license header --- internal/validation/validation.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/internal/validation/validation.go b/internal/validation/validation.go index 0889f9b29..11023e8af 100644 --- a/internal/validation/validation.go +++ b/internal/validation/validation.go @@ -1,3 +1,7 @@ +// 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 validation import ( From 1e46e2a262dc6d15025c55c718e44a69cb11c987 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Tue, 26 Sep 2023 11:40:52 +0200 Subject: [PATCH 08/23] Add test package --- .../other/invalid_spec_filtered/LICENSE.txt | 93 ++++++++++++++++++ .../other/invalid_spec_filtered/changelog.yml | 6 ++ .../invalid_spec_filtered/docs/README.md | 84 ++++++++++++++++ .../other/invalid_spec_filtered/errors.yml | 4 + .../invalid_spec_filtered/img/sample-logo.svg | 1 + .../img/sample-screenshot.png | Bin 0 -> 18849 bytes .../invalid_spec_filtered-dashboard.json | 23 +++++ .../other/invalid_spec_filtered/manifest.yml | 36 +++++++ 8 files changed, 247 insertions(+) create mode 100644 test/packages/other/invalid_spec_filtered/LICENSE.txt create mode 100644 test/packages/other/invalid_spec_filtered/changelog.yml create mode 100644 test/packages/other/invalid_spec_filtered/docs/README.md create mode 100644 test/packages/other/invalid_spec_filtered/errors.yml create mode 100644 test/packages/other/invalid_spec_filtered/img/sample-logo.svg create mode 100644 test/packages/other/invalid_spec_filtered/img/sample-screenshot.png create mode 100644 test/packages/other/invalid_spec_filtered/kibana/dashboard/invalid_spec_filtered-dashboard.json create mode 100644 test/packages/other/invalid_spec_filtered/manifest.yml diff --git a/test/packages/other/invalid_spec_filtered/LICENSE.txt b/test/packages/other/invalid_spec_filtered/LICENSE.txt new file mode 100644 index 000000000..809108b85 --- /dev/null +++ b/test/packages/other/invalid_spec_filtered/LICENSE.txt @@ -0,0 +1,93 @@ +Elastic License 2.0 + +URL: https://www.elastic.co/licensing/elastic-license + +## Acceptance + +By using the software, you agree to all of the terms and conditions below. + +## Copyright License + +The licensor grants you a non-exclusive, royalty-free, worldwide, +non-sublicensable, non-transferable license to use, copy, distribute, make +available, and prepare derivative works of the software, in each case subject to +the limitations and conditions below. + +## Limitations + +You may not provide the software to third parties as a hosted or managed +service, where the service provides users with access to any substantial set of +the features or functionality of the software. + +You may not move, change, disable, or circumvent the license key functionality +in the software, and you may not remove or obscure any functionality in the +software that is protected by the license key. + +You may not alter, remove, or obscure any licensing, copyright, or other notices +of the licensor in the software. Any use of the licensor’s trademarks is subject +to applicable law. + +## Patents + +The licensor grants you a license, under any patent claims the licensor can +license, or becomes able to license, to make, have made, use, sell, offer for +sale, import and have imported the software, in each case subject to the +limitations and conditions in this license. This license does not cover any +patent claims that you cause to be infringed by modifications or additions to +the software. If you or your company make any written claim that the software +infringes or contributes to infringement of any patent, your patent license for +the software granted under these terms ends immediately. If your company makes +such a claim, your patent license ends immediately for work on behalf of your +company. + +## Notices + +You must ensure that anyone who gets a copy of any part of the software from you +also gets a copy of these terms. + +If you modify the software, you must include in any modified copies of the +software prominent notices stating that you have modified the software. + +## No Other Rights + +These terms do not imply any licenses other than those expressly granted in +these terms. + +## Termination + +If you use the software in violation of these terms, such use is not licensed, +and your licenses will automatically terminate. If the licensor provides you +with a notice of your violation, and you cease all violation of this license no +later than 30 days after you receive that notice, your licenses will be +reinstated retroactively. However, if you violate these terms after such +reinstatement, any additional violation of these terms will cause your licenses +to terminate automatically and permanently. + +## No Liability + +*As far as the law allows, the software comes as is, without any warranty or +condition, and the licensor will not be liable to you for any damages arising +out of these terms or the use or nature of the software, under any kind of +legal claim.* + +## Definitions + +The **licensor** is the entity offering these terms, and the **software** is the +software the licensor makes available under these terms, including any portion +of it. + +**you** refers to the individual or entity agreeing to these terms. + +**your company** is any legal entity, sole proprietorship, or other kind of +organization that you work for, plus all organizations that have control over, +are under the control of, or are under common control with that +organization. **control** means ownership of substantially all the assets of an +entity, or the power to direct its management and policies by vote, contract, or +otherwise. Control can be direct or indirect. + +**your licenses** are all the licenses granted to you for the software under +these terms. + +**use** means anything you do with the software requiring one of your licenses. + +**trademark** means trademarks, service marks, and similar rights. diff --git a/test/packages/other/invalid_spec_filtered/changelog.yml b/test/packages/other/invalid_spec_filtered/changelog.yml new file mode 100644 index 000000000..bb0320a52 --- /dev/null +++ b/test/packages/other/invalid_spec_filtered/changelog.yml @@ -0,0 +1,6 @@ +# newer versions go on top +- version: "0.0.1" + changes: + - description: Initial draft of the package + type: enhancement + link: https://github.com/elastic/integrations/pull/1 # FIXME Replace with the real PR link diff --git a/test/packages/other/invalid_spec_filtered/docs/README.md b/test/packages/other/invalid_spec_filtered/docs/README.md new file mode 100644 index 000000000..87a618495 --- /dev/null +++ b/test/packages/other/invalid_spec_filtered/docs/README.md @@ -0,0 +1,84 @@ + + + +# Invalid Spec Filtered + + + +## Data streams + + + + + + + + + + + +## Requirements + +You need Elasticsearch for storing and searching your data and Kibana for visualizing and managing it. +You can use our hosted Elasticsearch Service on Elastic Cloud, which is recommended, or self-manage the Elastic Stack on your own hardware. + + + +## Setup + + + +For step-by-step instructions on how to set up an integration, see the +[Getting started](https://www.elastic.co/guide/en/welcome-to-elastic/current/getting-started-observability.html) guide. + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/packages/other/invalid_spec_filtered/errors.yml b/test/packages/other/invalid_spec_filtered/errors.yml new file mode 100644 index 000000000..fbbdc1bc9 --- /dev/null +++ b/test/packages/other/invalid_spec_filtered/errors.yml @@ -0,0 +1,4 @@ +errors: + exclude_checks: + # - SVR00002 + - SVR00004 diff --git a/test/packages/other/invalid_spec_filtered/img/sample-logo.svg b/test/packages/other/invalid_spec_filtered/img/sample-logo.svg new file mode 100644 index 000000000..6268dd88f --- /dev/null +++ b/test/packages/other/invalid_spec_filtered/img/sample-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/test/packages/other/invalid_spec_filtered/img/sample-screenshot.png b/test/packages/other/invalid_spec_filtered/img/sample-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..d7a56a3ecc078c38636698cefba33f86291dd178 GIT binary patch literal 18849 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

}qal5$moSACwfNXLXG5|3R0AtBcN` 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 literal 0 HcmV?d00001 diff --git a/test/packages/other/invalid_spec_filtered/kibana/dashboard/invalid_spec_filtered-dashboard.json b/test/packages/other/invalid_spec_filtered/kibana/dashboard/invalid_spec_filtered-dashboard.json new file mode 100644 index 000000000..95aaef6f9 --- /dev/null +++ b/test/packages/other/invalid_spec_filtered/kibana/dashboard/invalid_spec_filtered-dashboard.json @@ -0,0 +1,23 @@ +{ + "attributes": { + "description": "Overview of Invalid spec filtered", + "hits": 0, + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "highlightAll": true, + "query": { + "language": "kuery", + "query": "" + }, + "version": true + } + }, + "timeRestore": false, + "title": "[Invalid spec filtered] Overview", + "version": 1 + }, + "coreMigrationVersion": "8.3.0", + "id": "invalid_spec_filtered-dashboard", + "type": "dashboard" +} \ No newline at end of file diff --git a/test/packages/other/invalid_spec_filtered/manifest.yml b/test/packages/other/invalid_spec_filtered/manifest.yml new file mode 100644 index 000000000..f46e1563c --- /dev/null +++ b/test/packages/other/invalid_spec_filtered/manifest.yml @@ -0,0 +1,36 @@ +format_version: 3.0.0 +name: invalid_spec_filtered +title: "Invalid Spec Filtered" +version: 0.0.1 +source: + license: "Elastic-2.0" +description: "Invalid package with errors filtered" +type: integration +categories: + - custom +conditions: + kibana: + version: "^8.10.1" + elastic: + subscription: "basic" +screenshots: + - src: /img/sample-screenshot.png + title: Sample screenshot + size: 600x600 + type: image/png +icons: + - src: /img/sample-logo.svg + title: Sample logo + size: 32x32 + type: image/svg+xml +policy_templates: + - name: sample + title: Sample logs + description: Collect sample logs + inputs: + - type: logfile + title: Collect sample logs from instances + description: Collecting sample logs +owner: + github: elastic/integrations + type: elastic From e1c1ef9854da8feb43cd78ff4bab91bf3a969109 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Tue, 26 Sep 2023 11:53:35 +0200 Subject: [PATCH 09/23] Reorder imports --- internal/validation/validation.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/internal/validation/validation.go b/internal/validation/validation.go index 11023e8af..978d60212 100644 --- a/internal/validation/validation.go +++ b/internal/validation/validation.go @@ -10,10 +10,11 @@ import ( "io/fs" "os" - "github.com/elastic/elastic-package/internal/logger" ve "github.com/elastic/package-spec/v2/code/go/pkg/errors" "github.com/elastic/package-spec/v2/code/go/pkg/errors/processors" "github.com/elastic/package-spec/v2/code/go/pkg/validator" + + "github.com/elastic/elastic-package/internal/logger" ) const configErrorsPath = "errors.yml" From de94c24bb43502771f3895d699c2242d2ea25ba4 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Tue, 26 Sep 2023 12:09:54 +0200 Subject: [PATCH 10/23] Add error code in invalid_spec_filtered test package --- test/packages/other/invalid_spec_filtered/errors.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/packages/other/invalid_spec_filtered/errors.yml b/test/packages/other/invalid_spec_filtered/errors.yml index fbbdc1bc9..bcc8f74ac 100644 --- a/test/packages/other/invalid_spec_filtered/errors.yml +++ b/test/packages/other/invalid_spec_filtered/errors.yml @@ -1,4 +1,3 @@ errors: exclude_checks: - # - SVR00002 - - SVR00004 + - SVR00002 From 1ac4c09e54649a38a19499fe10a7601e64d20d6a Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Tue, 26 Sep 2023 12:34:55 +0200 Subject: [PATCH 11/23] Show filtered errors --- cmd/lint.go | 10 +++++-- internal/builder/packages.go | 18 ++++++++---- internal/packages/installer/factory.go | 9 ++++-- internal/validation/validation.go | 38 +++++++++++++------------- 4 files changed, 44 insertions(+), 31 deletions(-) diff --git a/cmd/lint.go b/cmd/lint.go index f1e2a6867..b994a1a1f 100644 --- a/cmd/lint.go +++ b/cmd/lint.go @@ -12,6 +12,7 @@ import ( "github.com/elastic/elastic-package/internal/cobraext" "github.com/elastic/elastic-package/internal/docs" + "github.com/elastic/elastic-package/internal/logger" "github.com/elastic/elastic-package/internal/packages" "github.com/elastic/elastic-package/internal/validation" ) @@ -68,9 +69,12 @@ func validateSourceCommandAction(cmd *cobra.Command, args []string) error { if err != nil { return fmt.Errorf("locating package root failed: %w", err) } - err = validation.ValidateAndFilterFromPath(packageRootPath) - if err != nil { - return fmt.Errorf("linting package failed: %w", err) + errs, skipped := validation.ValidateAndFilterFromPath(packageRootPath) + if skipped != nil { + logger.Infof("skipped errors: %v", skipped) + } + if errs != nil { + return fmt.Errorf("linting package failed: %w", errs) } return nil } diff --git a/internal/builder/packages.go b/internal/builder/packages.go index 5923ad3e0..1d7d208a1 100644 --- a/internal/builder/packages.go +++ b/internal/builder/packages.go @@ -194,9 +194,12 @@ func BuildPackage(options BuildOptions) (string, error) { } logger.Debugf("Validating built package (path: %s)", destinationDir) - err = validation.ValidateAndFilterFromPath(destinationDir) - if err != nil { - return "", fmt.Errorf("invalid content found in built package: %w", err) + errs, skipped := validation.ValidateAndFilterFromPath(destinationDir) + if skipped != nil { + logger.Infof("skipped errors: %v", skipped) + } + if errs != nil { + return "", fmt.Errorf("invalid content found in built package: %w", errs) } return destinationDir, nil } @@ -217,9 +220,12 @@ func buildZippedPackage(options BuildOptions, destinationDir string) (string, er logger.Debug("Skip validation of the built .zip package") } else { logger.Debugf("Validating built .zip package (path: %s)", zippedPackagePath) - err = validation.ValidateAndFilterFromZip(zippedPackagePath) - if err != nil { - return "", fmt.Errorf("invalid content found in built zip package: %w", err) + errs, skipped := validation.ValidateAndFilterFromZip(zippedPackagePath) + if skipped != nil { + logger.Infof("skipped errors: %v", skipped) + } + if errs != nil { + return "", fmt.Errorf("invalid content found in built zip package: %w", errs) } } diff --git a/internal/packages/installer/factory.go b/internal/packages/installer/factory.go index 7429beb7c..8d88f6452 100644 --- a/internal/packages/installer/factory.go +++ b/internal/packages/installer/factory.go @@ -60,9 +60,12 @@ func NewForPackage(options Options) (Installer, error) { } if !options.SkipValidation { logger.Debugf("Validating built .zip package (path: %s)", options.ZipPath) - err := validation.ValidateAndFilterFromZip(options.ZipPath) - if err != nil { - return nil, fmt.Errorf("invalid content found in built zip package: %w", err) + errs, skipped := validation.ValidateAndFilterFromZip(options.ZipPath) + if skipped != nil { + logger.Infof("skipped errors: %v", skipped) + } + if errs != nil { + return nil, fmt.Errorf("invalid content found in built zip package: %w", errs) } } logger.Debug("Skip validation of the built .zip package") diff --git a/internal/validation/validation.go b/internal/validation/validation.go index 978d60212..60f9271e1 100644 --- a/internal/validation/validation.go +++ b/internal/validation/validation.go @@ -27,42 +27,42 @@ func ValidateFromZip(packagePath string) error { return validator.ValidateFromPath(packagePath) } -func ValidateAndFilterFromPath(rootPath string) error { +func ValidateAndFilterFromPath(rootPath string) (error, error) { allErrors := validator.ValidateFromPath(rootPath) if allErrors == nil { - return nil + return nil, nil } fsys := os.DirFS(rootPath) - errors, err := filterErrors(allErrors, fsys, configErrorsPath) + errors, skipped, err := filterErrors(allErrors, fsys, configErrorsPath) if err != nil { - return err + return err, nil } - return errors + return errors, skipped } -func ValidateAndFilterFromZip(packagePath string) error { +func ValidateAndFilterFromZip(packagePath string) (error, error) { allErrors := validator.ValidateFromZip(packagePath) if allErrors == nil { - return nil + return nil, nil } fsys, err := zip.OpenReader(packagePath) if err != nil { - return fmt.Errorf("failed to open zip file (%s): %w", packagePath, err) + return fmt.Errorf("failed to open zip file (%s): %w", packagePath, err), nil } defer fsys.Close() fsZip, err := fsFromPackageZip(fsys) if err != nil { - return fmt.Errorf("failed to extract filesystem from zip file (%s): %w", packagePath, err) + return fmt.Errorf("failed to extract filesystem from zip file (%s): %w", packagePath, err), nil } - errors, err := filterErrors(allErrors, fsZip, configErrorsPath) + errors, skipped, err := filterErrors(allErrors, fsZip, configErrorsPath) if err != nil { - return err + return err, nil } - return errors + return errors, skipped } func fsFromPackageZip(fsys fs.FS) (fs.FS, error) { @@ -81,28 +81,28 @@ func fsFromPackageZip(fsys fs.FS) (fs.FS, error) { return subDir, nil } -func filterErrors(allErrors error, fsys fs.FS, configPath string) (error, error) { +func filterErrors(allErrors error, fsys fs.FS, configPath string) (error, error, error) { errs, ok := allErrors.(ve.ValidationErrors) if !ok { - return allErrors, nil + return allErrors, nil, nil } _, err := fs.Stat(fsys, configPath) if err != nil { logger.Debugf("file not found: %s", configPath) - return allErrors, nil + return allErrors, nil, nil } config, err := processors.LoadConfigFilter(fsys, configPath) if err != nil { - return nil, fmt.Errorf("failed to read config filter: %w", err) + return nil, nil, fmt.Errorf("failed to read config filter: %w", err) } filter := processors.NewFilter(config) - filteredErrors, _, err := filter.Run(errs) + filteredErrors, skippedErrors, err := filter.Run(errs) if err != nil { - return nil, fmt.Errorf("failed to filter errors: %w", err) + return nil, nil, fmt.Errorf("failed to filter errors: %w", err) } - return filteredErrors, nil + return filteredErrors, skippedErrors, nil } From edb9e6ead1b5776494f3f7ab99c5acb789a1b141 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Tue, 26 Sep 2023 13:07:39 +0200 Subject: [PATCH 12/23] Update test package to include more errors --- .../other/invalid_spec_filtered/errors.yml | 2 + .../invalid_spec_filtered-dashboard.json | 45 ++++++++++--------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/test/packages/other/invalid_spec_filtered/errors.yml b/test/packages/other/invalid_spec_filtered/errors.yml index bcc8f74ac..5867c9ab8 100644 --- a/test/packages/other/invalid_spec_filtered/errors.yml +++ b/test/packages/other/invalid_spec_filtered/errors.yml @@ -1,3 +1,5 @@ errors: exclude_checks: + - SVR00001 - SVR00002 + - SVR00003 diff --git a/test/packages/other/invalid_spec_filtered/kibana/dashboard/invalid_spec_filtered-dashboard.json b/test/packages/other/invalid_spec_filtered/kibana/dashboard/invalid_spec_filtered-dashboard.json index 95aaef6f9..8e18ffaab 100644 --- a/test/packages/other/invalid_spec_filtered/kibana/dashboard/invalid_spec_filtered-dashboard.json +++ b/test/packages/other/invalid_spec_filtered/kibana/dashboard/invalid_spec_filtered-dashboard.json @@ -1,23 +1,28 @@ { - "attributes": { - "description": "Overview of Invalid spec filtered", - "hits": 0, - "kibanaSavedObjectMeta": { - "searchSourceJSON": { - "filter": [], - "highlightAll": true, - "query": { - "language": "kuery", - "query": "" - }, - "version": true - } - }, - "timeRestore": false, - "title": "[Invalid spec filtered] Overview", - "version": 1 + "attributes": { + "description": "Overview of Invalid spec filtered", + "hits": 0, + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "query": { + "language": "kuery", + "query": "data_stream.dataset: invalid_spec.log" + } + } }, - "coreMigrationVersion": "8.3.0", - "id": "invalid_spec_filtered-dashboard", - "type": "dashboard" + "timeRestore": false, + "title": "[Invalid spec filtered] Overview", + "version": 1 + }, + "coreMigrationVersion": "8.3.0", + "id": "invalid_spec_filtered-dashboard", + "type": "dashboard", + "references": [ + { + "id": "mytag-0", + "name": "mytag-0", + "type": "tag" + } + ] } \ No newline at end of file From 43800358cc8f314e9f43b7db858f1f23ea73b8d8 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Tue, 26 Sep 2023 14:02:42 +0200 Subject: [PATCH 13/23] Update package-spec --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a24468334..d5a1ba08d 100644 --- a/go.mod +++ b/go.mod @@ -177,4 +177,4 @@ require ( sigs.k8s.io/yaml v1.3.0 // indirect ) -replace github.com/elastic/package-spec/v2 => github.com/mrodm/package-spec/v2 v2.0.0-20230925184154-8c2b3aacfe6f +replace github.com/elastic/package-spec/v2 => github.com/mrodm/package-spec/v2 v2.0.0-20230926115614-7e22a910b038 diff --git a/go.sum b/go.sum index 46346d20c..ee233f327 100644 --- a/go.sum +++ b/go.sum @@ -305,8 +305,8 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/mrodm/package-spec/v2 v2.0.0-20230925184154-8c2b3aacfe6f h1:8palqDzbBtXI0O9WjEH6t9XewT711raRSf9s+WBNlN4= -github.com/mrodm/package-spec/v2 v2.0.0-20230925184154-8c2b3aacfe6f/go.mod h1:hKQ0du9JO310TiTP1UZkjngMAFr+dYr1MdVJcTvvC4Q= +github.com/mrodm/package-spec/v2 v2.0.0-20230926115614-7e22a910b038 h1:nIGPsSv6pfGqJ1gm0pxfWEnCWrk0mP3pX5IPk88gQbM= +github.com/mrodm/package-spec/v2 v2.0.0-20230926115614-7e22a910b038/go.mod h1:hKQ0du9JO310TiTP1UZkjngMAFr+dYr1MdVJcTvvC4Q= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= From a77482c24892016d4400520e27e5395c2cf28218 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Tue, 26 Sep 2023 15:42:44 +0200 Subject: [PATCH 14/23] Update config path --- internal/validation/validation.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/validation/validation.go b/internal/validation/validation.go index 60f9271e1..05b04179e 100644 --- a/internal/validation/validation.go +++ b/internal/validation/validation.go @@ -17,7 +17,7 @@ import ( "github.com/elastic/elastic-package/internal/logger" ) -const configErrorsPath = "errors.yml" +const validationConfigPath = "validation.yml" func ValidateFromPath(rootPath string) error { return validator.ValidateFromPath(rootPath) @@ -34,7 +34,7 @@ func ValidateAndFilterFromPath(rootPath string) (error, error) { } fsys := os.DirFS(rootPath) - errors, skipped, err := filterErrors(allErrors, fsys, configErrorsPath) + errors, skipped, err := filterErrors(allErrors, fsys, validationConfigPath) if err != nil { return err, nil } @@ -58,7 +58,7 @@ func ValidateAndFilterFromZip(packagePath string) (error, error) { return fmt.Errorf("failed to extract filesystem from zip file (%s): %w", packagePath, err), nil } - errors, skipped, err := filterErrors(allErrors, fsZip, configErrorsPath) + errors, skipped, err := filterErrors(allErrors, fsZip, validationConfigPath) if err != nil { return err, nil } From b28b12158d5e78744cdf24466f9d702acefbaae6 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Tue, 26 Sep 2023 15:46:18 +0200 Subject: [PATCH 15/23] Rename config file --- .../other/invalid_spec_filtered/{errors.yml => validation.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename test/packages/other/invalid_spec_filtered/{errors.yml => validation.yml} (100%) diff --git a/test/packages/other/invalid_spec_filtered/errors.yml b/test/packages/other/invalid_spec_filtered/validation.yml similarity index 100% rename from test/packages/other/invalid_spec_filtered/errors.yml rename to test/packages/other/invalid_spec_filtered/validation.yml From 3a89adf8a62266220955004245da8e8cd22b0b7c Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Tue, 26 Sep 2023 16:57:03 +0200 Subject: [PATCH 16/23] format dashboard test package --- .../invalid_spec_filtered-dashboard.json | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/test/packages/other/invalid_spec_filtered/kibana/dashboard/invalid_spec_filtered-dashboard.json b/test/packages/other/invalid_spec_filtered/kibana/dashboard/invalid_spec_filtered-dashboard.json index 8e18ffaab..a6e098e4b 100644 --- a/test/packages/other/invalid_spec_filtered/kibana/dashboard/invalid_spec_filtered-dashboard.json +++ b/test/packages/other/invalid_spec_filtered/kibana/dashboard/invalid_spec_filtered-dashboard.json @@ -1,28 +1,28 @@ { - "attributes": { - "description": "Overview of Invalid spec filtered", - "hits": 0, - "kibanaSavedObjectMeta": { - "searchSourceJSON": { - "filter": [], - "query": { - "language": "kuery", - "query": "data_stream.dataset: invalid_spec.log" - } - } + "attributes": { + "description": "Overview of Invalid spec filtered", + "hits": 0, + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "query": { + "language": "kuery", + "query": "data_stream.dataset: invalid_spec.log" + } + } + }, + "timeRestore": false, + "title": "[Invalid spec filtered] Overview", + "version": 1 }, - "timeRestore": false, - "title": "[Invalid spec filtered] Overview", - "version": 1 - }, - "coreMigrationVersion": "8.3.0", - "id": "invalid_spec_filtered-dashboard", - "type": "dashboard", - "references": [ - { - "id": "mytag-0", - "name": "mytag-0", - "type": "tag" - } - ] + "coreMigrationVersion": "8.3.0", + "id": "invalid_spec_filtered-dashboard", + "type": "dashboard", + "references": [ + { + "id": "mytag-0", + "name": "mytag-0", + "type": "tag" + } + ] } \ No newline at end of file From 3aea1fb30e0bfeb3f6f1ff56740537509935ca99 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Tue, 26 Sep 2023 19:27:26 +0200 Subject: [PATCH 17/23] Update package-spec --- go.mod | 2 +- go.sum | 4 ++-- internal/validation/validation.go | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index d5a1ba08d..c6e4f9198 100644 --- a/go.mod +++ b/go.mod @@ -177,4 +177,4 @@ require ( sigs.k8s.io/yaml v1.3.0 // indirect ) -replace github.com/elastic/package-spec/v2 => github.com/mrodm/package-spec/v2 v2.0.0-20230926115614-7e22a910b038 +replace github.com/elastic/package-spec/v2 => github.com/mrodm/package-spec/v2 v2.0.0-20230926171924-1b0b6af1b3eb diff --git a/go.sum b/go.sum index ee233f327..28787fe93 100644 --- a/go.sum +++ b/go.sum @@ -305,8 +305,8 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/mrodm/package-spec/v2 v2.0.0-20230926115614-7e22a910b038 h1:nIGPsSv6pfGqJ1gm0pxfWEnCWrk0mP3pX5IPk88gQbM= -github.com/mrodm/package-spec/v2 v2.0.0-20230926115614-7e22a910b038/go.mod h1:hKQ0du9JO310TiTP1UZkjngMAFr+dYr1MdVJcTvvC4Q= +github.com/mrodm/package-spec/v2 v2.0.0-20230926171924-1b0b6af1b3eb h1:ehFz+TxgJoSCVHMk2xa1Jjt6Q0BoG00Lhkey/MwdiqU= +github.com/mrodm/package-spec/v2 v2.0.0-20230926171924-1b0b6af1b3eb/go.mod h1:hKQ0du9JO310TiTP1UZkjngMAFr+dYr1MdVJcTvvC4Q= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= diff --git a/internal/validation/validation.go b/internal/validation/validation.go index 05b04179e..2d5379375 100644 --- a/internal/validation/validation.go +++ b/internal/validation/validation.go @@ -10,8 +10,8 @@ import ( "io/fs" "os" - ve "github.com/elastic/package-spec/v2/code/go/pkg/errors" - "github.com/elastic/package-spec/v2/code/go/pkg/errors/processors" + "github.com/elastic/package-spec/v2/code/go/pkg/specerrors" + "github.com/elastic/package-spec/v2/code/go/pkg/specerrors/processors" "github.com/elastic/package-spec/v2/code/go/pkg/validator" "github.com/elastic/elastic-package/internal/logger" @@ -82,7 +82,7 @@ func fsFromPackageZip(fsys fs.FS) (fs.FS, error) { } func filterErrors(allErrors error, fsys fs.FS, configPath string) (error, error, error) { - errs, ok := allErrors.(ve.ValidationErrors) + errs, ok := allErrors.(specerrors.ValidationErrors) if !ok { return allErrors, nil, nil } From ab17f6a9aabda68269a06e3e79698b16b979a27f Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Wed, 27 Sep 2023 18:57:17 +0200 Subject: [PATCH 18/23] Apply suggestions from code review Co-authored-by: Jaime Soriano Pastor --- cmd/lint.go | 2 +- internal/builder/packages.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/lint.go b/cmd/lint.go index b994a1a1f..a2a26025f 100644 --- a/cmd/lint.go +++ b/cmd/lint.go @@ -71,7 +71,7 @@ func validateSourceCommandAction(cmd *cobra.Command, args []string) error { } errs, skipped := validation.ValidateAndFilterFromPath(packageRootPath) if skipped != nil { - logger.Infof("skipped errors: %v", skipped) + logger.Infof("Skipped errors: %v", skipped) } if errs != nil { return fmt.Errorf("linting package failed: %w", errs) diff --git a/internal/builder/packages.go b/internal/builder/packages.go index 1d7d208a1..94c1b89b7 100644 --- a/internal/builder/packages.go +++ b/internal/builder/packages.go @@ -196,7 +196,7 @@ func BuildPackage(options BuildOptions) (string, error) { logger.Debugf("Validating built package (path: %s)", destinationDir) errs, skipped := validation.ValidateAndFilterFromPath(destinationDir) if skipped != nil { - logger.Infof("skipped errors: %v", skipped) + logger.Infof("Skipped errors: %v", skipped) } if errs != nil { return "", fmt.Errorf("invalid content found in built package: %w", errs) @@ -222,7 +222,7 @@ func buildZippedPackage(options BuildOptions, destinationDir string) (string, er logger.Debugf("Validating built .zip package (path: %s)", zippedPackagePath) errs, skipped := validation.ValidateAndFilterFromZip(zippedPackagePath) if skipped != nil { - logger.Infof("skipped errors: %v", skipped) + logger.Infof("Skipped errors: %v", skipped) } if errs != nil { return "", fmt.Errorf("invalid content found in built zip package: %w", errs) From d0c43cc5588107b3ea017c65e4832ba5d00a1621 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Wed, 27 Sep 2023 18:58:39 +0200 Subject: [PATCH 19/23] Apply suggestions from code review Co-authored-by: Jaime Soriano Pastor --- internal/packages/installer/factory.go | 2 +- internal/validation/validation.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/packages/installer/factory.go b/internal/packages/installer/factory.go index 8d88f6452..5309438d2 100644 --- a/internal/packages/installer/factory.go +++ b/internal/packages/installer/factory.go @@ -62,7 +62,7 @@ func NewForPackage(options Options) (Installer, error) { logger.Debugf("Validating built .zip package (path: %s)", options.ZipPath) errs, skipped := validation.ValidateAndFilterFromZip(options.ZipPath) if skipped != nil { - logger.Infof("skipped errors: %v", skipped) + logger.Infof("Skipped errors: %v", skipped) } if errs != nil { return nil, fmt.Errorf("invalid content found in built zip package: %w", errs) diff --git a/internal/validation/validation.go b/internal/validation/validation.go index 2d5379375..59547f81f 100644 --- a/internal/validation/validation.go +++ b/internal/validation/validation.go @@ -24,7 +24,7 @@ func ValidateFromPath(rootPath string) error { } func ValidateFromZip(packagePath string) error { - return validator.ValidateFromPath(packagePath) + return validator.ValidateFromZip(packagePath) } func ValidateAndFilterFromPath(rootPath string) (error, error) { From b1c0f731666643bd1039166596f080093ce0762a Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Wed, 27 Sep 2023 19:08:28 +0200 Subject: [PATCH 20/23] Update package-spec and code accordingly --- go.mod | 2 +- go.sum | 4 +-- internal/validation/validation.go | 43 +++++++++++++++---------------- 3 files changed, 24 insertions(+), 25 deletions(-) diff --git a/go.mod b/go.mod index c6e4f9198..4a44cf09a 100644 --- a/go.mod +++ b/go.mod @@ -177,4 +177,4 @@ require ( sigs.k8s.io/yaml v1.3.0 // indirect ) -replace github.com/elastic/package-spec/v2 => github.com/mrodm/package-spec/v2 v2.0.0-20230926171924-1b0b6af1b3eb +replace github.com/elastic/package-spec/v2 => github.com/mrodm/package-spec/v2 v2.0.0-20230927165325-f1f5449c2284 diff --git a/go.sum b/go.sum index 28787fe93..ba2096b86 100644 --- a/go.sum +++ b/go.sum @@ -305,8 +305,8 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/mrodm/package-spec/v2 v2.0.0-20230926171924-1b0b6af1b3eb h1:ehFz+TxgJoSCVHMk2xa1Jjt6Q0BoG00Lhkey/MwdiqU= -github.com/mrodm/package-spec/v2 v2.0.0-20230926171924-1b0b6af1b3eb/go.mod h1:hKQ0du9JO310TiTP1UZkjngMAFr+dYr1MdVJcTvvC4Q= +github.com/mrodm/package-spec/v2 v2.0.0-20230927165325-f1f5449c2284 h1:hyQ8ICJkzsoJXNaMntPZq1jtpzlLEVDHEgOFiHyrQ28= +github.com/mrodm/package-spec/v2 v2.0.0-20230927165325-f1f5449c2284/go.mod h1:hKQ0du9JO310TiTP1UZkjngMAFr+dYr1MdVJcTvvC4Q= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= diff --git a/internal/validation/validation.go b/internal/validation/validation.go index 59547f81f..19cc8eaa3 100644 --- a/internal/validation/validation.go +++ b/internal/validation/validation.go @@ -6,19 +6,15 @@ package validation import ( "archive/zip" + "errors" "fmt" "io/fs" "os" "github.com/elastic/package-spec/v2/code/go/pkg/specerrors" - "github.com/elastic/package-spec/v2/code/go/pkg/specerrors/processors" "github.com/elastic/package-spec/v2/code/go/pkg/validator" - - "github.com/elastic/elastic-package/internal/logger" ) -const validationConfigPath = "validation.yml" - func ValidateFromPath(rootPath string) error { return validator.ValidateFromPath(rootPath) } @@ -34,11 +30,11 @@ func ValidateAndFilterFromPath(rootPath string) (error, error) { } fsys := os.DirFS(rootPath) - errors, skipped, err := filterErrors(allErrors, fsys, validationConfigPath) + result, err := filterErrors(allErrors, fsys) if err != nil { return err, nil } - return errors, skipped + return result.Processed, result.Removed } func ValidateAndFilterFromZip(packagePath string) (error, error) { @@ -58,11 +54,11 @@ func ValidateAndFilterFromZip(packagePath string) (error, error) { return fmt.Errorf("failed to extract filesystem from zip file (%s): %w", packagePath, err), nil } - errors, skipped, err := filterErrors(allErrors, fsZip, validationConfigPath) + result, err := filterErrors(allErrors, fsZip) if err != nil { return err, nil } - return errors, skipped + return result.Processed, result.Removed } func fsFromPackageZip(fsys fs.FS) (fs.FS, error) { @@ -81,28 +77,31 @@ func fsFromPackageZip(fsys fs.FS) (fs.FS, error) { return subDir, nil } -func filterErrors(allErrors error, fsys fs.FS, configPath string) (error, error, error) { +func filterErrors(allErrors error, fsys fs.FS) (specerrors.FilterResult, error) { errs, ok := allErrors.(specerrors.ValidationErrors) if !ok { - return allErrors, nil, nil + return specerrors.FilterResult{Processed: allErrors, Removed: nil}, nil } - _, err := fs.Stat(fsys, configPath) - if err != nil { - logger.Debugf("file not found: %s", configPath) - return allErrors, nil, nil + config, err := specerrors.LoadConfigFilter(fsys) + if err != nil && errors.Is(err, fs.ErrNotExist) { + return specerrors.FilterResult{Processed: allErrors, Removed: nil}, nil } - - config, err := processors.LoadConfigFilter(fsys, configPath) if err != nil { - return nil, nil, fmt.Errorf("failed to read config filter: %w", err) + return specerrors.FilterResult{Processed: allErrors, Removed: nil}, + fmt.Errorf("failed to read config filter: %w", err) + } + if config == nil { + return specerrors.FilterResult{Processed: allErrors, Removed: nil}, nil } - filter := processors.NewFilter(config) + filter := specerrors.NewFilter(config) - filteredErrors, skippedErrors, err := filter.Run(errs) + result, err := filter.Run(errs) if err != nil { - return nil, nil, fmt.Errorf("failed to filter errors: %w", err) + return specerrors.FilterResult{Processed: allErrors, Removed: nil}, + fmt.Errorf("failed to filter errors: %w", err) } - return filteredErrors, skippedErrors, nil + return result, nil + } From 7901cd9b50835906ae92e952dbc1dbe04c692d27 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Fri, 29 Sep 2023 11:45:01 +0200 Subject: [PATCH 21/23] Add documentation about filter errors --- docs/howto/filter_errors.md | 45 +++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 docs/howto/filter_errors.md diff --git a/docs/howto/filter_errors.md b/docs/howto/filter_errors.md new file mode 100644 index 000000000..f29558ca0 --- /dev/null +++ b/docs/howto/filter_errors.md @@ -0,0 +1,45 @@ +# HOWTO: Filter errors based on Validation Codes + +## Introduction + +Starting with package-spec 2.13.0, there is an option to filter some errors based on their validation codes. + +These validation codes are defined in package-spec [here][package-spec-code-errors]. + +## How to filter specific errors + +Since package-spec 2.13.0, it's allowed to define a new file in the root of the package `validation.yml`. +In this file, the errors to be filtered will be configured following this syntax: + +```yaml +errors: + exclude_checks: + - code1 + - code2 +``` + +`exclude_checks` key accepts a list of codes so more than one kind of error can be filtered. + + +The code errors available to use in this configuration can be checked [here][package-spec-code-errors]. +The codes can be also checked in the error message itself shown by elastic-package. If the error is allowed +to be filtered, it will have at the end of the message the code in parenthesis. + +For instance, in this example the error code is `SVR00002`: + +``` +[2023-09-28T19:10:19.758Z] Error: checking package failed: linting package failed: found 1 validation error: +[2023-09-28T19:10:19.758Z] 1. file "/var/lib/jenkins/workspace/est-manager_integrations_PR-8012/src/github.com/elastic/integrations/packages/o365/kibana/dashboard/o365-712e2c00-685d-11ea-8d6a-292ef5d68366.json" is invalid: expected filter in dashboard: no filter found (SVR00002) +``` + + +For that specific error, if it is needed to be filtered, then the configuration file `validation.yml` should be like: +```yaml +errors: + exclude_checks: + - SVR00002 +``` + + +[package-spec-code-errors]: https://github.com/elastic/package-spec/blob/49120aea627a1652823a7f344ba3d1c9b029fd5a/code/go/pkg/specerrors/constants.go + From cbf2261a7da0fe384c30eacab13223b5a811a8d4 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Fri, 29 Sep 2023 15:51:08 +0200 Subject: [PATCH 22/23] Remove replace package-spec --- go.mod | 6 +++--- go.sum | 10 +++++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 4a44cf09a..221e08de2 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/elastic/go-licenser v0.4.1 github.com/elastic/go-resource v0.1.1 github.com/elastic/go-ucfg v0.8.6 - github.com/elastic/package-spec/v2 v2.12.0 + github.com/elastic/package-spec/v2 v2.13.0 github.com/fatih/color v1.15.0 github.com/go-git/go-billy/v5 v5.5.0 github.com/go-git/go-git/v5 v5.9.0 @@ -67,6 +67,7 @@ require ( github.com/dnephin/pflag v1.0.7 // indirect github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 // indirect github.com/elastic/gojsonschema v1.2.1 // indirect + github.com/elastic/kbncontent v0.1.1 // indirect github.com/emicklei/go-restful/v3 v3.10.1 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect @@ -137,6 +138,7 @@ require ( github.com/skeema/knownhosts v1.2.0 // indirect github.com/spf13/cast v1.5.0 // indirect github.com/spf13/pflag v1.0.5 // indirect + github.com/stretchr/objx v0.5.1 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/ulikunitz/xz v0.5.11 // indirect @@ -176,5 +178,3 @@ require ( sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) - -replace github.com/elastic/package-spec/v2 => github.com/mrodm/package-spec/v2 v2.0.0-20230927165325-f1f5449c2284 diff --git a/go.sum b/go.sum index ba2096b86..c152d23f1 100644 --- a/go.sum +++ b/go.sum @@ -100,6 +100,10 @@ github.com/elastic/go-ucfg v0.8.6 h1:stUeyh2goTgGX+/wb9gzKvTv0YB0231LTpKUgCKj4U0 github.com/elastic/go-ucfg v0.8.6/go.mod h1:4E8mPOLSUV9hQ7sgLEJ4bvt0KhMuDJa8joDT2QGAEKA= github.com/elastic/gojsonschema v1.2.1 h1:cUMbgsz0wyEB4x7xf3zUEvUVDl6WCz2RKcQPul8OsQc= github.com/elastic/gojsonschema v1.2.1/go.mod h1:biw5eBS2Z4T02wjATMRSfecfjCmwaDPvuaqf844gLrg= +github.com/elastic/kbncontent v0.1.1 h1:X6ZXKPTW3MwFZPLMZcPAbpUIsKQhFImhBGKOd83+UFo= +github.com/elastic/kbncontent v0.1.1/go.mod h1:kOPREITK9gSJsiw/WKe7QWSO+PRiZMyEFQCw+CMLAHI= +github.com/elastic/package-spec/v2 v2.13.0 h1:loZ0xZOzsobV4LIQZphavRY/CPMKJK463psSUGjZBxg= +github.com/elastic/package-spec/v2 v2.13.0/go.mod h1:OcEnGWmL05XtMAb8qJweiVaePwMb2GQhFFpiYFTgzcc= github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ= @@ -305,8 +309,6 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/mrodm/package-spec/v2 v2.0.0-20230927165325-f1f5449c2284 h1:hyQ8ICJkzsoJXNaMntPZq1jtpzlLEVDHEgOFiHyrQ28= -github.com/mrodm/package-spec/v2 v2.0.0-20230927165325-f1f5449c2284/go.mod h1:hKQ0du9JO310TiTP1UZkjngMAFr+dYr1MdVJcTvvC4Q= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= @@ -368,8 +370,9 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.1 h1:4VhoImhV/Bm0ToFkXFi8hXNXwpDRZ/ynw3amt82mzq0= +github.com/stretchr/objx v0.5.1/go.mod h1:/iHQpkQwBD6DLUmQ4pE+s1TXdob1mORJ4/UFdrifcy0= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -379,6 +382,7 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= From b3d13cb94cff7ee1bdcb0ee616ce333907649b88 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Fri, 29 Sep 2023 16:14:05 +0200 Subject: [PATCH 23/23] Ampty array of panelsJSON in dashboard --- .../kibana/dashboard/invalid_spec_filtered-dashboard.json | 1 + 1 file changed, 1 insertion(+) diff --git a/test/packages/other/invalid_spec_filtered/kibana/dashboard/invalid_spec_filtered-dashboard.json b/test/packages/other/invalid_spec_filtered/kibana/dashboard/invalid_spec_filtered-dashboard.json index a6e098e4b..9fc3da860 100644 --- a/test/packages/other/invalid_spec_filtered/kibana/dashboard/invalid_spec_filtered-dashboard.json +++ b/test/packages/other/invalid_spec_filtered/kibana/dashboard/invalid_spec_filtered-dashboard.json @@ -11,6 +11,7 @@ } } }, + "panelsJSON": [], "timeRestore": false, "title": "[Invalid spec filtered] Overview", "version": 1