Skip to content

Commit 1b639db

Browse files
mergify[bot]Kaan Yalti
andauthored
[9.1] (backport #9392) Enhancement/5235 use disk space error to set upgrade detail in coordinator (#10057)
* 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 df9bb44 commit 1b639db

File tree

3 files changed

+144
-0
lines changed

3 files changed

+144
-0
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
@@ -29,6 +29,7 @@ import (
2929
"github.com/elastic/elastic-agent/internal/pkg/agent/application/info"
3030
"github.com/elastic/elastic-agent/internal/pkg/agent/application/reexec"
3131
"github.com/elastic/elastic-agent/internal/pkg/agent/application/upgrade"
32+
upgradeErrors "github.com/elastic/elastic-agent/internal/pkg/agent/application/upgrade/artifact/download/errors"
3233
"github.com/elastic/elastic-agent/internal/pkg/agent/application/upgrade/details"
3334
"github.com/elastic/elastic-agent/internal/pkg/agent/configuration"
3435
"github.com/elastic/elastic-agent/internal/pkg/agent/transpiler"
@@ -671,6 +672,15 @@ func (c *Coordinator) Upgrade(ctx context.Context, version string, sourceURI str
671672
det.SetState(details.StateCompleted)
672673
return c.upgradeMgr.AckAction(ctx, c.fleetAcker, action)
673674
}
675+
676+
c.logger.Errorw("upgrade failed", "error", logp.Error(err))
677+
// If ErrInsufficientDiskSpace is in the error chain, we want to set the
678+
// the error to ErrInsufficientDiskSpace so that the error message is
679+
// more concise and clear.
680+
if errors.Is(err, upgradeErrors.ErrInsufficientDiskSpace) {
681+
err = upgradeErrors.ErrInsufficientDiskSpace
682+
}
683+
674684
det.Fail(err)
675685
return err
676686
}

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

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,13 @@ import (
1515
"errors"
1616
"fmt"
1717
"net"
18+
"sync"
1819
"testing"
1920
"time"
2021

2122
"github.com/elastic/elastic-agent-client/v7/pkg/proto"
23+
"github.com/elastic/elastic-agent/internal/pkg/fleetapi"
24+
"github.com/elastic/elastic-agent/internal/pkg/fleetapi/acker"
2225
"github.com/elastic/elastic-agent/internal/pkg/otel/translate"
2326

2427
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status"
@@ -32,8 +35,10 @@ import (
3235
"github.com/elastic/elastic-agent-libs/logp"
3336
"github.com/elastic/elastic-agent/internal/pkg/agent/application/info"
3437
"github.com/elastic/elastic-agent/internal/pkg/agent/application/monitoring/reload"
38+
"github.com/elastic/elastic-agent/internal/pkg/agent/application/reexec"
3539
"github.com/elastic/elastic-agent/internal/pkg/agent/application/upgrade"
3640
"github.com/elastic/elastic-agent/internal/pkg/agent/application/upgrade/artifact"
41+
upgradeErrors "github.com/elastic/elastic-agent/internal/pkg/agent/application/upgrade/artifact/download/errors"
3742
"github.com/elastic/elastic-agent/internal/pkg/agent/application/upgrade/details"
3843
"github.com/elastic/elastic-agent/internal/pkg/agent/transpiler"
3944
"github.com/elastic/elastic-agent/internal/pkg/config"
@@ -1650,3 +1655,100 @@ func (fs *fakeMonitoringServer) Reset() {
16501655
func (fs *fakeMonitoringServer) Addr() net.Addr {
16511656
return nil
16521657
}
1658+
1659+
type mockUpgradeManager struct {
1660+
upgradeErr error
1661+
}
1662+
1663+
func (m *mockUpgradeManager) Upgradeable() bool {
1664+
return true
1665+
}
1666+
1667+
func (m *mockUpgradeManager) Reload(cfg *config.Config) error {
1668+
return nil
1669+
}
1670+
1671+
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) {
1672+
return nil, m.upgradeErr
1673+
}
1674+
1675+
func (m *mockUpgradeManager) Ack(ctx context.Context, acker acker.Acker) error {
1676+
return nil
1677+
}
1678+
1679+
func (m *mockUpgradeManager) AckAction(ctx context.Context, acker acker.Acker, action fleetapi.Action) error {
1680+
return nil
1681+
}
1682+
1683+
func (m *mockUpgradeManager) MarkerWatcher() upgrade.MarkerWatcher {
1684+
return nil
1685+
}
1686+
1687+
func TestCoordinator_Upgrade_InsufficientDiskSpaceError(t *testing.T) {
1688+
log, _ := loggertest.New("coordinator-insufficient-disk-space-test")
1689+
1690+
mockUpgradeManager := &mockUpgradeManager{
1691+
upgradeErr: fmt.Errorf("wrapped: %w", upgradeErrors.ErrInsufficientDiskSpace),
1692+
}
1693+
1694+
initialState := State{
1695+
CoordinatorState: agentclient.Healthy,
1696+
CoordinatorMessage: "Running",
1697+
}
1698+
1699+
coord := &Coordinator{
1700+
state: initialState,
1701+
logger: log,
1702+
upgradeMgr: mockUpgradeManager,
1703+
stateBroadcaster: broadcaster.New(initialState, 64, 32),
1704+
overrideStateChan: make(chan *coordinatorOverrideState),
1705+
upgradeDetailsChan: make(chan *details.Details),
1706+
}
1707+
1708+
wg := sync.WaitGroup{}
1709+
wg.Add(2)
1710+
1711+
overrideStates := []agentclient.State{}
1712+
go func() {
1713+
state1 := <-coord.overrideStateChan
1714+
overrideStates = append(overrideStates, state1.state)
1715+
1716+
state2 := <-coord.overrideStateChan
1717+
if state2 != nil {
1718+
overrideStates = append(overrideStates, state2.state)
1719+
}
1720+
1721+
wg.Done()
1722+
}()
1723+
1724+
upgradeDetails := []*details.Details{}
1725+
go func() {
1726+
upgradeDetails = append(upgradeDetails, <-coord.upgradeDetailsChan)
1727+
upgradeDetails = append(upgradeDetails, <-coord.upgradeDetailsChan)
1728+
wg.Done()
1729+
}()
1730+
1731+
err := coord.Upgrade(t.Context(), "", "", nil)
1732+
require.Error(t, err)
1733+
require.Equal(t, err, upgradeErrors.ErrInsufficientDiskSpace)
1734+
1735+
wg.Wait()
1736+
1737+
require.Equal(t, []agentclient.State{agentclient.Upgrading}, overrideStates)
1738+
1739+
require.Equal(t, []*details.Details{
1740+
{
1741+
TargetVersion: "",
1742+
State: details.StateRequested,
1743+
ActionID: "",
1744+
},
1745+
{
1746+
TargetVersion: "",
1747+
State: details.StateFailed,
1748+
Metadata: details.Metadata{
1749+
FailedState: details.StateRequested,
1750+
ErrorMsg: upgradeErrors.ErrInsufficientDiskSpace.Error(),
1751+
},
1752+
},
1753+
}, upgradeDetails)
1754+
}

0 commit comments

Comments
 (0)