@@ -13,10 +13,16 @@ package coordinator
1313import (
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() {
12931300func (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