@@ -20,20 +20,24 @@ import (
20
20
// Even though we do attempt to sanitize data, it may still contain
21
21
// sensitive information and should thus be treated as secret.
22
22
type Bundle struct {
23
- BuildInfo * codersdk.BuildInfoResponse `json:"build_info"`
24
- DeploymentConfig * codersdk.DeploymentConfig `json:"deployment_config"`
25
- Experiments codersdk.Experiments `json:"experiments"`
26
- HealthReport * codersdk.HealthcheckReport `json:"health_report"`
27
- Workspace * codersdk.Workspace `json:"workspace"`
28
- WorkspaceBuildLogs []codersdk.ProvisionerJobLog `json:"workspace_build_logs"`
29
- Agent * Agent `json:"agent"`
30
- AgentLogs []string `json:"agent_logs"`
23
+ DeploymentInfo DeploymentInfo `json:"deployment_info"`
24
+ WorkspaceInfo * WorkspaceInfo `json:"workspace_info"`
25
+ Logs []string `json:"logs"`
31
26
}
32
27
33
- // AgentInfo is a set of information derived from a given workspace agent.
34
- type Agent struct {
35
- ConnectionInfo codersdk.WorkspaceAgentConnectionInfo
36
- Logs []codersdk.WorkspaceAgentLog
28
+ type DeploymentInfo struct {
29
+ BuildInfo * codersdk.BuildInfoResponse `json:"build_info"`
30
+ Config * codersdk.DeploymentConfig `json:"deployment_config"`
31
+ Experiments codersdk.Experiments `json:"experiments"`
32
+ HealthReport * codersdk.HealthcheckReport `json:"health_report"`
33
+ }
34
+
35
+ type WorkspaceInfo struct {
36
+ Workspace codersdk.Workspace `json:"workspace"`
37
+ BuildLogs []codersdk.ProvisionerJobLog `json:"build_logs"`
38
+ Agent codersdk.WorkspaceAgent `json:"agent"`
39
+ AgentConnectionInfo codersdk.WorkspaceAgentConnectionInfo
40
+ AgentStartupLogs []codersdk.WorkspaceAgentLog `json:"startup_logs"`
37
41
}
38
42
39
43
// String implements fmt.Stringer for Bundle.
@@ -77,12 +81,6 @@ func Run(ctx context.Context, d *Deps) (*Bundle, error) {
77
81
return nil , xerrors .Errorf ("developer error: no information source provided!" )
78
82
}
79
83
80
- var logw strings.Builder
81
- d .Log .AppendSinks (sloghuman .Sink (& logw ))
82
- defer func () {
83
- b .AgentLogs = strings .Split (logw .String (), "\n " )
84
- }()
85
-
86
84
authChecks := map [string ]codersdk.AuthorizationCheck {
87
85
"Read DeploymentValues" : {
88
86
Object : codersdk.AuthorizationObject {
@@ -102,32 +100,39 @@ func Run(ctx context.Context, d *Deps) (*Bundle, error) {
102
100
}
103
101
}
104
102
103
+ // Ensure we capture logs from the client.
104
+ var logw strings.Builder
105
+ d .Log .AppendSinks (sloghuman .Sink (& logw ))
106
+ defer func () {
107
+ b .Logs = strings .Split (logw .String (), "\n " )
108
+ }()
109
+
105
110
bi , err := d .Source .BuildInfo (ctx )
106
111
if err != nil {
107
112
d .Log .Error (ctx , "fetch build info" , slog .Error (err ))
108
113
} else {
109
- b .BuildInfo = & bi
114
+ b .DeploymentInfo . BuildInfo = & bi
110
115
}
111
116
112
117
dc , err := d .Source .DeploymentConfig (ctx )
113
118
if err != nil {
114
119
d .Log .Error (ctx , "fetch deployment config" , slog .Error (err ))
115
120
} else {
116
- b .DeploymentConfig = dc
121
+ b .DeploymentInfo . Config = dc
117
122
}
118
123
119
124
hr , err := d .Source .GetDebugHealth (ctx )
120
125
if err != nil {
121
126
d .Log .Error (ctx , "fetch health report" , slog .Error (err ))
122
127
} else {
123
- b .HealthReport = & hr
128
+ b .DeploymentInfo . HealthReport = & hr
124
129
}
125
130
126
131
exp , err := d .Source .Experiments (ctx )
127
132
if err != nil {
128
133
d .Log .Error (ctx , "fetch experiments" , slog .Error (err ))
129
134
} else {
130
- b .Experiments = exp
135
+ b .DeploymentInfo . Experiments = exp
131
136
}
132
137
133
138
// Below checks require a workspace and agent
@@ -136,11 +141,13 @@ func Run(ctx context.Context, d *Deps) (*Bundle, error) {
136
141
return & b , nil
137
142
}
138
143
144
+ b .WorkspaceInfo = & WorkspaceInfo {}
145
+
139
146
ws , err := d .Source .Workspace (ctx , d .WorkspaceID )
140
147
if err != nil {
141
148
d .Log .Error (ctx , "fetch workspace" , slog .Error (err ), slog .F ("workspace_id" , d .WorkspaceID .String ()))
142
149
} else {
143
- b .Workspace = & ws
150
+ b .WorkspaceInfo . Workspace = ws
144
151
}
145
152
146
153
buildLogCh , closer , err := d .Source .WorkspaceBuildLogsAfter (ctx , ws .LatestBuild .ID , 0 )
@@ -149,7 +156,7 @@ func Run(ctx context.Context, d *Deps) (*Bundle, error) {
149
156
} else {
150
157
defer closer .Close ()
151
158
for log := range buildLogCh {
152
- b .WorkspaceBuildLogs = append (b .WorkspaceBuildLogs , log )
159
+ b .WorkspaceInfo . BuildLogs = append (b .WorkspaceInfo . BuildLogs , log )
153
160
}
154
161
}
155
162
@@ -169,12 +176,11 @@ func Run(ctx context.Context, d *Deps) (*Bundle, error) {
169
176
}
170
177
}
171
178
172
- b .Agent = & Agent {}
173
179
connInfo , err := d .Source .WorkspaceAgentConnectionInfo (ctx , agentID )
174
180
if err != nil {
175
181
d .Log .Error (ctx , "fetch agent conn info" , slog .Error (err ), slog .F ("agent_id" , agentID .String ()))
176
182
} else {
177
- b .Agent . ConnectionInfo = connInfo
183
+ b .WorkspaceInfo . AgentConnectionInfo = connInfo
178
184
}
179
185
180
186
agentLogCh , closer , err := d .Source .WorkspaceAgentLogsAfter (ctx , agentID , 0 , false )
@@ -183,7 +189,7 @@ func Run(ctx context.Context, d *Deps) (*Bundle, error) {
183
189
} else {
184
190
defer closer .Close ()
185
191
for logChunk := range agentLogCh {
186
- b .Agent . Logs = append (b .Agent . Logs , logChunk ... )
192
+ b .WorkspaceInfo . AgentStartupLogs = append (b .WorkspaceInfo . AgentStartupLogs , logChunk ... )
187
193
}
188
194
}
189
195
0 commit comments