88 "github.com/docker/buildx/driver"
99 "github.com/docker/buildx/store"
1010 "github.com/docker/buildx/util/confutil"
11+ "github.com/moby/buildkit/identity"
1112 "github.com/moby/buildkit/util/testutil/integration"
1213 "github.com/pkg/errors"
1314 "github.com/stretchr/testify/require"
@@ -25,6 +26,8 @@ var rmTests = []func(t *testing.T, sb integration.Sandbox){
2526 testRmMulti ,
2627 testRmInvalidBuildkitdConfig ,
2728 testRmAllInactiveInvalidBuildkitdConfig ,
29+ testRmUnreachableEndpoint ,
30+ testRmUnreachableRemoteEndpoint ,
2831}
2932
3033func testRm (t * testing.T , sb integration.Sandbox ) {
@@ -34,6 +37,7 @@ func testRm(t *testing.T, sb integration.Sandbox) {
3437
3538 out , err := rmCmd (sb , withArgs ("default" ))
3639 require .Error (t , err , out ) // can't remove a docker builder
40+ require .Contains (t , out , "context builder cannot be removed" )
3741
3842 out , err = createCmd (sb , withArgs ("--driver" , "docker-container" ))
3943 require .NoError (t , err , out )
@@ -155,6 +159,65 @@ func testRmAllInactiveInvalidBuildkitdConfig(t *testing.T, sb integration.Sandbo
155159 builderName = ""
156160}
157161
162+ func testRmUnreachableEndpoint (t * testing.T , sb integration.Sandbox ) {
163+ if ! isDockerContainerWorker (sb ) {
164+ t .Skip ("only testing with docker-container worker" )
165+ }
166+
167+ out , err := createCmd (sb , withArgs ("--driver" , "docker-container" ))
168+ require .NoError (t , err , out )
169+ builderName := strings .TrimSpace (out )
170+
171+ out , err = inspectCmd (sb , withArgs (builderName , "--bootstrap" ))
172+ require .NoError (t , err , out )
173+
174+ t .Cleanup (func () {
175+ if builderName == "" {
176+ return
177+ }
178+ _ , _ = rmCmd (sb , withArgs ("--keep-daemon" , builderName ))
179+ })
180+
181+ var goodContainer string
182+ updateStoredBuilder (t , sb , builderName , func (ng * store.NodeGroup ) {
183+ require .NotEmpty (t , ng .Nodes )
184+ goodContainer = driver .BuilderName (ng .Nodes [0 ].Name )
185+ badNode := ng .Nodes [0 ]
186+ badNode .Name += "-unreachable"
187+ badNode .Endpoint = "tcp://127.0.0.1:1"
188+ ng .Nodes = append ([]store.Node {badNode }, ng .Nodes ... )
189+ })
190+
191+ out , err = rmCmd (sb , withArgs ("--timeout=2s" , builderName ))
192+ require .Error (t , err , out )
193+ require .Contains (t , out , "failed to remove " + builderName )
194+ requireNoStoredBuilder (t , sb , builderName )
195+ requireNoContainer (t , sb , goodContainer )
196+ builderName = ""
197+ }
198+
199+ func testRmUnreachableRemoteEndpoint (t * testing.T , sb integration.Sandbox ) {
200+ if ! isRemoteWorker (sb ) || isRemoteMultiNodeWorker (sb ) {
201+ t .Skip ("only testing with remote worker" )
202+ }
203+
204+ builderName := "remote-" + identity .NewID ()
205+ out , err := createCmd (sb , withArgs ("--driver" , "remote" , "--name" , builderName , "--timeout=2s" , "tcp://127.0.0.1:1" ))
206+ require .NoError (t , err , out )
207+
208+ t .Cleanup (func () {
209+ if builderName != "" {
210+ _ , _ = rmCmd (sb , withArgs ("--timeout=2s" , builderName ))
211+ }
212+ })
213+
214+ out , err = rmCmd (sb , withArgs ("--timeout=2s" , builderName ))
215+ require .NoError (t , err , out )
216+ require .Contains (t , out , builderName + " removed" )
217+ requireNoStoredBuilder (t , sb , builderName )
218+ builderName = ""
219+ }
220+
158221func updateStoredBuilder (t * testing.T , sb integration.Sandbox , name string , fn func (* store.NodeGroup )) {
159222 t .Helper ()
160223
0 commit comments