@@ -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() {
16501655func (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