Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
81bffe3
Use new format in calls to policy API
jsoriano Feb 25, 2026
3d5512f
Linting
jsoriano Feb 25, 2026
1efe551
Fix integration tests
jsoriano Feb 25, 2026
c129e4b
Small refactor
jsoriano Feb 25, 2026
9905be8
More refactors
jsoriano Feb 26, 2026
cf18521
Error handling
jsoriano Feb 26, 2026
a359c3d
Fix regression on dataset overrides
jsoriano Feb 26, 2026
ff70842
Move Build* functions out of the resources package
jsoriano Feb 26, 2026
05a838f
Linting
jsoriano Feb 26, 2026
8f1abc4
Merge remote-tracking branch 'origin/main' into refactor-policy-api
jsoriano Feb 26, 2026
a786745
Use MapStr
jsoriano Feb 26, 2026
5af7c6b
Fix generation of yaml variables
jsoriano Feb 26, 2026
bdce2c1
Don't try to marshal yaml variables that are already strings
jsoriano Feb 27, 2026
0bf4a9d
Keep support for legacy API, for old versions of the stack
jsoriano Feb 27, 2026
aca6820
Merge remote-tracking branch 'origin/main' into refactor-policy-api
jsoriano Feb 27, 2026
9082f51
Apply the conversion to legacy logic till 8.0
jsoriano Feb 27, 2026
23073eb
Self-review
jsoriano Feb 27, 2026
c7a230b
Add test case for legacy API, and fix it
jsoriano Feb 27, 2026
bb76d84
Merge remote-tracking branch 'origin/main' into refactor-policy-api
jsoriano Feb 27, 2026
516dde2
Fix in AGENTS.md
jsoriano Feb 27, 2026
bd5ffbc
Title should be only included in legacy API
jsoriano Feb 27, 2026
9d5a089
Don't convert YAML, default to first stream when no stream is found
jsoriano Mar 2, 2026
5b3dd8a
Mimic Fleet UI behavior, add tests for that
jsoriano Mar 2, 2026
e97860c
Remove bluecoat test package, as it was intended to cover legacy poli…
jsoriano Mar 3, 2026
2756906
Remove inclusion of default values when using the simplified API
jsoriano Mar 3, 2026
7e61757
Fix sibling streams scoping and add multi-policy-template test
jsoriano Mar 3, 2026
c67f0d7
Add test for input packages
jsoriano Mar 3, 2026
6a9987d
Remove unused code
jsoriano Mar 3, 2026
db43a30
Extract function to build inputs
jsoriano Mar 3, 2026
4fac9ce
Merge remote-tracking branch 'origin/main' into refactor-policy-api
jsoriano Mar 3, 2026
095a960
Fix issue with input packages and datasets
jsoriano Mar 3, 2026
28274c9
Small refactors
jsoriano Mar 3, 2026
6b372ac
Fix configuring variables at the package level
jsoriano Mar 3, 2026
48b68fc
Fix regression on default dataset for input packages
jsoriano Mar 3, 2026
a11b2e2
Remove unneded code after explicitly getting the dataset
jsoriano Mar 4, 2026
40ae726
Fix more cases of parsed configuration
jsoriano Mar 4, 2026
9e38ca8
Correctly get variables when they contain dots in their names
jsoriano Mar 4, 2026
996ae85
Merge remote-tracking branch 'origin/main' into refactor-policy-api
jsoriano Mar 4, 2026
85a812b
Allow to force the API format to use
jsoriano Mar 4, 2026
6e8ec9d
Add test package for legacy policy api
jsoriano Mar 5, 2026
705bbd1
Add policy_api_format to policy tests too
jsoriano Mar 5, 2026
55e5440
Simplify buildStreamsForInput
jsoriano Mar 5, 2026
be6d01a
Add support for package-level variables in input packages
jsoriano Mar 5, 2026
c4094bb
Add support for use APM
jsoriano Mar 5, 2026
4b57aab
Merge remote-tracking branch 'origin/main' into refactor-policy-api
jsoriano Mar 5, 2026
2f6bc37
Add more tests from #3312
jsoriano Mar 5, 2026
fdf61a9
Remove by now the policy tests that require policy_api_format
jsoriano Mar 5, 2026
cea23e7
Linting
jsoriano Mar 5, 2026
5fb7451
Merge remote-tracking branch 'origin/main' into refactor-policy-api
jsoriano Mar 5, 2026
fa323db
Add test case disabling use of APM
jsoriano Mar 5, 2026
2fcad76
Add omitempty to new setting in policy tests
jsoriano Mar 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,5 +67,5 @@ elastic-package uses the objects-based Fleet API (`PackagePolicy`) — not the d
- **Input key**: `"{policyTemplate.Name}-{input.Type}"` (e.g. `"apache-logfile"`).
- **Stream key**: built by `datasetKey(pkgName, ds)` — uses `ds.Dataset` when set, otherwise `"{pkgName}.{ds.Name}"`.
- **Sibling stream disabling**: Fleet auto-enables all streams for an enabled input unless they are explicitly listed with `enabled: false`. Always send `{enabled: false}` for every sibling data stream sharing the same input type within the same policy template.
- **Policy template scoping**: When a policy template declares a `data_streams` list, only include data streams from that list as siblings. Use `packages.DataStreamsForInput(packageRoot, policyTemplate, streamInput)` to get the correct set.
- **Variable format**: the objects-based API expects raw values, not `{"type": ..., "value": ...}` wrappers. `Vars.ToMap()` extracts raw values via `val.Value.Value()`.
- **Policy template scoping**: When a policy template declares a `data_streams` list, only include data streams from that list as siblings. Use `packages.FilterDatastreamsForPolicyTemplate(datastreams, policyTemplate)` on the result of `packages.ReadAllDataStreamManifests(packageRoot)` to get the correct set.
- **Variable format**: the objects-based API expects raw values, not `{"type": ..., "value": ...}` wrappers. `Vars.ToMapStr()` extracts raw values via `val.Value.Value()`.
2 changes: 1 addition & 1 deletion internal/benchrunner/runners/system/runner.go
Original file line number Diff line number Diff line change
Expand Up @@ -487,7 +487,7 @@ func (r *runner) createPackagePolicy(ctx context.Context, pkgManifest *packages.
pp.Package.Name = r.scenario.Package
pp.Package.Version = r.scenario.Version

policy, err := r.options.KibanaClient.CreatePackagePolicy(ctx, pp)
policy, err := r.options.KibanaClient.CreatePackagePolicy(ctx, pp, kibana.PolicyAPIFormatAuto)
if err != nil {
return nil, err
}
Expand Down
117 changes: 117 additions & 0 deletions internal/kibana/legacypolicy.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
// 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 kibana provides Fleet API client functionality.
// This file contains the legacy (arrays-based) package policy types and
// conversion logic used for old Kibana versions.

package kibana

// legacyDataStream identifies a data stream in the legacy package policy format.
type legacyDataStream struct {
Type string `json:"type"`
Dataset string `json:"dataset"`
}

// legacyStream is one stream entry in the legacy inputs array format.
type legacyStream struct {
ID string `json:"id,omitempty"`
Enabled bool `json:"enabled"`
DataStream legacyDataStream `json:"data_stream"`
Vars map[string]Var `json:"vars,omitempty"`
}

// legacyInput is one input entry in the legacy inputs array format.
type legacyInput struct {
PolicyTemplate string `json:"policy_template,omitempty"`
Type string `json:"type"`
Enabled bool `json:"enabled"`
Vars map[string]Var `json:"vars,omitempty"`
Streams []legacyStream `json:"streams"`
}

// legacyPackagePolicy is the legacy (arrays-based) Fleet package policy.
type legacyPackagePolicy struct {
Name string `json:"name"`
Description string `json:"description"`
Namespace string `json:"namespace"`
PolicyID string `json:"policy_id"`
Enabled bool `json:"enabled"`
Package struct {
Name string `json:"name"`
Title string `json:"title"`
Version string `json:"version"`
} `json:"package"`
Inputs []legacyInput `json:"inputs"`
OutputID string `json:"output_id"`
Vars map[string]Var `json:"vars,omitempty"`
Force bool `json:"force"`
}

// toLegacyMapVar converts Vars to the {value, type} map format expected by the
// legacy Fleet API.
func (v Vars) toLegacyMapVar() map[string]Var {
if len(v) == 0 {
return nil
}
m := make(map[string]Var, len(v))
for k, val := range v {
m[k] = val
}
return m
}

// toLegacy converts a PackagePolicy (simplified format) to the
// legacy arrays-based format.
func (p PackagePolicy) toLegacy() legacyPackagePolicy {
legacy := legacyPackagePolicy{
Name: p.Name,
Description: p.Description,
Namespace: p.Namespace,
PolicyID: p.PolicyID,
Enabled: true,
Force: p.Force,
Vars: p.legacyVars.toLegacyMapVar(),
}
legacy.Package.Name = p.Package.Name
legacy.Package.Title = p.legacyPackageTitle
legacy.Package.Version = p.Package.Version
legacy.OutputID = p.OutputID

// Convert each input from the simplified map to a legacy input entry.
// Skip disabled inputs to match the legacy (main-branch) behaviour.
for _, i := range p.Inputs {
if !i.Enabled {
continue
}
input := legacyInput{
PolicyTemplate: i.policyTemplate,
Type: i.inputType,
Enabled: i.Enabled,
Vars: i.legacyVars.toLegacyMapVar(),
Streams: []legacyStream{},
}

// Convert each stream from the simplified map to a legacy stream entry.
// Skip disabled streams to match the legacy behaviour.
for _, s := range i.Streams {
if !s.Enabled {
continue
}
stream := legacyStream{
Enabled: s.Enabled,
DataStream: legacyDataStream{
Type: s.dataStreamType,
Dataset: s.dataStreamDataset,
},
Vars: s.legacyVars.toLegacyMapVar(),
}
input.Streams = append(input.Streams, stream)
}

legacy.Inputs = append(legacy.Inputs, input)
}

return legacy
}
Loading