Skip to content

Commit 97e8ef6

Browse files
mergify[bot]Kaan Yalti
andauthored
[8.18] (backport #9392) Enhancement/5235 use disk space error to set upgrade detail in coordinator (#10054)
* Enhancement/5235 use disk space error to set upgrade detail in coordinator (#9392) * enhancement(5235): added insufficinet disk space error handling in the coordinator * enhancement(5235): added coordinator tests for insufficient disk space error enhancement(5235): updated error in test enhancement(5235): fix coordinator test * enhancement(5235): added changelog fragment (cherry picked from commit a7a76f6) # Conflicts: # internal/pkg/agent/application/coordinator/coordinator_unit_test.go * resolved merge conflicts --------- Co-authored-by: Kaan Yalti <kaan.yalti@elastic.co>
1 parent b1d0474 commit 97e8ef6

File tree

3 files changed

+147
-1
lines changed

3 files changed

+147
-1
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# Kind can be one of:
2+
# - breaking-change: a change to previously-documented behavior
3+
# - deprecation: functionality that is being removed in a later release
4+
# - bug-fix: fixes a problem in a previous version
5+
# - enhancement: extends functionality but does not break or fix existing behavior
6+
# - feature: new functionality
7+
# - known-issue: problems that we are aware of in a given version
8+
# - security: impacts on the security of a product or a user’s deployment.
9+
# - upgrade: important information for someone upgrading from a prior version
10+
# - other: does not fit into any of the other categories
11+
kind: enhancement
12+
13+
# Change summary; a 80ish characters long description of the change.
14+
summary: when there is a disk space error during an upgrade, agent responds with clean insufficient disk space error message
15+
16+
# Long description; in case the summary is not enough to describe the change
17+
# this field accommodate a description without length limits.
18+
# NOTE: This field will be rendered only for breaking-change and known-issue kinds at the moment.
19+
#description:
20+
21+
# Affected component; usually one of "elastic-agent", "fleet-server", "filebeat", "metricbeat", "auditbeat", "all", etc.
22+
component: "elastic-agent"
23+
24+
# PR URL; optional; the PR number that added the changeset.
25+
# If not present is automatically filled by the tooling finding the PR where this changelog fragment has been added.
26+
# NOTE: the tooling supports backports, so it's able to fill the original PR number instead of the backport PR number.
27+
# Please provide it if you are adding a fragment for a different PR.
28+
pr: https://github.com/elastic/elastic-agent/pull/9392
29+
30+
# Issue URL; optional; the GitHub issue related to this changeset (either closes or is part of).
31+
# If not present is automatically filled by the tooling with the issue linked to the PR number.
32+
issue: https://github.com/elastic/elastic-agent/issues/5235

internal/pkg/agent/application/coordinator/coordinator.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"github.com/elastic/elastic-agent/internal/pkg/agent/application/info"
2828
"github.com/elastic/elastic-agent/internal/pkg/agent/application/reexec"
2929
"github.com/elastic/elastic-agent/internal/pkg/agent/application/upgrade"
30+
upgradeErrors "github.com/elastic/elastic-agent/internal/pkg/agent/application/upgrade/artifact/download/errors"
3031
"github.com/elastic/elastic-agent/internal/pkg/agent/application/upgrade/details"
3132
"github.com/elastic/elastic-agent/internal/pkg/agent/configuration"
3233
"github.com/elastic/elastic-agent/internal/pkg/agent/transpiler"
@@ -659,6 +660,15 @@ func (c *Coordinator) Upgrade(ctx context.Context, version string, sourceURI str
659660
det.SetState(details.StateCompleted)
660661
return c.upgradeMgr.AckAction(ctx, c.fleetAcker, action)
661662
}
663+
664+
c.logger.Errorw("upgrade failed", "error", logp.Error(err))
665+
// If ErrInsufficientDiskSpace is in the error chain, we want to set the
666+
// the error to ErrInsufficientDiskSpace so that the error message is
667+
// more concise and clear.
668+
if errors.Is(err, upgradeErrors.ErrInsufficientDiskSpace) {
669+
err = upgradeErrors.ErrInsufficientDiskSpace
670+
}
671+
662672
det.Fail(err)
663673
return err
664674
}

internal/pkg/agent/application/coordinator/coordinator_unit_test.go

Lines changed: 105 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,16 @@ package coordinator
1313
import (
1414
"context"
1515
"errors"
16+
"fmt"
1617
"net"
18+
"sync"
1719
"testing"
1820
"time"
1921

22+
"github.com/elastic/elastic-agent/internal/pkg/config"
23+
"github.com/elastic/elastic-agent/internal/pkg/fleetapi"
24+
"github.com/elastic/elastic-agent/internal/pkg/fleetapi/acker"
25+
2026
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status"
2127
"go.opentelemetry.io/collector/component/componentstatus"
2228
"go.opentelemetry.io/collector/confmap"
@@ -28,11 +34,12 @@ import (
2834
"github.com/elastic/elastic-agent-libs/logp"
2935
"github.com/elastic/elastic-agent/internal/pkg/agent/application/info"
3036
"github.com/elastic/elastic-agent/internal/pkg/agent/application/monitoring/reload"
37+
"github.com/elastic/elastic-agent/internal/pkg/agent/application/reexec"
3138
"github.com/elastic/elastic-agent/internal/pkg/agent/application/upgrade"
3239
"github.com/elastic/elastic-agent/internal/pkg/agent/application/upgrade/artifact"
40+
upgradeErrors "github.com/elastic/elastic-agent/internal/pkg/agent/application/upgrade/artifact/download/errors"
3341
"github.com/elastic/elastic-agent/internal/pkg/agent/application/upgrade/details"
3442
"github.com/elastic/elastic-agent/internal/pkg/agent/transpiler"
35-
"github.com/elastic/elastic-agent/internal/pkg/config"
3643
monitoringCfg "github.com/elastic/elastic-agent/internal/pkg/core/monitoring/config"
3744
"github.com/elastic/elastic-agent/pkg/component"
3845
"github.com/elastic/elastic-agent/pkg/component/runtime"
@@ -1293,3 +1300,100 @@ func (fs *fakeMonitoringServer) Reset() {
12931300
func (fs *fakeMonitoringServer) Addr() net.Addr {
12941301
return nil
12951302
}
1303+
1304+
type mockUpgradeManager struct {
1305+
upgradeErr error
1306+
}
1307+
1308+
func (m *mockUpgradeManager) Upgradeable() bool {
1309+
return true
1310+
}
1311+
1312+
func (m *mockUpgradeManager) Reload(cfg *config.Config) error {
1313+
return nil
1314+
}
1315+
1316+
func (m *mockUpgradeManager) Upgrade(ctx context.Context, version string, sourceURI string, action *fleetapi.ActionUpgrade, details *details.Details, skipVerifyOverride bool, skipDefaultPgp bool, pgpBytes ...string) (_ reexec.ShutdownCallbackFn, err error) {
1317+
return nil, m.upgradeErr
1318+
}
1319+
1320+
func (m *mockUpgradeManager) Ack(ctx context.Context, acker acker.Acker) error {
1321+
return nil
1322+
}
1323+
1324+
func (m *mockUpgradeManager) AckAction(ctx context.Context, acker acker.Acker, action fleetapi.Action) error {
1325+
return nil
1326+
}
1327+
1328+
func (m *mockUpgradeManager) MarkerWatcher() upgrade.MarkerWatcher {
1329+
return nil
1330+
}
1331+
1332+
func TestCoordinator_Upgrade_InsufficientDiskSpaceError(t *testing.T) {
1333+
log, _ := loggertest.New("coordinator-insufficient-disk-space-test")
1334+
1335+
mockUpgradeManager := &mockUpgradeManager{
1336+
upgradeErr: fmt.Errorf("wrapped: %w", upgradeErrors.ErrInsufficientDiskSpace),
1337+
}
1338+
1339+
initialState := State{
1340+
CoordinatorState: agentclient.Healthy,
1341+
CoordinatorMessage: "Running",
1342+
}
1343+
1344+
coord := &Coordinator{
1345+
state: initialState,
1346+
logger: log,
1347+
upgradeMgr: mockUpgradeManager,
1348+
stateBroadcaster: broadcaster.New(initialState, 64, 32),
1349+
overrideStateChan: make(chan *coordinatorOverrideState),
1350+
upgradeDetailsChan: make(chan *details.Details),
1351+
}
1352+
1353+
wg := sync.WaitGroup{}
1354+
wg.Add(2)
1355+
1356+
overrideStates := []agentclient.State{}
1357+
go func() {
1358+
state1 := <-coord.overrideStateChan
1359+
overrideStates = append(overrideStates, state1.state)
1360+
1361+
state2 := <-coord.overrideStateChan
1362+
if state2 != nil {
1363+
overrideStates = append(overrideStates, state2.state)
1364+
}
1365+
1366+
wg.Done()
1367+
}()
1368+
1369+
upgradeDetails := []*details.Details{}
1370+
go func() {
1371+
upgradeDetails = append(upgradeDetails, <-coord.upgradeDetailsChan)
1372+
upgradeDetails = append(upgradeDetails, <-coord.upgradeDetailsChan)
1373+
wg.Done()
1374+
}()
1375+
1376+
err := coord.Upgrade(t.Context(), "", "", nil)
1377+
require.Error(t, err)
1378+
require.Equal(t, err, upgradeErrors.ErrInsufficientDiskSpace)
1379+
1380+
wg.Wait()
1381+
1382+
require.Equal(t, []agentclient.State{agentclient.Upgrading}, overrideStates)
1383+
1384+
require.Equal(t, []*details.Details{
1385+
{
1386+
TargetVersion: "",
1387+
State: details.StateRequested,
1388+
ActionID: "",
1389+
},
1390+
{
1391+
TargetVersion: "",
1392+
State: details.StateFailed,
1393+
Metadata: details.Metadata{
1394+
FailedState: details.StateRequested,
1395+
ErrorMsg: upgradeErrors.ErrInsufficientDiskSpace.Error(),
1396+
},
1397+
},
1398+
}, upgradeDetails)
1399+
}

0 commit comments

Comments
 (0)