diff --git a/cmd/create_data_stream.go b/cmd/create_data_stream.go index 14e9fd6a8b..b9cf1f2540 100644 --- a/cmd/create_data_stream.go +++ b/cmd/create_data_stream.go @@ -40,6 +40,15 @@ func createDataStreamCommandAction(cmd *cobra.Command, args []string) error { return errors.New("package root not found, you can only create new data stream in the package context") } + manifest, err := packages.ReadPackageManifestFromPackageRoot(packageRoot) + if err != nil { + return fmt.Errorf("reading package manifest failed (path: %s): %w", packageRoot, err) + } + + if manifest.Type == "input" { + return fmt.Errorf("data-streams are not supported in input packages") + } + qs := []*survey.Question{ { Name: "name", diff --git a/cmd/create_package.go b/cmd/create_package.go index 14cda0d34d..9e1c446114 100644 --- a/cmd/create_package.go +++ b/cmd/create_package.go @@ -28,6 +28,7 @@ const ( type newPackageAnswers struct { Name string + Type string Version string SourceLicense string `survey:"source_license"` Title string @@ -36,12 +37,31 @@ type newPackageAnswers struct { KibanaVersion string `survey:"kibana_version"` ElasticSubscription string `survey:"elastic_subscription"` GithubOwner string `survey:"github_owner"` + DataStreamType string `survey:"datastream_type"` } func createPackageCommandAction(cmd *cobra.Command, args []string) error { cmd.Println("Create a new package") qs := []*survey.Question{ + { + Name: "type", + Prompt: &survey.Select{ + Message: "Package type:", + Options: []string{"input", "integration"}, + Default: "integration", + }, + Validate: survey.Required, + }, + } + + var answers newPackageAnswers + err := survey.Ask(qs, &answers) + if err != nil { + return fmt.Errorf("prompt failed: %w", err) + } + + qs = []*survey.Question{ { Name: "name", Prompt: &survey.Input{ @@ -132,8 +152,23 @@ func createPackageCommandAction(cmd *cobra.Command, args []string) error { }, } - var answers newPackageAnswers - err := survey.Ask(qs, &answers) + if answers.Type == "input" { + inputQs := []*survey.Question{ + { + Name: "datastream_type", + Prompt: &survey.Select{ + Message: "Input Data Stream type:", + Options: []string{"logs", "metrics"}, + Default: "logs", + }, + Validate: survey.Required, + }, + } + + qs = append(qs, inputQs...) + } + + err = survey.Ask(qs, &answers) if err != nil { return fmt.Errorf("prompt failed: %w", err) } @@ -153,11 +188,16 @@ func createPackageDescriptorFromAnswers(answers newPackageAnswers) archetype.Pac if answers.SourceLicense != noLicenseValue { sourceLicense = answers.SourceLicense } + + inputDataStreamType := "" + if answers.Type == "input" { + inputDataStreamType = answers.DataStreamType + } return archetype.PackageDescriptor{ Manifest: packages.PackageManifest{ Name: answers.Name, Title: answers.Title, - Type: "integration", + Type: answers.Type, Version: answers.Version, Source: packages.Source{ License: sourceLicense, @@ -177,5 +217,6 @@ func createPackageDescriptorFromAnswers(answers newPackageAnswers) archetype.Pac Description: answers.Description, Categories: answers.Categories, }, + InputDataStreamType: inputDataStreamType, } } diff --git a/internal/packages/archetype/_static/dataStream-agent-stream.yml.tmpl b/internal/packages/archetype/_static/dataStream-agent-stream.yml.tmpl new file mode 100644 index 0000000000..d9b7e4bca6 --- /dev/null +++ b/internal/packages/archetype/_static/dataStream-agent-stream.yml.tmpl @@ -0,0 +1,14 @@ +{{if eq .Manifest.Type "logs"}}paths: +{{ "{{#each paths as |path i|}}" }} + - {{ "{{path}}" }} +{{ "{{/each}}" }} +exclude_files: [".gz$"] +processors: + - add_locale: ~ +{{else}}metricsets: ["sample_metricset"] +hosts: +{{ "{{#each hosts}}" }} + - {{ "{{this}}" }} +{{ "{{/each}}" }} +period: {{ "{{period}}" }} +{{end}} \ No newline at end of file diff --git a/internal/packages/archetype/_static/dataStream-elasticsearch-ingest-pipeline.yml.tmpl b/internal/packages/archetype/_static/dataStream-elasticsearch-ingest-pipeline.yml.tmpl new file mode 100644 index 0000000000..aa171955c2 --- /dev/null +++ b/internal/packages/archetype/_static/dataStream-elasticsearch-ingest-pipeline.yml.tmpl @@ -0,0 +1,10 @@ +--- +description: Pipeline for processing sample logs +processors: +- set: + field: sample_field + value: "1" +on_failure: +- set: + field: error.message + value: {{ "'{{ _ingest.on_failure_message }}'" }} diff --git a/internal/packages/archetype/data_stream_manifest.go b/internal/packages/archetype/_static/dataStream-manifest.yml.tmpl similarity index 69% rename from internal/packages/archetype/data_stream_manifest.go rename to internal/packages/archetype/_static/dataStream-manifest.yml.tmpl index ef132f7fe8..5a06851854 100644 --- a/internal/packages/archetype/data_stream_manifest.go +++ b/internal/packages/archetype/_static/dataStream-manifest.yml.tmpl @@ -1,10 +1,4 @@ -// 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 archetype - -const dataStreamManifestTemplate = `title: "{{.Manifest.Title}}" +title: "{{.Manifest.Title}}" type: {{.Manifest.Type}} streams:{{if eq .Manifest.Type "logs" }} - input: logfile @@ -35,5 +29,4 @@ elasticsearch: index_mode: {{ .Manifest.Elasticsearch.IndexMode }} {{- end}} {{- end}} -{{- end}} -` +{{- end}} \ No newline at end of file diff --git a/internal/packages/archetype/_static/fields-base.yml.tmpl b/internal/packages/archetype/_static/fields-base.yml.tmpl new file mode 100644 index 0000000000..4da5428ca9 --- /dev/null +++ b/internal/packages/archetype/_static/fields-base.yml.tmpl @@ -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. \ No newline at end of file diff --git a/internal/packages/archetype/_static/input-package-agent-config.yml.tmpl b/internal/packages/archetype/_static/input-package-agent-config.yml.tmpl new file mode 100644 index 0000000000..c523a35c1a --- /dev/null +++ b/internal/packages/archetype/_static/input-package-agent-config.yml.tmpl @@ -0,0 +1,16 @@ +data_stream: + dataset: {{ "{{data_stream.dataset}}" }} +{{if eq .InputDataStreamType "logs"}}paths: +{{ "{{#each paths as |path i|}}" }} + - {{"{{path}}"}} +{{ "{{/each}}" }} +exclude_files: [".gz$"] +processors: + - add_locale: ~ +{{else}}metricsets: ["sample_metricset"] +hosts: +{{ "{{#each hosts}}" }} + - {{ "{{this}}" }} +{{ "{{/each}}" }} +period: {{ "{{period}}" }} +{{end}} diff --git a/internal/packages/archetype/_static/package-changelog.yml.tmpl b/internal/packages/archetype/_static/package-changelog.yml.tmpl new file mode 100644 index 0000000000..3873ceddb1 --- /dev/null +++ b/internal/packages/archetype/_static/package-changelog.yml.tmpl @@ -0,0 +1,6 @@ +# newer versions go on top +- version: "{{.Manifest.Version}}" + changes: + - description: Initial draft of the package + type: enhancement + link: https://github.com/elastic/integrations/pull/1 # FIXME Replace with the real PR link \ No newline at end of file diff --git a/internal/packages/archetype/package_docs_readme.go b/internal/packages/archetype/_static/package-docs-readme.md.tmpl similarity index 76% rename from internal/packages/archetype/package_docs_readme.go rename to internal/packages/archetype/_static/package-docs-readme.md.tmpl index be899a989a..003c89f703 100644 --- a/internal/packages/archetype/package_docs_readme.go +++ b/internal/packages/archetype/_static/package-docs-readme.md.tmpl @@ -1,10 +1,4 @@ -// 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 archetype - -const packageDocsReadme = ` + # {{.Manifest.Title}} @@ -57,12 +51,12 @@ For step-by-step instructions on how to set up an integration, see the +The `{data stream name}` data stream provides events from {source} of the following types: {list types}. --> @@ -76,15 +70,15 @@ An example event for ` + "`{data stream name}`" + ` looks as following: +The `{data stream name}` data stream provides events from {source} of the following types: {list types}. --> ` +{insert table} --> diff --git a/internal/packages/archetype/package_manifest.go b/internal/packages/archetype/_static/package-manifest.yml.tmpl similarity index 51% rename from internal/packages/archetype/package_manifest.go rename to internal/packages/archetype/_static/package-manifest.yml.tmpl index 2095a8d09a..a786f6c538 100644 --- a/internal/packages/archetype/package_manifest.go +++ b/internal/packages/archetype/_static/package-manifest.yml.tmpl @@ -1,10 +1,4 @@ -// 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 archetype - -const packageManifestTemplate = `format_version: 2.8.0 +format_version: 2.10.0 name: {{.Manifest.Name}} title: "{{.Manifest.Title}}" version: {{.Manifest.Version}} @@ -31,6 +25,7 @@ icons: size: 32x32 type: image/svg+xml policy_templates: +{{- if eq .Manifest.Type "integration" }} - name: sample title: Sample logs description: Collect sample logs @@ -38,6 +33,42 @@ policy_templates: - type: logfile title: Collect sample logs from instances description: Collecting sample logs +{{ else -}} +{{ if eq .InputDataStreamType "logs"}} + - name: sample + type: logs + title: Sample logs + description: Collect sample logs + input: logfile + template_path: input.yml.hbs + vars: + - name: paths + type: text + title: Paths + multi: true + default: + - /var/log/*.log +{{ else }} + - name: sample + type: metrics + title: Sample metrics + description: Collect sample metrics + input: sample/metrics + template_path: input.yml.hbs + vars: + - name: period + type: text + title: Period + default: 10s + - name: hosts + type: text + title: Hosts + multi: true + required: true + show_user: true + default: + - localhost +{{ end }} +{{ end -}} owner: - github: {{.Manifest.Owner.Github}} -` + github: {{.Manifest.Owner.Github}} \ No newline at end of file diff --git a/internal/packages/archetype/_static/sampleIcon.svg b/internal/packages/archetype/_static/sampleIcon.svg new file mode 100644 index 0000000000..6268dd88f3 --- /dev/null +++ b/internal/packages/archetype/_static/sampleIcon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/internal/packages/archetype/package_imgs.go b/internal/packages/archetype/_static/sampleScreenshot.png.b64 similarity index 90% rename from internal/packages/archetype/package_imgs.go rename to internal/packages/archetype/_static/sampleScreenshot.png.b64 index 1c4218cd53..169f71b283 100644 --- a/internal/packages/archetype/package_imgs.go +++ b/internal/packages/archetype/_static/sampleScreenshot.png.b64 @@ -1,210 +1 @@ -// 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 archetype - -import ( - "strings" -) - -var packageImgSampleIcon = []byte(``) - -// Screenshot: big Elastic logo (600x600 PNG) -var packageImgSampleScreenshot = strings.ReplaceAll(`iVBORw0KGgoAAAANSUhEUgAAAlgAAAJYCAYAAAC+ZpjcAAAACXBIWXMAAAsSAAALEgHS3X78AAAgAElEQVR4nO3de5BVZ5nv8RdoLuHSbAgQwrUDuQJKk1FhxIRONDpq -LjgyVePUMYClE/8wAzkzseqcGQdykvFURWeEZP5xxgkQp45TJ3GERB3HlKbbGCcknqTbkAsqlybcAiRNN5dAA+HUs/tdzabTl7XXet613rXW91O1C6NxX9Zuev/28z7v -8w46f/68AQAAgJ7BXEsAAABdBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABl -BCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABl -BCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABl -BCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABl -BCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlNVxQABhQvTGmZP+lOnvrTUPFf3fUGNPcx7/XbP93 -sdveAOTIoPPnz/N+Aii6Bhug6nv8OT/h69Jk/wwCWOMAQQ2ApwhYAIqkzoaoytvMjLz+FlvparbBq7IKBsAzBCwAedZgb/X2z7E5e62tFYGrkUoX4A8CFoA8aai4LSng -O9teEbYIXECKCFgAsqzOBqqlOa1QxSWBa7O9NbKkCCSHgAUga+psoFqRQhN61m2pCFyELcAhAhaALCBU6SNsAQ4RsAD4bIUNVnfwLjm1qSJsAVBAwALgG9nxt9oGK3qq -kiW7EjfaG8NPgRgIWAB8scLeirj7z0ebbNBqLPqFAKIgYAFIU8lWq1ZkaOBn0ciA03U2bAEIiYAFIA11NlStZhkwM1orghZN8cAACFgAkiTBaq0xZjlXPbPabdBaR9AC -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 -7DLiUvsnPVsXa7cT9TfbPwlVADKJgAWkq94GreBWxL6tJhumGjlwGUBeELAAv1QGrvocVriCClUzgQpAnhGwAL+VKkJXvT2geH5G3rNWG6Qqbyz5ASgEAhaQTfUV/Vym -4s+kp8u32GnpzT3+pDIFoNAIWEA+1dmbqaiC9SYIaoG+gtHuiupTEKgAAH0gYAEAACgbzAUFAADQRcACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsAC -AABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsAC -AABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsAC -AABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsAC -AABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsAC -AABQRsACAADQZIz5/xqLeaCkczTBAAAAAElFTkSuQmCC`, "\n", "") +iVBORw0KGgoAAAANSUhEUgAAAlgAAAJYCAYAAAC+ZpjcAAAACXBIWXMAAAsSAAALEgHS3X78AAAgAElEQVR4nO3de5BVZ5nv8RdoLuHSbAgQwrUDuQJKk1FhxIRONDpqLjgyVePUMYClE/8wAzkzseqcGQdykvFURWeEZP5xxgkQp45TJ3GERB3HlKbbGCcknqTbkAsqlybcAiRNN5dAA+HUs/tdzabTl7XXet613rXW91O1C6NxX9Zuev/28z7v8w46f/68AQAAgJ7BXEsAAABdBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlBCwAAABlNVxQABhQvTGmZP+lOnvrTUPFf3fUGNPcx7/XbP93sdveAOTIoPPnz/N+Aii6Bhug6nv8OT/h69Jk/wwCWOMAQQ2ApwhYAIqkzoaoytvMjLz+FlvparbBq7IKBsAzBCwAedZgb/X2z7E5e62tFYGrkUoX4A8CFoA8aai4LSngO9teEbYIXECKCFgAsqzOBqqlOa1QxSWBa7O9NbKkCCSHgAUga+psoFqRQhN61m2pCFyELcAhAhaALCBU6SNsAQ4RsAD4bIUNVnfwLjm1qSJsAVBAwALgG9nxt9oGK3qqkiW7EjfaG8NPgRgIWAB8scLeirj7z0ebbNBqLPqFAKIgYAF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Jjsa9dhiqVJ5SnIqelhYbrBqL9sIBuEPAAi5osEHLiwGlcI4DmgE4M5hLC3RrtFPgV9oDfJFP7XZ3YB3hCoArVLCAvnlxriFU3WffUyaxA3CKgAX0L2iEX5HFHYcoa7fnBq6lgR1AUghYQHgr7Ic0QSsb2m21iooVgMQRsIDqrbC3JVw7L7XaULWRYAUgLQQsILoGG7SWcw290GRDFY3rAFJHwALiK9mgtZrlw8S120C1jv4qAD4hYAG6gqrWUnYfOrXFNq5TrQLgJQIW4EbJhqylRZ0Q70CLDVSbqVYB8B0BC3CPsBUdoQpAJhGwgGSV7DLiUvsnPVsXa7cT9TfbPwlVADKJgAWkq94GreBWxL6tJhumGjlwGUBeELAAv1QGrvocVriCClUzgQpAnhGwAL+VKkJXvT2geH5G3rNWG6Qqbyz5ASgEAhaQTfUV/Vym4s+kp8u32GnpzT3+pDIFoNAIWEA+1dmbqaiC9SYIaoG+gtHuiupTEKgAAH0gYAEAACgbzAUFAADQRcACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAABQRsACAADQZIz5/xqLeaCkczTBAAAAAElFTkSuQmCC \ No newline at end of file diff --git a/internal/packages/archetype/data_stream.go b/internal/packages/archetype/data_stream.go index 8b36ff0295..b6b6c9434b 100644 --- a/internal/packages/archetype/data_stream.go +++ b/internal/packages/archetype/data_stream.go @@ -35,7 +35,7 @@ func CreateDataStream(dataStreamDescriptor DataStreamDescriptor) error { } logger.Debugf("Write base fields") - err = renderResourceFile(dataStreamFieldsBaseTemplate, &dataStreamDescriptor, filepath.Join(dataStreamDir, "fields", "base-fields.yml")) + err = renderResourceFile(fieldsBaseTemplate, &dataStreamDescriptor, filepath.Join(dataStreamDir, "fields", "base-fields.yml")) if err != nil { return fmt.Errorf("can't render base fields: %w", err) } @@ -43,7 +43,7 @@ func CreateDataStream(dataStreamDescriptor DataStreamDescriptor) error { logger.Debugf("Write agent stream") err = renderResourceFile(dataStreamAgentStreamTemplate, &dataStreamDescriptor, filepath.Join(dataStreamDir, "agent", "stream", "stream.yml.hbs")) if err != nil { - return fmt.Errorf("can't render base fields: %w", err) + return fmt.Errorf("can't render agent stream: %w", err) } if dataStreamDescriptor.Manifest.Type == "logs" { @@ -57,7 +57,7 @@ func CreateDataStream(dataStreamDescriptor DataStreamDescriptor) error { logger.Debugf("Format the entire package") err = formatter.Format(dataStreamDescriptor.PackageRoot, false) if err != nil { - return fmt.Errorf("can't format the new package: %w", err) + return fmt.Errorf("can't format the new data stream: %w", err) } fmt.Printf("New data stream has been created: %s\n", dataStreamDescriptor.Manifest.Name) diff --git a/internal/packages/archetype/data_stream_agent_stream.go b/internal/packages/archetype/data_stream_agent_stream.go deleted file mode 100644 index 69a80c0eaa..0000000000 --- a/internal/packages/archetype/data_stream_agent_stream.go +++ /dev/null @@ -1,20 +0,0 @@ -// 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 archetype - -const dataStreamAgentStreamTemplate = `{{if eq .Manifest.Type "logs"}}paths: -` + "{{`{{#each paths as |path i|}}`}}" + ` - - ` + "{{`{{path}}`}}" + ` -` + "{{`{{/each}}`}}" + ` -exclude_files: [".gz$"] -processors: - - add_locale: ~ -{{else}}metricsets: ["sample_metricset"] -hosts: -` + "{{`{{#each hosts}}`}}" + ` - - ` + "{{`{{this}}`}}" + ` -` + "{{`{{/each}}`}}" + ` -period: ` + "{{`{{period}}`}}" + ` -{{end}}` diff --git a/internal/packages/archetype/data_stream_elasticsearch_ingest_pipeline.go b/internal/packages/archetype/data_stream_elasticsearch_ingest_pipeline.go deleted file mode 100644 index 3904446b12..0000000000 --- a/internal/packages/archetype/data_stream_elasticsearch_ingest_pipeline.go +++ /dev/null @@ -1,16 +0,0 @@ -// 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 archetype - -const dataStreamElasticsearchIngestPipelineTemplate = `--- -description: Pipeline for processing sample logs -processors: -- set: - field: sample_field - value: "1" -on_failure: -- set: - field: error.message - value: '` + "{{`{{ _ingest.on_failure_message }}`}}'" diff --git a/internal/packages/archetype/data_stream_fields_base.go b/internal/packages/archetype/data_stream_fields_base.go deleted file mode 100644 index 7db40ba25c..0000000000 --- a/internal/packages/archetype/data_stream_fields_base.go +++ /dev/null @@ -1,19 +0,0 @@ -// 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 archetype - -const dataStreamFieldsBaseTemplate = `- 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/internal/packages/archetype/data_stream_test.go b/internal/packages/archetype/data_stream_test.go index b6dde6618c..fa27a8d70d 100644 --- a/internal/packages/archetype/data_stream_test.go +++ b/internal/packages/archetype/data_stream_test.go @@ -16,7 +16,7 @@ import ( func TestDataStream(t *testing.T) { t.Run("valid-logs", func(t *testing.T) { - pd := createPackageDescriptorForTest() + pd := createPackageDescriptorForTest("integration") dd := createDataStreamDescriptorForTest() dd.Manifest.Type = "logs" @@ -24,7 +24,7 @@ func TestDataStream(t *testing.T) { require.NoError(t, err) }) t.Run("valid-metrics", func(t *testing.T) { - pd := createPackageDescriptorForTest() + pd := createPackageDescriptorForTest("integration") dd := createDataStreamDescriptorForTest() dd.Manifest.Type = "metrics" @@ -32,7 +32,7 @@ func TestDataStream(t *testing.T) { require.NoError(t, err) }) t.Run("missing-type", func(t *testing.T) { - pd := createPackageDescriptorForTest() + pd := createPackageDescriptorForTest("integration") dd := createDataStreamDescriptorForTest() dd.Manifest.Type = "" diff --git a/internal/packages/archetype/package.go b/internal/packages/archetype/package.go index 9fae2255d7..d79c848333 100644 --- a/internal/packages/archetype/package.go +++ b/internal/packages/archetype/package.go @@ -18,6 +18,8 @@ import ( // PackageDescriptor defines configurable properties of the package archetype type PackageDescriptor struct { Manifest packages.PackageManifest + + InputDataStreamType string } // CreatePackage function bootstraps the new package based on the provided descriptor. @@ -70,6 +72,22 @@ func CreatePackage(packageDescriptor PackageDescriptor) error { return fmt.Errorf("can't render sample screenshot: %w", err) } + if packageDescriptor.Manifest.Type == "input" { + logger.Debugf("Write base fields") + err = renderResourceFile(fieldsBaseTemplate, &packageDescriptor, filepath.Join(baseDir, "fields", "base-fields.yml")) + if err != nil { + return fmt.Errorf("can't render base fields: %w", err) + } + + // agent input configuration + logger.Debugf("Write agent input configuration") + err = renderResourceFile(inputAgentConfigTemplate, &packageDescriptor, filepath.Join(baseDir, "agent", "input", "input.yml.hbs")) + if err != nil { + return fmt.Errorf("can't render agent stream: %w", err) + } + + } + logger.Debugf("Format the entire package") err = formatter.Format(baseDir, false) if err != nil { diff --git a/internal/packages/archetype/package_changelog.go b/internal/packages/archetype/package_changelog.go deleted file mode 100644 index ab849de83b..0000000000 --- a/internal/packages/archetype/package_changelog.go +++ /dev/null @@ -1,13 +0,0 @@ -// 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 archetype - -const packageChangelogTemplate = `# newer versions go on top -- version: "{{.Manifest.Version}}" - 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/internal/packages/archetype/package_test.go b/internal/packages/archetype/package_test.go index 4d5c6b4a7f..67cdcbddb8 100644 --- a/internal/packages/archetype/package_test.go +++ b/internal/packages/archetype/package_test.go @@ -19,15 +19,21 @@ import ( func TestPackage(t *testing.T) { t.Run("valid", func(t *testing.T) { - pd := createPackageDescriptorForTest() + pd := createPackageDescriptorForTest("integration") err := createAndCheckPackage(t, pd) require.NoError(t, err) }) t.Run("missing-version", func(t *testing.T) { - pd := createPackageDescriptorForTest() + pd := createPackageDescriptorForTest("integration") pd.Manifest.Version = "" + err := createAndCheckPackage(t, pd) + require.Error(t, err) + }) + t.Run("input-pacakge", func(t *testing.T) { + pd := createPackageDescriptorForTest("input") + err := createAndCheckPackage(t, pd) require.Error(t, err) }) @@ -53,12 +59,16 @@ func createAndCheckPackage(t require.TestingT, pd PackageDescriptor) error { return err } -func createPackageDescriptorForTest() PackageDescriptor { +func createPackageDescriptorForTest(packageType string) PackageDescriptor { + inputDataStreamType := "" + if packageType == "input" { + inputDataStreamType = "logs" + } return PackageDescriptor{ Manifest: packages.PackageManifest{ Name: "go_unit_test_package", Title: "Go Unit Test Package", - Type: "integration", + Type: packageType, Version: "1.2.3", Conditions: packages.Conditions{ Kibana: packages.KibanaConditions{ @@ -75,6 +85,7 @@ func createPackageDescriptorForTest() PackageDescriptor { License: "basic", Categories: []string{"aws", "custom"}, }, + InputDataStreamType: inputDataStreamType, } } diff --git a/internal/packages/archetype/resources.go b/internal/packages/archetype/resources.go new file mode 100644 index 0000000000..fa380dff4e --- /dev/null +++ b/internal/packages/archetype/resources.go @@ -0,0 +1,47 @@ +// 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 archetype + +import _ "embed" + +// Common Package Templates + +//go:embed _static/package-manifest.yml.tmpl +var packageManifestTemplate string + +//go:embed _static/package-changelog.yml.tmpl +var packageChangelogTemplate string + +//go:embed _static/package-docs-readme.md.tmpl +var packageDocsReadme string + +//go:embed _static/fields-base.yml.tmpl +var fieldsBaseTemplate string + +// Images (logo and screenshot) + +//go:embed _static/sampleIcon.svg +var packageImgSampleIcon []byte + +// Screenshot: big Elastic logo (600x600 PNG) + +//go:embed _static/sampleScreenshot.png.b64 +var packageImgSampleScreenshot string + +// Input Package templates + +//go:embed _static/input-package-agent-config.yml.tmpl +var inputAgentConfigTemplate string + +// Data Stream templates + +//go:embed _static/dataStream-agent-stream.yml.tmpl +var dataStreamAgentStreamTemplate string + +//go:embed _static/dataStream-elasticsearch-ingest-pipeline.yml.tmpl +var dataStreamElasticsearchIngestPipelineTemplate string + +//go:embed _static/dataStream-manifest.yml.tmpl +var dataStreamManifestTemplate string