in internal/pkg/api/handleCheckin.go [826:903]
func processPolicy(ctx context.Context, zlog zerolog.Logger, bulker bulk.Bulk, agentID string, pp *policy.ParsedPolicy) (*Action, error) {
var links []apm.SpanLink = nil // set to a nil array to preserve default behaviour if no policy links are found
if err := pp.Links.Trace.Validate(); err == nil {
links = []apm.SpanLink{pp.Links}
}
span, ctx := apm.StartSpanOptions(ctx, "processPolicy", "process", apm.SpanOptions{Links: links})
defer span.End()
zlog = zlog.With().
Str("fleet.ctx", "processPolicy").
Int64(logger.RevisionIdx, pp.Policy.RevisionIdx).
Str(LogPolicyID, pp.Policy.PolicyID).
Logger()
// Repull and decode the agent object. Do not trust the cache.
bSpan, bCtx := apm.StartSpan(ctx, "findAgent", "search")
agent, err := dl.FindAgent(bCtx, bulker, dl.QueryAgentByID, dl.FieldID, agentID)
bSpan.End()
if err != nil {
zlog.Error().Err(err).Msg("fail find agent record")
return nil, err
}
if len(pp.Policy.Data.Outputs) == 0 {
return nil, ErrNoPolicyOutput
}
data := model.ClonePolicyData(pp.Policy.Data)
for policyName, policyOutput := range data.Outputs {
// NOTE: Not sure if output secret keys collected here include new entries, but they are collected for completeness
ks, err := policy.ProcessOutputSecret(ctx, policyOutput, bulker)
if err != nil {
return nil, fmt.Errorf("failed to process output secrets %q: %w",
policyName, err)
}
pp.SecretKeys = append(pp.SecretKeys, ks...)
}
// Iterate through the policy outputs and prepare them
for _, policyOutput := range pp.Outputs {
err = policyOutput.Prepare(ctx, zlog, bulker, &agent, data.Outputs)
if err != nil {
return nil, fmt.Errorf("failed to prepare output %q: %w",
policyOutput.Name, err)
}
}
// Add replace inputs with agent prepared version.
data.Inputs = pp.Inputs
// JSON transformations to turn a model.PolicyData into an Action.data
p, err := json.Marshal(data)
if err != nil {
return nil, err
}
d := PolicyData{}
err = json.Unmarshal(p, &d)
if err != nil {
return nil, err
}
// remove duplicates from secretkeys
slices.Sort(pp.SecretKeys)
keys := slices.Compact(pp.SecretKeys)
d.SecretPaths = &keys
ad := Action_Data{}
err = ad.FromActionPolicyChange(ActionPolicyChange{d})
if err != nil {
return nil, err
}
r := policy.RevisionFromPolicy(pp.Policy)
resp := Action{
AgentId: agent.Id,
CreatedAt: pp.Policy.Timestamp,
Data: ad,
Id: r.String(),
Type: POLICYCHANGE,
}
return &resp, nil
}