diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a677b2ab..783f6252c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +* Add `requires` field to package index and search responses so clients can inspect package dependencies (input and content) before downloading. [#1612](https://github.com/elastic/package-registry/pull/1612) * Support for referencing inputs and streams by `package`: `type` (for inputs) and `input` (for streams) are no longer required when `package` is set (format_version 3.6.0+, aligns with package-spec and composable packages). [#1605](https://github.com/elastic/package-registry/pull/1605) * Sort packages by semver when searching, after existing title sorting. [#1585](https://github.com/elastic/package-registry/pull/1585) diff --git a/packages/package.go b/packages/package.go index ac4561608..0248ef888 100644 --- a/packages/package.go +++ b/packages/package.go @@ -62,6 +62,18 @@ type Package struct { type FileSystemBuilder func(*Package) (PackageFileSystem, error) +// PackageRequirement defines a dependency on another package (input or content). +type PackageRequirement struct { + Package string `config:"package" json:"package" yaml:"package" validate:"required"` + Version string `config:"version" json:"version" yaml:"version" validate:"required"` +} + +// PackageRequirements holds package dependencies from the manifest requires field. +type PackageRequirements struct { + Input []PackageRequirement `config:"input,omitempty" json:"input,omitempty" yaml:"input,omitempty"` + Content []PackageRequirement `config:"content,omitempty" json:"content,omitempty" yaml:"content,omitempty"` +} + // BasePackage is used for the output of the package info in the /search endpoint type BasePackage struct { Name string `config:"name" json:"name"` @@ -83,6 +95,7 @@ type BasePackage struct { Discovery *Discovery `config:"discovery,omitempty" json:"discovery,omitempty,omitzero" yaml:"discovery,omitempty"` BaseDataStreams []*BaseDataStream `config:"data_streams,omitempty" json:"data_streams,omitempty" yaml:"data_streams,omitempty"` Deprecated *Deprecated `config:"deprecated,omitempty" json:"deprecated,omitempty" yaml:"deprecated,omitempty"` + Requires *PackageRequirements `config:"requires,omitempty" json:"requires,omitempty" yaml:"requires,omitempty"` } // BasePolicyTemplate is used for the package policy templates in the /search endpoint diff --git a/packages/testdata/marshaler/packages.json b/packages/testdata/marshaler/packages.json index 7663ba92c..95a794c35 100644 --- a/packages/testdata/marshaler/packages.json +++ b/packages/testdata/marshaler/packages.json @@ -3006,6 +3006,14 @@ "categories": [ "custom" ], + "requires": { + "input": [ + { + "package": "sql_input", + "version": "0.2.0" + } + ] + }, "format_version": "3.6.0", "readme": "/package/package_reference/0.1.0/docs/README.md", "license": "basic", @@ -3046,10 +3054,19 @@ "categories": [ "custom" ], + "requires": { + "input": [ + { + "package": "sql_input", + "version": "0.2.0" + } + ] + }, "format_version": "3.6.0", "readme": "/package/package_reference_stream/0.1.0/docs/README.md", "license": "basic", "assets": [ + "/package/package_reference_stream/0.1.0/changelog.yml", "/package/package_reference_stream/0.1.0/manifest.yml", "/package/package_reference_stream/0.1.0/docs/README.md", "/package/package_reference_stream/0.1.0/data_stream/valid_stream/manifest.yml", diff --git a/testdata/generated/package/package_reference/0.1.0/index.json b/testdata/generated/package/package_reference/0.1.0/index.json index 924031c66..dd796121c 100644 --- a/testdata/generated/package/package_reference/0.1.0/index.json +++ b/testdata/generated/package/package_reference/0.1.0/index.json @@ -19,6 +19,14 @@ "categories": [ "custom" ], + "requires": { + "input": [ + { + "package": "sql_input", + "version": "0.2.0" + } + ] + }, "format_version": "3.6.0", "readme": "/package/package_reference/0.1.0/docs/README.md", "license": "basic", diff --git a/testdata/generated/package/package_reference_stream/0.1.0/index.json b/testdata/generated/package/package_reference_stream/0.1.0/index.json index a78e4a4d4..7a7c34e39 100644 --- a/testdata/generated/package/package_reference_stream/0.1.0/index.json +++ b/testdata/generated/package/package_reference_stream/0.1.0/index.json @@ -14,10 +14,19 @@ "categories": [ "custom" ], + "requires": { + "input": [ + { + "package": "sql_input", + "version": "0.2.0" + } + ] + }, "format_version": "3.6.0", "readme": "/package/package_reference_stream/0.1.0/docs/README.md", "license": "basic", "assets": [ + "/package/package_reference_stream/0.1.0/changelog.yml", "/package/package_reference_stream/0.1.0/manifest.yml", "/package/package_reference_stream/0.1.0/docs/README.md", "/package/package_reference_stream/0.1.0/data_stream/valid_stream/manifest.yml", diff --git a/testdata/generated/search-all-proxy.json b/testdata/generated/search-all-proxy.json index 9659e3436..bf3c19c97 100644 --- a/testdata/generated/search-all-proxy.json +++ b/testdata/generated/search-all-proxy.json @@ -1303,7 +1303,15 @@ }, "categories": [ "custom" - ] + ], + "requires": { + "input": [ + { + "package": "sql_input", + "version": "0.2.0" + } + ] + } }, { "name": "package_reference_stream", @@ -1327,7 +1335,15 @@ "dataset": "package_reference_stream.valid_stream", "title": "Package Reference Stream" } - ] + ], + "requires": { + "input": [ + { + "package": "sql_input", + "version": "0.2.0" + } + ] + } }, { "name": "reference", diff --git a/testdata/generated/search-all.json b/testdata/generated/search-all.json index 56e41b966..c476bffe7 100644 --- a/testdata/generated/search-all.json +++ b/testdata/generated/search-all.json @@ -1264,7 +1264,15 @@ }, "categories": [ "custom" - ] + ], + "requires": { + "input": [ + { + "package": "sql_input", + "version": "0.2.0" + } + ] + } }, { "name": "package_reference_stream", @@ -1288,7 +1296,15 @@ "dataset": "package_reference_stream.valid_stream", "title": "Package Reference Stream" } - ] + ], + "requires": { + "input": [ + { + "package": "sql_input", + "version": "0.2.0" + } + ] + } }, { "name": "reference", diff --git a/testdata/generated/search-category-custom.json b/testdata/generated/search-category-custom.json index 36924a788..0cf409587 100644 --- a/testdata/generated/search-category-custom.json +++ b/testdata/generated/search-category-custom.json @@ -698,7 +698,15 @@ }, "categories": [ "custom" - ] + ], + "requires": { + "input": [ + { + "package": "sql_input", + "version": "0.2.0" + } + ] + } }, { "name": "package_reference_stream", @@ -722,7 +730,15 @@ "dataset": "package_reference_stream.valid_stream", "title": "Package Reference Stream" } - ] + ], + "requires": { + "input": [ + { + "package": "sql_input", + "version": "0.2.0" + } + ] + } }, { "name": "reference", diff --git a/testdata/generated/search-just-latest-proxy.json b/testdata/generated/search-just-latest-proxy.json index 47dd9493d..838a4de68 100644 --- a/testdata/generated/search-just-latest-proxy.json +++ b/testdata/generated/search-just-latest-proxy.json @@ -1080,7 +1080,15 @@ }, "categories": [ "custom" - ] + ], + "requires": { + "input": [ + { + "package": "sql_input", + "version": "0.2.0" + } + ] + } }, { "name": "package_reference_stream", @@ -1104,7 +1112,15 @@ "dataset": "package_reference_stream.valid_stream", "title": "Package Reference Stream" } - ] + ], + "requires": { + "input": [ + { + "package": "sql_input", + "version": "0.2.0" + } + ] + } }, { "name": "reference", diff --git a/testdata/generated/search-kibana652.json b/testdata/generated/search-kibana652.json index 3bac82755..86d86063b 100644 --- a/testdata/generated/search-kibana652.json +++ b/testdata/generated/search-kibana652.json @@ -236,7 +236,15 @@ "dataset": "package_reference_stream.valid_stream", "title": "Package Reference Stream" } - ] + ], + "requires": { + "input": [ + { + "package": "sql_input", + "version": "0.2.0" + } + ] + } }, { "name": "sql_input", diff --git a/testdata/generated/search-kibana721.json b/testdata/generated/search-kibana721.json index 647deca98..f41d7fb86 100644 --- a/testdata/generated/search-kibana721.json +++ b/testdata/generated/search-kibana721.json @@ -517,7 +517,15 @@ "dataset": "package_reference_stream.valid_stream", "title": "Package Reference Stream" } - ] + ], + "requires": { + "input": [ + { + "package": "sql_input", + "version": "0.2.0" + } + ] + } }, { "name": "reference", diff --git a/testdata/generated/search-kibana800.json b/testdata/generated/search-kibana800.json index 2df0e2d26..cfbd8b580 100644 --- a/testdata/generated/search-kibana800.json +++ b/testdata/generated/search-kibana800.json @@ -498,7 +498,15 @@ "dataset": "package_reference_stream.valid_stream", "title": "Package Reference Stream" } - ] + ], + "requires": { + "input": [ + { + "package": "sql_input", + "version": "0.2.0" + } + ] + } }, { "name": "sql_input", diff --git a/testdata/generated/search-package-experimental.json b/testdata/generated/search-package-experimental.json index 08428576c..83b63f4d0 100644 --- a/testdata/generated/search-package-experimental.json +++ b/testdata/generated/search-package-experimental.json @@ -1069,7 +1069,15 @@ }, "categories": [ "custom" - ] + ], + "requires": { + "input": [ + { + "package": "sql_input", + "version": "0.2.0" + } + ] + } }, { "name": "package_reference_stream", @@ -1093,7 +1101,15 @@ "dataset": "package_reference_stream.valid_stream", "title": "Package Reference Stream" } - ] + ], + "requires": { + "input": [ + { + "package": "sql_input", + "version": "0.2.0" + } + ] + } }, { "name": "reference", diff --git a/testdata/generated/search-package-internal.json b/testdata/generated/search-package-internal.json index ab7cbe974..75955f362 100644 --- a/testdata/generated/search-package-internal.json +++ b/testdata/generated/search-package-internal.json @@ -1041,7 +1041,15 @@ }, "categories": [ "custom" - ] + ], + "requires": { + "input": [ + { + "package": "sql_input", + "version": "0.2.0" + } + ] + } }, { "name": "package_reference_stream", @@ -1065,7 +1073,15 @@ "dataset": "package_reference_stream.valid_stream", "title": "Package Reference Stream" } - ] + ], + "requires": { + "input": [ + { + "package": "sql_input", + "version": "0.2.0" + } + ] + } }, { "name": "reference", diff --git a/testdata/generated/search-package-prerelease.json b/testdata/generated/search-package-prerelease.json index 007efa3a7..fd12b6b3f 100644 --- a/testdata/generated/search-package-prerelease.json +++ b/testdata/generated/search-package-prerelease.json @@ -1077,7 +1077,15 @@ }, "categories": [ "custom" - ] + ], + "requires": { + "input": [ + { + "package": "sql_input", + "version": "0.2.0" + } + ] + } }, { "name": "package_reference_stream", @@ -1101,7 +1109,15 @@ "dataset": "package_reference_stream.valid_stream", "title": "Package Reference Stream" } - ] + ], + "requires": { + "input": [ + { + "package": "sql_input", + "version": "0.2.0" + } + ] + } }, { "name": "reference", diff --git a/testdata/generated/search-prerelease-capabilities-none.json b/testdata/generated/search-prerelease-capabilities-none.json index 2707c2df9..57a0a25c3 100644 --- a/testdata/generated/search-prerelease-capabilities-none.json +++ b/testdata/generated/search-prerelease-capabilities-none.json @@ -1044,7 +1044,15 @@ }, "categories": [ "custom" - ] + ], + "requires": { + "input": [ + { + "package": "sql_input", + "version": "0.2.0" + } + ] + } }, { "name": "package_reference_stream", @@ -1068,7 +1076,15 @@ "dataset": "package_reference_stream.valid_stream", "title": "Package Reference Stream" } - ] + ], + "requires": { + "input": [ + { + "package": "sql_input", + "version": "0.2.0" + } + ] + } }, { "name": "reference", diff --git a/testdata/generated/search-prerelease-capabilities-observability-security.json b/testdata/generated/search-prerelease-capabilities-observability-security.json index 596191c2d..902c5b21a 100644 --- a/testdata/generated/search-prerelease-capabilities-observability-security.json +++ b/testdata/generated/search-prerelease-capabilities-observability-security.json @@ -1052,7 +1052,15 @@ }, "categories": [ "custom" - ] + ], + "requires": { + "input": [ + { + "package": "sql_input", + "version": "0.2.0" + } + ] + } }, { "name": "package_reference_stream", @@ -1076,7 +1084,15 @@ "dataset": "package_reference_stream.valid_stream", "title": "Package Reference Stream" } - ] + ], + "requires": { + "input": [ + { + "package": "sql_input", + "version": "0.2.0" + } + ] + } }, { "name": "reference", diff --git a/testdata/generated/search.json b/testdata/generated/search.json index ab7cbe974..75955f362 100644 --- a/testdata/generated/search.json +++ b/testdata/generated/search.json @@ -1041,7 +1041,15 @@ }, "categories": [ "custom" - ] + ], + "requires": { + "input": [ + { + "package": "sql_input", + "version": "0.2.0" + } + ] + } }, { "name": "package_reference_stream", @@ -1065,7 +1073,15 @@ "dataset": "package_reference_stream.valid_stream", "title": "Package Reference Stream" } - ] + ], + "requires": { + "input": [ + { + "package": "sql_input", + "version": "0.2.0" + } + ] + } }, { "name": "reference", diff --git a/testdata/package/package_reference_stream/0.1.0/changelog.yml b/testdata/package/package_reference_stream/0.1.0/changelog.yml new file mode 100644 index 000000000..5fa96a0f6 --- /dev/null +++ b/testdata/package/package_reference_stream/0.1.0/changelog.yml @@ -0,0 +1,6 @@ +# newer versions go on top +- version: "0.1.0" + changes: + - description: Initial draft of the package + type: enhancement + link: https://github.com/elastic/package-spec/pull/325 \ No newline at end of file diff --git a/testdata/package/package_reference_stream/0.1.0/manifest.yml b/testdata/package/package_reference_stream/0.1.0/manifest.yml index b51baf569..7fb360522 100644 --- a/testdata/package/package_reference_stream/0.1.0/manifest.yml +++ b/testdata/package/package_reference_stream/0.1.0/manifest.yml @@ -4,6 +4,10 @@ title: Package Reference Stream description: Test package for validating stream input/package rules. type: integration version: 0.1.0 +requires: + input: + - package: sql_input + version: 0.2.0 categories: - custom owner: