diff --git a/internal/agentdeployer/factory.go b/internal/agentdeployer/factory.go index 669ea1f54d..9800670896 100644 --- a/internal/agentdeployer/factory.go +++ b/internal/agentdeployer/factory.go @@ -41,24 +41,11 @@ type FactoryOptions struct { // Factory chooses the appropriate service runner for the given data stream, depending // on service configuration files defined in the package or data stream. func Factory(options FactoryOptions) (AgentDeployer, error) { - devDeployPath, err := FindDevDeployPath(options) - if err != nil { - return nil, fmt.Errorf("can't find \"%s\" directory: %w", options.DevDeployDir, err) - } - - agentDeployerName, err := findAgentDeployer(devDeployPath) + agentDeployerName, agentDeployerPath, err := selectAgentDeployerType(options) if err != nil { - logger.Debugf("Not found any agent deployer, using default one") - agentDeployerName = "default" - } - // if package defines `_dev/deploy/docker` folder to start their services, it should be - // using the default agent deployer` - if agentDeployerName == "docker" || agentDeployerName == "tf" { - agentDeployerName = "default" + return nil, fmt.Errorf("failed to select agent deployer type: %w", err) } - agentDeployerPath := filepath.Join(devDeployPath, agentDeployerName) - switch agentDeployerName { case "default": if options.Type != TypeTest { @@ -80,46 +67,79 @@ func Factory(options FactoryOptions) (AgentDeployer, error) { // FIXME: this docker-compose scenario contains both agent and service return nil, nil case "k8s": - if _, err := os.Stat(agentDeployerPath); err == nil { - opts := KubernetesAgentDeployerOptions{ - Profile: options.Profile, - DefinitionsDir: agentDeployerPath, - StackVersion: options.StackVersion, - PolicyName: options.PolicyName, - DataStream: options.DataStream, - RunSetup: options.RunSetup, - RunTestsOnly: options.RunTestsOnly, - RunTearDown: options.RunTearDown, - } - return NewKubernetesAgentDeployer(opts) + opts := KubernetesAgentDeployerOptions{ + Profile: options.Profile, + DefinitionsDir: agentDeployerPath, + StackVersion: options.StackVersion, + PolicyName: options.PolicyName, + DataStream: options.DataStream, + RunSetup: options.RunSetup, + RunTestsOnly: options.RunTestsOnly, + RunTearDown: options.RunTearDown, } + return NewKubernetesAgentDeployer(opts) } return nil, fmt.Errorf("unsupported agent deployer (name: %s)", agentDeployerName) } +func selectAgentDeployerType(options FactoryOptions) (string, string, error) { + devDeployPath, err := FindDevDeployPath(options) + if errors.Is(err, os.ErrNotExist) { + return "default", "", nil + } + if err != nil { + return "", "", fmt.Errorf("can't find \"%s\" directory: %w", options.DevDeployDir, err) + } + + agentDeployerNames, err := findAgentDeployers(devDeployPath) + if errors.Is(err, os.ErrNotExist) || len(agentDeployerNames) == 0 { + logger.Debugf("Not agent deployer found, using default one") + return "default", "", nil + } + if err != nil { + return "", "", fmt.Errorf("failed to find agent deployer: %w", err) + } + if len(agentDeployerNames) != 1 { + return "", "", fmt.Errorf("expected to find only one agent deployer in \"%s\"", devDeployPath) + } + agentDeployerName := agentDeployerNames[0] + + // if package defines `_dev/deploy/docker` folder to start their services, it should be + // using the default agent deployer` + if agentDeployerName == "docker" || agentDeployerName == "tf" { + return "default", "", nil + } + + // No need to check if this path exists because it comes from a directory list. + agentDeployerPath := filepath.Join(devDeployPath, agentDeployerName) + return agentDeployerName, agentDeployerPath, nil +} + // FindDevDeployPath function returns a path reference to the "_dev/deploy" directory. func FindDevDeployPath(options FactoryOptions) (string, error) { dataStreamDevDeployPath := filepath.Join(options.DataStreamRootPath, options.DevDeployDir) - if _, err := os.Stat(dataStreamDevDeployPath); err == nil { + info, err := os.Stat(dataStreamDevDeployPath) + if err == nil && info.IsDir() { return dataStreamDevDeployPath, nil - } else if !errors.Is(err, os.ErrNotExist) { + } else if err != nil && !errors.Is(err, os.ErrNotExist) { return "", fmt.Errorf("stat failed for data stream (path: %s): %w", dataStreamDevDeployPath, err) } packageDevDeployPath := filepath.Join(options.PackageRootPath, options.DevDeployDir) - if _, err := os.Stat(packageDevDeployPath); err == nil { + info, err = os.Stat(packageDevDeployPath) + if err == nil && info.IsDir() { return packageDevDeployPath, nil - } else if !errors.Is(err, os.ErrNotExist) { + } else if err != nil && !errors.Is(err, os.ErrNotExist) { return "", fmt.Errorf("stat failed for package (path: %s): %w", packageDevDeployPath, err) } - return "", fmt.Errorf("\"%s\" directory doesn't exist", options.DevDeployDir) + return "", fmt.Errorf("\"%s\" %w", options.DevDeployDir, os.ErrNotExist) } -func findAgentDeployer(devDeployPath string) (string, error) { +func findAgentDeployers(devDeployPath string) ([]string, error) { fis, err := os.ReadDir(devDeployPath) if err != nil { - return "", fmt.Errorf("can't read directory (path: %s): %w", devDeployPath, err) + return nil, fmt.Errorf("can't read directory (path: %s): %w", devDeployPath, err) } var folders []os.DirEntry @@ -129,8 +149,9 @@ func findAgentDeployer(devDeployPath string) (string, error) { } } - if len(folders) != 1 { - return "", fmt.Errorf("expected to find only one agent deployer in \"%s\"", devDeployPath) + var names []string + for _, folder := range folders { + names = append(names, folder.Name()) } - return folders[0].Name(), nil + return names, nil } diff --git a/internal/benchrunner/runners/system/runner.go b/internal/benchrunner/runners/system/runner.go index 206cfdf22a..067f4c7eb9 100644 --- a/internal/benchrunner/runners/system/runner.go +++ b/internal/benchrunner/runners/system/runner.go @@ -231,44 +231,13 @@ func (r *runner) setUp(ctx context.Context) error { func (r *runner) run(ctx context.Context) (report reporters.Reportable, err error) { var service servicedeployer.DeployedService if r.scenario.Corpora.InputService != nil { - stackVersion, err := r.options.KibanaClient.Version() - if err != nil { - return nil, fmt.Errorf("cannot request Kibana version: %w", err) - } - - // Setup service. - logger.Debug("setting up service...") - devDeployDir := filepath.Clean(filepath.Join(r.options.BenchPath, "deploy")) - opts := servicedeployer.FactoryOptions{ - PackageRootPath: r.options.PackageRootPath, - DevDeployDir: devDeployDir, - Variant: r.options.Variant, - Profile: r.options.Profile, - Type: servicedeployer.TypeBench, - StackVersion: stackVersion.Version(), - DeployIndependentAgent: false, - } - serviceDeployer, err := servicedeployer.Factory(opts) - - if err != nil { - return nil, fmt.Errorf("could not create service runner: %w", err) - } - - r.svcInfo.Name = r.scenario.Corpora.InputService.Name - service, err = serviceDeployer.SetUp(ctx, r.svcInfo) - if err != nil { - return nil, fmt.Errorf("could not setup service: %w", err) - } - - r.svcInfo = service.Info() - r.shutdownServiceHandler = func(ctx context.Context) error { - logger.Debug("tearing down service...") - if err := service.TearDown(ctx); err != nil { - return fmt.Errorf("error tearing down service: %w", err) - } - - return nil + s, err := r.setupService(ctx) + if errors.Is(err, os.ErrNotExist) { + logger.Debugf("No service deployer defined for this benchmark") + } else if err != nil { + return nil, err } + service = s } r.startMetricsColletion(ctx) @@ -288,7 +257,7 @@ func (r *runner) run(ctx context.Context) (report reporters.Reportable, err erro } // Signal to the service that the agent is ready (policy is assigned). - if r.scenario.Corpora.InputService != nil && r.scenario.Corpora.InputService.Signal != "" { + if service != nil && r.scenario.Corpora.InputService != nil && r.scenario.Corpora.InputService.Signal != "" { if err = service.Signal(ctx, r.scenario.Corpora.InputService.Signal); err != nil { return nil, fmt.Errorf("failed to notify benchmark service: %w", err) } @@ -314,6 +283,48 @@ func (r *runner) run(ctx context.Context) (report reporters.Reportable, err erro return createReport(r.options.BenchName, r.corporaFile, r.scenario, msum) } +func (r *runner) setupService(ctx context.Context) (servicedeployer.DeployedService, error) { + stackVersion, err := r.options.KibanaClient.Version() + if err != nil { + return nil, fmt.Errorf("cannot request Kibana version: %w", err) + } + + // Setup service. + logger.Debug("Setting up service...") + devDeployDir := filepath.Clean(filepath.Join(r.options.BenchPath, "deploy")) + opts := servicedeployer.FactoryOptions{ + PackageRootPath: r.options.PackageRootPath, + DevDeployDir: devDeployDir, + Variant: r.options.Variant, + Profile: r.options.Profile, + Type: servicedeployer.TypeBench, + StackVersion: stackVersion.Version(), + DeployIndependentAgent: false, + } + serviceDeployer, err := servicedeployer.Factory(opts) + if err != nil { + return nil, fmt.Errorf("could not create service runner: %w", err) + } + + r.svcInfo.Name = r.scenario.Corpora.InputService.Name + service, err := serviceDeployer.SetUp(ctx, r.svcInfo) + if err != nil { + return nil, fmt.Errorf("could not setup service: %w", err) + } + + r.svcInfo = service.Info() + r.shutdownServiceHandler = func(ctx context.Context) error { + logger.Debug("tearing down service...") + if err := service.TearDown(ctx); err != nil { + return fmt.Errorf("error tearing down service: %w", err) + } + + return nil + } + + return service, nil +} + func (r *runner) startMetricsColletion(ctx context.Context) { // TODO collect agent hosts metrics using system integration r.mcollector = newCollector( diff --git a/internal/service/boot.go b/internal/service/boot.go index bea9542653..24b6f5c8b1 100644 --- a/internal/service/boot.go +++ b/internal/service/boot.go @@ -6,6 +6,7 @@ package service import ( "context" + "errors" "fmt" "os" "os/signal" @@ -44,6 +45,10 @@ func BootUp(ctx context.Context, options Options) error { StackVersion: options.StackVersion, DeployIndependentAgent: false, }) + if errors.Is(err, os.ErrNotExist) { + fmt.Println("No service defined.") + return nil + } if err != nil { return fmt.Errorf("can't create the service deployer instance: %w", err) } @@ -67,6 +72,7 @@ func BootUp(ctx context.Context, options Options) error { fmt.Println("Service is up, please use ctrl+c to take it down") ch := make(chan os.Signal, 1) signal.Notify(ch, os.Interrupt, syscall.SIGTERM) + defer signal.Stop(ch) <-ch // Tear down the service diff --git a/internal/servicedeployer/factory.go b/internal/servicedeployer/factory.go index a25c54cb4c..7472881e92 100644 --- a/internal/servicedeployer/factory.go +++ b/internal/servicedeployer/factory.go @@ -138,7 +138,7 @@ func FindDevDeployPath(options FactoryOptions) (string, error) { return "", fmt.Errorf("stat failed for package (path: %s): %w", packageDevDeployPath, err) } - return "", fmt.Errorf("\"%s\" directory doesn't exist", options.DevDeployDir) + return "", fmt.Errorf("\"%s\" %w", options.DevDeployDir, os.ErrNotExist) } func findServiceDeployer(devDeployPath string) (string, error) { diff --git a/internal/testrunner/runners/system/runner.go b/internal/testrunner/runners/system/runner.go index e8a38a9124..cbab1c4bd5 100644 --- a/internal/testrunner/runners/system/runner.go +++ b/internal/testrunner/runners/system/runner.go @@ -464,8 +464,20 @@ func (r *runner) initRun() error { DataStreamRootPath: r.dataStreamPath, DevDeployDir: DevDeployDir, }) - if err != nil { - return fmt.Errorf("_dev/deploy directory not found: %w", err) + switch { + case errors.Is(err, os.ErrNotExist): + r.variants = r.selectVariants(nil) + case err != nil: + return fmt.Errorf("failed fo find service deploy path: %w", err) + default: + variantsFile, err := servicedeployer.ReadVariantsFile(devDeployPath) + if err != nil && !errors.Is(err, os.ErrNotExist) { + return fmt.Errorf("can't read service variant: %w", err) + } + r.variants = r.selectVariants(variantsFile) + } + if r.options.ServiceVariant != "" && len(r.variants) == 0 { + return fmt.Errorf("not found variant definition %q", r.options.ServiceVariant) } if r.options.ConfigFilePath != "" { @@ -486,16 +498,6 @@ func (r *runner) initRun() error { } } - variantsFile, err := servicedeployer.ReadVariantsFile(devDeployPath) - if err != nil && !errors.Is(err, os.ErrNotExist) { - return fmt.Errorf("can't read service variant: %w", err) - } - - r.variants = r.selectVariants(variantsFile) - if r.options.ServiceVariant != "" && len(r.variants) == 0 { - return fmt.Errorf("not found variant definition %q", r.options.ServiceVariant) - } - return nil } @@ -804,7 +806,9 @@ func (r *runner) prepareScenario(ctx context.Context, config *testConfig, svcInf scenario.agent = agentDeployed service, svcInfo, err := r.setupService(ctx, config, serviceOptions, svcInfo, agentInfo, agentDeployed, serviceStateData) - if err != nil { + if errors.Is(err, os.ErrNotExist) { + logger.Debugf("No service deployer defined for this test") + } else if err != nil { return nil, err } @@ -1000,7 +1004,7 @@ func (r *runner) prepareScenario(ctx context.Context, config *testConfig, svcInf } // Signal to the service that the agent is ready (policy is assigned). - if config.ServiceNotifySignal != "" { + if service != nil && config.ServiceNotifySignal != "" { if err = service.Signal(ctx, config.ServiceNotifySignal); err != nil { return nil, fmt.Errorf("failed to notify test service: %w", err) } @@ -1044,7 +1048,7 @@ func (r *runner) prepareScenario(ctx context.Context, config *testConfig, svcInf return hits.size() > 0, nil }, 1*time.Second, waitForDataTimeout) - if config.Service != "" && !config.IgnoreServiceError { + if service != nil && config.Service != "" && !config.IgnoreServiceError { exited, code, err := service.ExitCode(ctx, config.Service) if err != nil && !errors.Is(err, servicedeployer.ErrNotSupported) { return nil, err diff --git a/test/packages/other/test_without_service_deployer/LICENSE.txt b/test/packages/other/test_without_service_deployer/LICENSE.txt new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/test/packages/other/test_without_service_deployer/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/test/packages/other/test_without_service_deployer/_dev/build/build.yml b/test/packages/other/test_without_service_deployer/_dev/build/build.yml new file mode 100644 index 0000000000..1f4fa988f6 --- /dev/null +++ b/test/packages/other/test_without_service_deployer/_dev/build/build.yml @@ -0,0 +1,4 @@ +dependencies: + ecs: + reference: git@v8.11.0 + import_mappings: true diff --git a/test/packages/other/test_without_service_deployer/changelog.yml b/test/packages/other/test_without_service_deployer/changelog.yml new file mode 100644 index 0000000000..bb0320a524 --- /dev/null +++ b/test/packages/other/test_without_service_deployer/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/test_without_service_deployer/data_stream/agent_logs/_dev/test/system/test-default-config.yml b/test/packages/other/test_without_service_deployer/data_stream/agent_logs/_dev/test/system/test-default-config.yml new file mode 100644 index 0000000000..9d32b0c631 --- /dev/null +++ b/test/packages/other/test_without_service_deployer/data_stream/agent_logs/_dev/test/system/test-default-config.yml @@ -0,0 +1,5 @@ +vars: ~ +data_stream: + vars: + paths: + - "/usr/share/elastic-agent/state/data/logs/*" diff --git a/test/packages/other/test_without_service_deployer/data_stream/agent_logs/agent/stream/stream.yml.hbs b/test/packages/other/test_without_service_deployer/data_stream/agent_logs/agent/stream/stream.yml.hbs new file mode 100644 index 0000000000..5845510de8 --- /dev/null +++ b/test/packages/other/test_without_service_deployer/data_stream/agent_logs/agent/stream/stream.yml.hbs @@ -0,0 +1,7 @@ +paths: +{{#each paths as |path i|}} + - {{path}} +{{/each}} +exclude_files: [".gz$"] +processors: + - add_locale: ~ diff --git a/test/packages/other/test_without_service_deployer/data_stream/agent_logs/elasticsearch/ingest_pipeline/default.yml b/test/packages/other/test_without_service_deployer/data_stream/agent_logs/elasticsearch/ingest_pipeline/default.yml new file mode 100644 index 0000000000..6ee3ab161b --- /dev/null +++ b/test/packages/other/test_without_service_deployer/data_stream/agent_logs/elasticsearch/ingest_pipeline/default.yml @@ -0,0 +1,6 @@ +--- +description: Pipeline for processing sample logs +on_failure: +- set: + field: error.message + value: '{{ _ingest.on_failure_message }}' diff --git a/test/packages/other/test_without_service_deployer/data_stream/agent_logs/fields/base-fields.yml b/test/packages/other/test_without_service_deployer/data_stream/agent_logs/fields/base-fields.yml new file mode 100644 index 0000000000..7c798f4534 --- /dev/null +++ b/test/packages/other/test_without_service_deployer/data_stream/agent_logs/fields/base-fields.yml @@ -0,0 +1,12 @@ +- name: data_stream.type + type: constant_keyword + description: Data stream type. +- name: data_stream.dataset + type: constant_keyword + description: Data stream dataset. +- name: data_stream.namespace + type: constant_keyword + description: Data stream namespace. +- name: '@timestamp' + type: date + description: Event timestamp. diff --git a/test/packages/other/test_without_service_deployer/data_stream/agent_logs/fields/fields.yml b/test/packages/other/test_without_service_deployer/data_stream/agent_logs/fields/fields.yml new file mode 100644 index 0000000000..dbed2e68dc --- /dev/null +++ b/test/packages/other/test_without_service_deployer/data_stream/agent_logs/fields/fields.yml @@ -0,0 +1,4 @@ +- name: input.type + type: keyword +- name: log.offset + type: long diff --git a/test/packages/other/test_without_service_deployer/data_stream/agent_logs/manifest.yml b/test/packages/other/test_without_service_deployer/data_stream/agent_logs/manifest.yml new file mode 100644 index 0000000000..19121556c6 --- /dev/null +++ b/test/packages/other/test_without_service_deployer/data_stream/agent_logs/manifest.yml @@ -0,0 +1,13 @@ +title: "Agent Logs" +type: logs +streams: + - input: logfile + title: Sample logs + description: Collect sample logs + vars: + - name: paths + type: text + title: Paths + multi: true + default: + - /var/log/*.log diff --git a/test/packages/other/test_without_service_deployer/docs/README.md b/test/packages/other/test_without_service_deployer/docs/README.md new file mode 100644 index 0000000000..889032f310 --- /dev/null +++ b/test/packages/other/test_without_service_deployer/docs/README.md @@ -0,0 +1,84 @@ + + + +# Package with system tests and no service deployer. + + + +## 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/test_without_service_deployer/img/sample-logo.svg b/test/packages/other/test_without_service_deployer/img/sample-logo.svg new file mode 100644 index 0000000000..6268dd88f3 --- /dev/null +++ b/test/packages/other/test_without_service_deployer/img/sample-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/test/packages/other/test_without_service_deployer/img/sample-screenshot.png b/test/packages/other/test_without_service_deployer/img/sample-screenshot.png new file mode 100644 index 0000000000..d7a56a3ecc Binary files /dev/null and b/test/packages/other/test_without_service_deployer/img/sample-screenshot.png differ diff --git a/test/packages/other/test_without_service_deployer/manifest.yml b/test/packages/other/test_without_service_deployer/manifest.yml new file mode 100644 index 0000000000..1988316cd0 --- /dev/null +++ b/test/packages/other/test_without_service_deployer/manifest.yml @@ -0,0 +1,36 @@ +format_version: 3.1.3 +name: test_without_service_deployer +title: "Package with system tests and no service deployer." +version: 0.0.1 +source: + license: "Apache-2.0" +description: "This is a new package with system tests and no service deployer." +type: integration +categories: + - custom +conditions: + kibana: + version: "^8.12.2" + 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/ecosystem + type: elastic