@@ -13,11 +13,15 @@ package coordinator
1313import (
1414 "context"
1515 "errors"
16+ "fmt"
1617 "net"
18+ "sync"
1719 "testing"
1820 "time"
1921
2022 "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"
2125
2226 "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status"
2327 "go.opentelemetry.io/collector/component/componentstatus"
@@ -30,8 +34,10 @@ import (
3034 "github.com/elastic/elastic-agent-libs/logp"
3135 "github.com/elastic/elastic-agent/internal/pkg/agent/application/info"
3236 "github.com/elastic/elastic-agent/internal/pkg/agent/application/monitoring/reload"
37+ "github.com/elastic/elastic-agent/internal/pkg/agent/application/reexec"
3338 "github.com/elastic/elastic-agent/internal/pkg/agent/application/upgrade"
3439 "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"
3541 "github.com/elastic/elastic-agent/internal/pkg/agent/application/upgrade/details"
3642 "github.com/elastic/elastic-agent/internal/pkg/agent/transpiler"
3743 "github.com/elastic/elastic-agent/internal/pkg/config"
@@ -1569,3 +1575,100 @@ func (fs *fakeMonitoringServer) Reset() {
15691575func (fs * fakeMonitoringServer ) Addr () net.Addr {
15701576 return nil
15711577}
1578+
1579+ type mockUpgradeManager struct {
1580+ upgradeErr error
1581+ }
1582+
1583+ func (m * mockUpgradeManager ) Upgradeable () bool {
1584+ return true
1585+ }
1586+
1587+ func (m * mockUpgradeManager ) Reload (cfg * config.Config ) error {
1588+ return nil
1589+ }
1590+
1591+ 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 ) {
1592+ return nil , m .upgradeErr
1593+ }
1594+
1595+ func (m * mockUpgradeManager ) Ack (ctx context.Context , acker acker.Acker ) error {
1596+ return nil
1597+ }
1598+
1599+ func (m * mockUpgradeManager ) AckAction (ctx context.Context , acker acker.Acker , action fleetapi.Action ) error {
1600+ return nil
1601+ }
1602+
1603+ func (m * mockUpgradeManager ) MarkerWatcher () upgrade.MarkerWatcher {
1604+ return nil
1605+ }
1606+
1607+ func TestCoordinator_Upgrade_InsufficientDiskSpaceError (t * testing.T ) {
1608+ log , _ := loggertest .New ("coordinator-insufficient-disk-space-test" )
1609+
1610+ mockUpgradeManager := & mockUpgradeManager {
1611+ upgradeErr : fmt .Errorf ("wrapped: %w" , upgradeErrors .ErrInsufficientDiskSpace ),
1612+ }
1613+
1614+ initialState := State {
1615+ CoordinatorState : agentclient .Healthy ,
1616+ CoordinatorMessage : "Running" ,
1617+ }
1618+
1619+ coord := & Coordinator {
1620+ state : initialState ,
1621+ logger : log ,
1622+ upgradeMgr : mockUpgradeManager ,
1623+ stateBroadcaster : broadcaster .New (initialState , 64 , 32 ),
1624+ overrideStateChan : make (chan * coordinatorOverrideState ),
1625+ upgradeDetailsChan : make (chan * details.Details ),
1626+ }
1627+
1628+ wg := sync.WaitGroup {}
1629+ wg .Add (2 )
1630+
1631+ overrideStates := []agentclient.State {}
1632+ go func () {
1633+ state1 := <- coord .overrideStateChan
1634+ overrideStates = append (overrideStates , state1 .state )
1635+
1636+ state2 := <- coord .overrideStateChan
1637+ if state2 != nil {
1638+ overrideStates = append (overrideStates , state2 .state )
1639+ }
1640+
1641+ wg .Done ()
1642+ }()
1643+
1644+ upgradeDetails := []* details.Details {}
1645+ go func () {
1646+ upgradeDetails = append (upgradeDetails , <- coord .upgradeDetailsChan )
1647+ upgradeDetails = append (upgradeDetails , <- coord .upgradeDetailsChan )
1648+ wg .Done ()
1649+ }()
1650+
1651+ err := coord .Upgrade (t .Context (), "" , "" , nil )
1652+ require .Error (t , err )
1653+ require .Equal (t , err , upgradeErrors .ErrInsufficientDiskSpace )
1654+
1655+ wg .Wait ()
1656+
1657+ require .Equal (t , []agentclient.State {agentclient .Upgrading }, overrideStates )
1658+
1659+ require .Equal (t , []* details.Details {
1660+ {
1661+ TargetVersion : "" ,
1662+ State : details .StateRequested ,
1663+ ActionID : "" ,
1664+ },
1665+ {
1666+ TargetVersion : "" ,
1667+ State : details .StateFailed ,
1668+ Metadata : details.Metadata {
1669+ FailedState : details .StateRequested ,
1670+ ErrorMsg : upgradeErrors .ErrInsufficientDiskSpace .Error (),
1671+ },
1672+ },
1673+ }, upgradeDetails )
1674+ }
0 commit comments