@@ -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"
@@ -1959,3 +1964,100 @@ func TestHasEndpoint(t *testing.T) {
19591964 })
19601965 }
19611966}
1967+
1968+ type mockUpgradeManager struct {
1969+ upgradeErr error
1970+ }
1971+
1972+ func (m * mockUpgradeManager ) Upgradeable () bool {
1973+ return true
1974+ }
1975+
1976+ func (m * mockUpgradeManager ) Reload (cfg * config.Config ) error {
1977+ return nil
1978+ }
1979+
1980+ 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 ) {
1981+ return nil , m .upgradeErr
1982+ }
1983+
1984+ func (m * mockUpgradeManager ) Ack (ctx context.Context , acker acker.Acker ) error {
1985+ return nil
1986+ }
1987+
1988+ func (m * mockUpgradeManager ) AckAction (ctx context.Context , acker acker.Acker , action fleetapi.Action ) error {
1989+ return nil
1990+ }
1991+
1992+ func (m * mockUpgradeManager ) MarkerWatcher () upgrade.MarkerWatcher {
1993+ return nil
1994+ }
1995+
1996+ func TestCoordinator_Upgrade_InsufficientDiskSpaceError (t * testing.T ) {
1997+ log , _ := loggertest .New ("coordinator-insufficient-disk-space-test" )
1998+
1999+ mockUpgradeManager := & mockUpgradeManager {
2000+ upgradeErr : fmt .Errorf ("wrapped: %w" , upgradeErrors .ErrInsufficientDiskSpace ),
2001+ }
2002+
2003+ initialState := State {
2004+ CoordinatorState : agentclient .Healthy ,
2005+ CoordinatorMessage : "Running" ,
2006+ }
2007+
2008+ coord := & Coordinator {
2009+ state : initialState ,
2010+ logger : log ,
2011+ upgradeMgr : mockUpgradeManager ,
2012+ stateBroadcaster : broadcaster .New (initialState , 64 , 32 ),
2013+ overrideStateChan : make (chan * coordinatorOverrideState ),
2014+ upgradeDetailsChan : make (chan * details.Details ),
2015+ }
2016+
2017+ wg := sync.WaitGroup {}
2018+ wg .Add (2 )
2019+
2020+ overrideStates := []agentclient.State {}
2021+ go func () {
2022+ state1 := <- coord .overrideStateChan
2023+ overrideStates = append (overrideStates , state1 .state )
2024+
2025+ state2 := <- coord .overrideStateChan
2026+ if state2 != nil {
2027+ overrideStates = append (overrideStates , state2 .state )
2028+ }
2029+
2030+ wg .Done ()
2031+ }()
2032+
2033+ upgradeDetails := []* details.Details {}
2034+ go func () {
2035+ upgradeDetails = append (upgradeDetails , <- coord .upgradeDetailsChan )
2036+ upgradeDetails = append (upgradeDetails , <- coord .upgradeDetailsChan )
2037+ wg .Done ()
2038+ }()
2039+
2040+ err := coord .Upgrade (t .Context (), "" , "" , nil , false , false )
2041+ require .Error (t , err )
2042+ require .Equal (t , err , upgradeErrors .ErrInsufficientDiskSpace )
2043+
2044+ wg .Wait ()
2045+
2046+ require .Equal (t , []agentclient.State {agentclient .Upgrading }, overrideStates )
2047+
2048+ require .Equal (t , []* details.Details {
2049+ {
2050+ TargetVersion : "" ,
2051+ State : details .StateRequested ,
2052+ ActionID : "" ,
2053+ },
2054+ {
2055+ TargetVersion : "" ,
2056+ State : details .StateFailed ,
2057+ Metadata : details.Metadata {
2058+ FailedState : details .StateRequested ,
2059+ ErrorMsg : upgradeErrors .ErrInsufficientDiskSpace .Error (),
2060+ },
2061+ },
2062+ }, upgradeDetails )
2063+ }
0 commit comments