in internal/pkg/api/handleCheckin.go [426:523]
func (ct *CheckinT) processUpgradeDetails(ctx context.Context, agent *model.Agent, details *UpgradeDetails) error {
if details == nil {
err := ct.markUpgradeComplete(ctx, agent)
if err != nil {
return err
}
return nil
}
// update docs with in progress details
vSpan, vCtx := apm.StartSpan(ctx, "Check update action", "validate")
action, err := ct.verifyActionExists(ctx, vSpan, agent, details)
if err != nil {
return err
}
if action == nil {
return nil
}
// link action with APM spans
var links []apm.SpanLink
if ct.bulker.HasTracer() && action.Traceparent != "" {
traceCtx, err := apmhttp.ParseTraceparentHeader(action.Traceparent)
if err != nil {
zerolog.Ctx(vCtx).Trace().Err(err).Msgf("Error parsing traceparent: %s %s", action.Traceparent, err)
} else {
links = []apm.SpanLink{
{
Trace: traceCtx.Trace,
Span: traceCtx.Span,
},
}
}
}
span, ctx := apm.StartSpanOptions(ctx, "Process upgrade details", "process", apm.SpanOptions{Links: links})
span.Context.SetLabel("action_id", details.ActionId)
span.Context.SetLabel("agent_id", agent.Agent.ID)
defer span.End()
// validate metadata with state
vSpan, _ = apm.StartSpan(ctx, "validateUpgradeMetadata", "validate")
switch details.State {
case UpgradeDetailsStateUPGDOWNLOADING:
if details.Metadata == nil {
vSpan.End()
break // no validation
}
_, err := details.Metadata.AsUpgradeMetadataDownloading()
if err != nil {
vSpan.End()
return fmt.Errorf("%w %s: %w", ErrInvalidUpgradeMetadata, UpgradeDetailsStateUPGDOWNLOADING, err)
}
case UpgradeDetailsStateUPGFAILED:
if details.Metadata == nil {
vSpan.End()
return fmt.Errorf("%w: metadata missing", ErrInvalidUpgradeMetadata)
}
meta, err := details.Metadata.AsUpgradeMetadataFailed()
if err != nil {
vSpan.End()
return fmt.Errorf("%w %s: %w", ErrInvalidUpgradeMetadata, UpgradeDetailsStateUPGFAILED, err)
}
if meta.ErrorMsg == "" {
vSpan.End()
return fmt.Errorf("%w: %s metadata contains empty error_msg attribute", ErrInvalidUpgradeMetadata, UpgradeDetailsStateUPGFAILED)
}
case UpgradeDetailsStateUPGSCHEDULED:
if details.Metadata == nil {
vSpan.End()
return fmt.Errorf("%w: metadata missing", ErrInvalidUpgradeMetadata)
}
meta, err := details.Metadata.AsUpgradeMetadataScheduled()
if err != nil {
vSpan.End()
return fmt.Errorf("%w %s: %w", ErrInvalidUpgradeMetadata, UpgradeDetailsStateUPGSCHEDULED, err)
}
if meta.ScheduledAt.IsZero() {
vSpan.End()
return fmt.Errorf("%w: %s metadata contains empty scheduled_at attribute", ErrInvalidUpgradeMetadata, UpgradeDetailsStateUPGSCHEDULED)
}
default:
}
vSpan.End()
doc := bulk.UpdateFields{
dl.FieldUpgradeDetails: details,
}
if agent.UpgradeAttempts != nil && details.State == UpgradeDetailsStateUPGWATCHING {
doc[dl.FieldUpgradeAttempts] = nil
}
body, err := doc.Marshal()
if err != nil {
return err
}
return ct.bulker.Update(ctx, dl.FleetAgents, agent.Id, body, bulk.WithRefresh(), bulk.WithRetryOnConflict(3))
}