diff --git a/internal/pkg/api/handleAck.go b/internal/pkg/api/handleAck.go index a45606267..ada3eef48 100644 --- a/internal/pkg/api/handleAck.go +++ b/internal/pkg/api/handleAck.go @@ -612,22 +612,18 @@ func (ack *AckT) handleUpgrade(ctx context.Context, zlog zerolog.Logger, agent * zlog.Info().Msg("marking agent upgrade as failed, agent logs contain failure message") doc = bulk.UpdateFields{ dl.FieldUpgradeStartedAt: nil, - dl.FieldUpgradeStatus: "failed", } } else if event.Payload.Retry { zlog.Info().Int("retry_attempt", event.Payload.RetryAttempt).Msg("marking agent upgrade as retrying") - doc[dl.FieldUpgradeStatus] = "retrying" // Keep FieldUpgradeStatedAt abd FieldUpgradeded at to original values } else { zlog.Info().Int("retry_attempt", event.Payload.RetryAttempt).Msg("marking agent upgrade as failed, agent logs contain failure message") doc = bulk.UpdateFields{ dl.FieldUpgradeStartedAt: nil, - dl.FieldUpgradeStatus: "failed", } } } else { doc = bulk.UpdateFields{ dl.FieldUpgradeStartedAt: nil, - dl.FieldUpgradeStatus: nil, dl.FieldUpgradedAt: now, } if agent.UpgradeDetails == nil { diff --git a/internal/pkg/api/handleAck_test.go b/internal/pkg/api/handleAck_test.go index d6a68ceac..67bb6b2b1 100644 --- a/internal/pkg/api/handleAck_test.go +++ b/internal/pkg/api/handleAck_test.go @@ -719,67 +719,6 @@ func TestAckHandleUpgrade(t *testing.T) { ESDocument: model.ESDocument{Id: "ab12dcd8-bde0-4045-92dc-c4b27668d735"}, Agent: &model.AgentMetadata{Version: "8.0.0"}, }, - }, { - name: "retry signaled", - event: UpgradeEvent{ - Error: ptr("upgrade error"), - Payload: &struct { - Retry bool `json:"retry"` - RetryAttempt int `json:"retry_attempt"` - }{ - Retry: true, - RetryAttempt: 1, - }, - }, - bulker: func(t *testing.T) *ftesting.MockBulk { - m := ftesting.NewMockBulk() - m.On("Update", mock.Anything, mock.Anything, mock.Anything, mock.MatchedBy(func(p []byte) bool { - var body struct { - Doc struct { - Status string `json:"upgrade_status"` - } `json:"doc"` - } - if err := json.Unmarshal(p, &body); err != nil { - t.Fatal(err) - } - return body.Doc.Status == "retrying" - }), mock.Anything).Return(nil).Once() - return m - }, - agent: &model.Agent{ - ESDocument: model.ESDocument{Id: "ab12dcd8-bde0-4045-92dc-c4b27668d735"}, - Agent: &model.AgentMetadata{Version: "8.0.0"}, - }, - }, { - name: "no more retries", - event: UpgradeEvent{ - Error: ptr("upgrade error"), - Payload: &struct { - Retry bool `json:"retry"` - RetryAttempt int `json:"retry_attempt"` - }{ - Retry: false, - }, - }, - bulker: func(t *testing.T) *ftesting.MockBulk { - m := ftesting.NewMockBulk() - m.On("Update", mock.Anything, mock.Anything, mock.Anything, mock.MatchedBy(func(p []byte) bool { - var body struct { - Doc struct { - Status string `json:"upgrade_status"` - } `json:"doc"` - } - if err := json.Unmarshal(p, &body); err != nil { - t.Fatal(err) - } - return body.Doc.Status == "failed" - }), mock.Anything).Return(nil).Once() - return m - }, - agent: &model.Agent{ - ESDocument: model.ESDocument{Id: "ab12dcd8-bde0-4045-92dc-c4b27668d735"}, - Agent: &model.AgentMetadata{Version: "8.0.0"}, - }, }, { name: "keep upgrade_attempts if upgrade_details is not nil", event: UpgradeEvent{}, diff --git a/internal/pkg/api/handleCheckin.go b/internal/pkg/api/handleCheckin.go index 6baf1d0b4..9b2b527cd 100644 --- a/internal/pkg/api/handleCheckin.go +++ b/internal/pkg/api/handleCheckin.go @@ -28,6 +28,7 @@ import ( "github.com/elastic/fleet-server/v7/internal/pkg/checkin" "github.com/elastic/fleet-server/v7/internal/pkg/config" "github.com/elastic/fleet-server/v7/internal/pkg/dl" + "github.com/elastic/fleet-server/v7/internal/pkg/es" "github.com/elastic/fleet-server/v7/internal/pkg/logger/ecs" "github.com/elastic/fleet-server/v7/internal/pkg/model" "github.com/elastic/fleet-server/v7/internal/pkg/monitor" @@ -454,22 +455,21 @@ func (ct *CheckinT) processUpgradeDetails(ctx context.Context, agent *model.Agen 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 { + + var actionTraceparent string + if action, err := ct.verifyActionExists(ctx, vSpan, agent, details); err == nil && action != nil { + actionTraceparent = action.Traceparent + } else if !errors.Is(err, es.ErrNotFound) { 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 ct.bulker.HasTracer() && actionTraceparent != "" { + traceCtx, err := apmhttp.ParseTraceparentHeader(actionTraceparent) if err != nil { - zerolog.Ctx(vCtx).Trace().Err(err).Msgf("Error parsing traceparent: %s %s", action.Traceparent, err) + zerolog.Ctx(vCtx).Trace().Err(err).Msgf("Error parsing traceparent: %s %s", actionTraceparent, err) } else { links = []apm.SpanLink{ { @@ -565,7 +565,6 @@ func (ct *CheckinT) markUpgradeComplete(ctx context.Context, agent *model.Agent) doc := bulk.UpdateFields{ dl.FieldUpgradeDetails: nil, dl.FieldUpgradeStartedAt: nil, - dl.FieldUpgradeStatus: nil, dl.FieldUpgradedAt: time.Now().UTC().Format(time.RFC3339), } body, err := doc.Marshal() diff --git a/internal/pkg/api/handleCheckin_test.go b/internal/pkg/api/handleCheckin_test.go index 07b775f78..768b688a1 100644 --- a/internal/pkg/api/handleCheckin_test.go +++ b/internal/pkg/api/handleCheckin_test.go @@ -419,7 +419,7 @@ func TestProcessUpgradeDetails(t *testing.T) { t.Logf("bulk match unmarshal error: %v", err) return false } - return doc.Doc[dl.FieldUpgradeDetails] == nil && doc.Doc[dl.FieldUpgradeStartedAt] == nil && doc.Doc[dl.FieldUpgradeStatus] == nil && doc.Doc[dl.FieldUpgradedAt] != "" + return doc.Doc[dl.FieldUpgradeDetails] == nil && doc.Doc[dl.FieldUpgradeStartedAt] == nil && doc.Doc[dl.FieldUpgradedAt] != "" }), mock.Anything, mock.Anything).Return(nil) return mBulk }, @@ -467,12 +467,28 @@ func TestProcessUpgradeDetails(t *testing.T) { }, err: nil, }, { - name: "upgrade requested action invalid", + name: "upgrade requested action not found", agent: &model.Agent{ESDocument: esd, Agent: &model.AgentMetadata{ID: "test-agent"}}, details: &UpgradeDetails{ActionId: "test-action", State: UpgradeDetailsStateUPGREQUESTED}, bulk: func() *ftesting.MockBulk { mBulk := ftesting.NewMockBulk() mBulk.On("Search", mock.Anything, dl.FleetActions, mock.Anything, mock.Anything).Return(&es.ResultT{}, es.ErrNotFound) + mBulk.On("Update", mock.Anything, dl.FleetAgents, "doc-ID", mock.Anything, mock.Anything, mock.Anything).Return(nil) + return mBulk + }, + cache: func() *testcache.MockCache { + mCache := testcache.NewMockCache() + mCache.On("GetAction", "test-action").Return(model.Action{}, false) + return mCache + }, + err: nil, + }, { + name: "upgrade requested action failed to fetch", + agent: &model.Agent{ESDocument: esd, Agent: &model.AgentMetadata{ID: "test-agent"}}, + details: &UpgradeDetails{ActionId: "test-action", State: UpgradeDetailsStateUPGREQUESTED}, + bulk: func() *ftesting.MockBulk { + mBulk := ftesting.NewMockBulk() + mBulk.On("Search", mock.Anything, dl.FleetActions, mock.Anything, mock.Anything).Return(&es.ResultT{}, es.ErrTimeout) return mBulk }, cache: func() *testcache.MockCache { @@ -480,7 +496,7 @@ func TestProcessUpgradeDetails(t *testing.T) { mCache.On("GetAction", "test-action").Return(model.Action{}, false) return mCache }, - err: es.ErrNotFound, + err: es.ErrTimeout, }, { name: "upgrade scheduled action in cache", agent: &model.Agent{ESDocument: esd, Agent: &model.AgentMetadata{ID: "test-agent"}}, diff --git a/internal/pkg/dl/constants.go b/internal/pkg/dl/constants.go index 7937d6287..b474b1d58 100644 --- a/internal/pkg/dl/constants.go +++ b/internal/pkg/dl/constants.go @@ -53,7 +53,6 @@ const ( FieldUnenrolledAt = "unenrolled_at" FieldUpgradedAt = "upgraded_at" FieldUpgradeStartedAt = "upgrade_started_at" - FieldUpgradeStatus = "upgrade_status" FieldUpgradeDetails = "upgrade_details" FieldUpgradeAttempts = "upgrade_attempts"