@@ -15,16 +15,19 @@ import (
1515 "context"
1616 "encoding/json"
1717 "errors"
18+ "fmt"
1819 "net"
1920 "net/http"
2021 "net/http/httptest"
2122 "os"
2223 "path/filepath"
2324 "strings"
25+ "sync"
2426 "testing"
2527 "time"
2628
2729 "github.com/elastic/elastic-agent-client/v7/pkg/proto"
30+ "github.com/elastic/elastic-agent/internal/pkg/fleetapi/acker"
2831 "github.com/elastic/elastic-agent/internal/pkg/testutils"
2932
3033 "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status"
@@ -41,9 +44,11 @@ import (
4144 "github.com/elastic/elastic-agent/internal/pkg/agent/application/info"
4245 "github.com/elastic/elastic-agent/internal/pkg/agent/application/monitoring/reload"
4346 "github.com/elastic/elastic-agent/internal/pkg/agent/application/paths"
47+ "github.com/elastic/elastic-agent/internal/pkg/agent/application/reexec"
4448 "github.com/elastic/elastic-agent/internal/pkg/agent/application/secret"
4549 "github.com/elastic/elastic-agent/internal/pkg/agent/application/upgrade"
4650 "github.com/elastic/elastic-agent/internal/pkg/agent/application/upgrade/artifact"
51+ upgradeErrors "github.com/elastic/elastic-agent/internal/pkg/agent/application/upgrade/artifact/download/errors"
4752 "github.com/elastic/elastic-agent/internal/pkg/agent/application/upgrade/details"
4853 "github.com/elastic/elastic-agent/internal/pkg/agent/configuration"
4954 "github.com/elastic/elastic-agent/internal/pkg/agent/storage"
@@ -1981,3 +1986,100 @@ func TestHasEndpoint(t *testing.T) {
19811986 })
19821987 }
19831988}
1989+
1990+ type mockUpgradeManager struct {
1991+ upgradeErr error
1992+ }
1993+
1994+ func (m * mockUpgradeManager ) Upgradeable () bool {
1995+ return true
1996+ }
1997+
1998+ func (m * mockUpgradeManager ) Reload (cfg * config.Config ) error {
1999+ return nil
2000+ }
2001+
2002+ 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 ) {
2003+ return nil , m .upgradeErr
2004+ }
2005+
2006+ func (m * mockUpgradeManager ) Ack (ctx context.Context , acker acker.Acker ) error {
2007+ return nil
2008+ }
2009+
2010+ func (m * mockUpgradeManager ) AckAction (ctx context.Context , acker acker.Acker , action fleetapi.Action ) error {
2011+ return nil
2012+ }
2013+
2014+ func (m * mockUpgradeManager ) MarkerWatcher () upgrade.MarkerWatcher {
2015+ return nil
2016+ }
2017+
2018+ func TestCoordinator_Upgrade_InsufficientDiskSpaceError (t * testing.T ) {
2019+ log , _ := loggertest .New ("coordinator-insufficient-disk-space-test" )
2020+
2021+ mockUpgradeManager := & mockUpgradeManager {
2022+ upgradeErr : fmt .Errorf ("wrapped: %w" , upgradeErrors .ErrInsufficientDiskSpace ),
2023+ }
2024+
2025+ initialState := State {
2026+ CoordinatorState : agentclient .Healthy ,
2027+ CoordinatorMessage : "Running" ,
2028+ }
2029+
2030+ coord := & Coordinator {
2031+ state : initialState ,
2032+ logger : log ,
2033+ upgradeMgr : mockUpgradeManager ,
2034+ stateBroadcaster : broadcaster .New (initialState , 64 , 32 ),
2035+ overrideStateChan : make (chan * coordinatorOverrideState ),
2036+ upgradeDetailsChan : make (chan * details.Details ),
2037+ }
2038+
2039+ wg := sync.WaitGroup {}
2040+ wg .Add (2 )
2041+
2042+ overrideStates := []agentclient.State {}
2043+ go func () {
2044+ state1 := <- coord .overrideStateChan
2045+ overrideStates = append (overrideStates , state1 .state )
2046+
2047+ state2 := <- coord .overrideStateChan
2048+ if state2 != nil {
2049+ overrideStates = append (overrideStates , state2 .state )
2050+ }
2051+
2052+ wg .Done ()
2053+ }()
2054+
2055+ upgradeDetails := []* details.Details {}
2056+ go func () {
2057+ upgradeDetails = append (upgradeDetails , <- coord .upgradeDetailsChan )
2058+ upgradeDetails = append (upgradeDetails , <- coord .upgradeDetailsChan )
2059+ wg .Done ()
2060+ }()
2061+
2062+ err := coord .Upgrade (t .Context (), "" , "" , nil , false , false )
2063+ require .Error (t , err )
2064+ require .Equal (t , err , upgradeErrors .ErrInsufficientDiskSpace )
2065+
2066+ wg .Wait ()
2067+
2068+ require .Equal (t , []agentclient.State {agentclient .Upgrading }, overrideStates )
2069+
2070+ require .Equal (t , []* details.Details {
2071+ {
2072+ TargetVersion : "" ,
2073+ State : details .StateRequested ,
2074+ ActionID : "" ,
2075+ },
2076+ {
2077+ TargetVersion : "" ,
2078+ State : details .StateFailed ,
2079+ Metadata : details.Metadata {
2080+ FailedState : details .StateRequested ,
2081+ ErrorMsg : upgradeErrors .ErrInsufficientDiskSpace .Error (),
2082+ },
2083+ },
2084+ }, upgradeDetails )
2085+ }
0 commit comments