Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit82e6070

Browse files
fix(cli): ensure that the support bundle command does not panic on zero values (#14392)
We try to write a cute little summary at the end of the bundle, but that could panic if some of the fields of the bundle were nil. Adds a test that essentially ensures nil values in a bundle, and ensures that it can be handled without losing our towels.Co-authored-by: Danny Kopping <danny@coder.com>
1 parent3514ca3 commit82e6070

File tree

2 files changed

+86
-9
lines changed

2 files changed

+86
-9
lines changed

‎cli/support.go

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -184,16 +184,8 @@ func (r *RootCmd) supportBundle() *serpent.Command {
184184
_=os.Remove(outputPath)// best effort
185185
returnxerrors.Errorf("create support bundle: %w",err)
186186
}
187-
docsURL:=bun.Deployment.Config.Values.DocsURL.String()
188-
deployHealthSummary:=bun.Deployment.HealthReport.Summarize(docsURL)
189-
iflen(deployHealthSummary)>0 {
190-
cliui.Warn(inv.Stdout,"Deployment health issues detected:",deployHealthSummary...)
191-
}
192-
clientNetcheckSummary:=bun.Network.Netcheck.Summarize("Client netcheck:",docsURL)
193-
iflen(clientNetcheckSummary)>0 {
194-
cliui.Warn(inv.Stdout,"Networking issues detected:",deployHealthSummary...)
195-
}
196187

188+
summarizeBundle(inv,bun)
197189
bun.CLILogs=cliLogBuf.Bytes()
198190

199191
iferr:=writeBundle(bun,zwr);err!=nil {
@@ -225,6 +217,40 @@ func (r *RootCmd) supportBundle() *serpent.Command {
225217
returncmd
226218
}
227219

220+
// summarizeBundle makes a best-effort attempt to write a short summary
221+
// of the support bundle to the user's terminal.
222+
funcsummarizeBundle(inv*serpent.Invocation,bun*support.Bundle) {
223+
ifbun==nil {
224+
cliui.Error(inv.Stdout,"No support bundle generated!")
225+
return
226+
}
227+
228+
ifbun.Deployment.Config==nil {
229+
cliui.Error(inv.Stdout,"No deployment configuration available!")
230+
return
231+
}
232+
233+
docsURL:=bun.Deployment.Config.Values.DocsURL.String()
234+
ifbun.Deployment.HealthReport==nil {
235+
cliui.Error(inv.Stdout,"No deployment health report available!")
236+
return
237+
}
238+
deployHealthSummary:=bun.Deployment.HealthReport.Summarize(docsURL)
239+
iflen(deployHealthSummary)>0 {
240+
cliui.Warn(inv.Stdout,"Deployment health issues detected:",deployHealthSummary...)
241+
}
242+
243+
ifbun.Network.Netcheck==nil {
244+
cliui.Error(inv.Stdout,"No network troubleshooting information available!")
245+
return
246+
}
247+
248+
clientNetcheckSummary:=bun.Network.Netcheck.Summarize("Client netcheck:",docsURL)
249+
iflen(clientNetcheckSummary)>0 {
250+
cliui.Warn(inv.Stdout,"Networking issues detected:",deployHealthSummary...)
251+
}
252+
}
253+
228254
funcfindAgent(agentNamestring,haystack []codersdk.WorkspaceResource) (*codersdk.WorkspaceAgent,bool) {
229255
for_,res:=rangehaystack {
230256
for_,agt:=rangeres.Agents {

‎cli/support_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ import (
55
"bytes"
66
"encoding/json"
77
"io"
8+
"net/http"
9+
"net/http/httptest"
10+
"net/url"
811
"os"
912
"path/filepath"
1013
"runtime"
@@ -14,6 +17,7 @@ import (
1417
"tailscale.com/ipn/ipnstate"
1518

1619
"github.com/google/uuid"
20+
"github.com/stretchr/testify/assert"
1721
"github.com/stretchr/testify/require"
1822

1923
"github.com/coder/coder/v2/agent"
@@ -156,6 +160,53 @@ func TestSupportBundle(t *testing.T) {
156160
err:=inv.Run()
157161
require.ErrorContains(t,err,"failed authorization check")
158162
})
163+
164+
// This ensures that the CLI does not panic when trying to generate a support bundle
165+
// against a fake server that returns an empty response for all requests. This essentially
166+
// ensures that (almost) all of the support bundle generating code paths get a zero value.
167+
t.Run("DontPanic",func(t*testing.T) {
168+
t.Parallel()
169+
170+
for_,code:=range []int{
171+
http.StatusOK,
172+
http.StatusUnauthorized,
173+
http.StatusForbidden,
174+
http.StatusNotFound,
175+
http.StatusInternalServerError,
176+
} {
177+
t.Run(http.StatusText(code),func(t*testing.T) {
178+
t.Parallel()
179+
// Start up a fake server
180+
srv:=httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter,r*http.Request) {
181+
t.Logf("received request: %s %s",r.Method,r.URL)
182+
switchr.URL.Path {
183+
case"/api/v2/authcheck":
184+
// Fake auth check
185+
resp:= codersdk.AuthorizationResponse{
186+
"Read DeploymentValues":true,
187+
}
188+
w.WriteHeader(http.StatusOK)
189+
assert.NoError(t,json.NewEncoder(w).Encode(resp))
190+
default:
191+
// Simply return a blank response for everything else.
192+
w.WriteHeader(code)
193+
}
194+
}))
195+
defersrv.Close()
196+
u,err:=url.Parse(srv.URL)
197+
require.NoError(t,err)
198+
client:=codersdk.New(u)
199+
200+
d:=t.TempDir()
201+
path:=filepath.Join(d,"bundle.zip")
202+
203+
inv,root:=clitest.New(t,"support","bundle","--url-override",srv.URL,"--output-file",path,"--yes")
204+
clitest.SetupConfig(t,client,root)
205+
err=inv.Run()
206+
require.NoError(t,err)
207+
})
208+
}
209+
})
159210
}
160211

161212
// nolint:revive // It's a control flag, but this is just a test.

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp