Skip to content

Commit 4e0a070

Browse files
authored
feat: provide backwards compatibility with the buildlog (#82)
1 parent decc6a1 commit 4e0a070

File tree

4 files changed

+123
-60
lines changed

4 files changed

+123
-60
lines changed

buildlog/coder.go

+74-9
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"time"
99

1010
"github.com/google/uuid"
11+
"golang.org/x/mod/semver"
1112
"golang.org/x/xerrors"
1213
"storj.io/drpc"
1314

@@ -35,7 +36,36 @@ type CoderClient interface {
3536
io.Closer
3637
}
3738

38-
type coderClient struct {
39+
type agentClientV1 struct {
40+
ctx context.Context
41+
client *agentsdk.Client
42+
}
43+
44+
func (c *agentClientV1) Send(level codersdk.LogLevel, log string) error {
45+
lines := cutString(log, MaxCoderLogSize)
46+
47+
logs := make([]agentsdk.Log, 0, CoderLoggerMaxLogs)
48+
for _, output := range lines {
49+
logs = append(logs, agentsdk.Log{
50+
CreatedAt: time.Now(),
51+
Output: output,
52+
Level: level,
53+
})
54+
}
55+
err := c.client.PatchLogs(c.ctx, agentsdk.PatchLogs{
56+
Logs: logs,
57+
})
58+
if err != nil {
59+
return xerrors.Errorf("send build log: %w", err)
60+
}
61+
return nil
62+
}
63+
64+
func (*agentClientV1) Close() error {
65+
return nil
66+
}
67+
68+
type agentClientV2 struct {
3969
ctx context.Context
4070
cancel context.CancelFunc
4171
source uuid.UUID
@@ -44,7 +74,7 @@ type coderClient struct {
4474
log slog.Logger
4575
}
4676

47-
func (c *coderClient) Send(level codersdk.LogLevel, log string) error {
77+
func (c *agentClientV2) Send(level codersdk.LogLevel, log string) error {
4878
err := c.sl.Send(c.ctx, agentsdk.Log{
4979
CreatedAt: time.Now(),
5080
Output: log,
@@ -56,7 +86,7 @@ func (c *coderClient) Send(level codersdk.LogLevel, log string) error {
5686
return nil
5787
}
5888

59-
func (c *coderClient) Close() error {
89+
func (c *agentClientV2) Close() error {
6090
defer c.cancel()
6191
c.ls.Flush(c.source)
6292
err := c.ls.WaitUntilEmpty(c.ctx)
@@ -66,10 +96,7 @@ func (c *coderClient) Close() error {
6696
return nil
6797
}
6898

69-
func OpenCoderClient(ctx context.Context, accessURL *url.URL, logger slog.Logger, token string) (CoderClient, error) {
70-
client := agentsdk.New(accessURL)
71-
client.SetSessionToken(token)
72-
99+
func newAgentClientV2(ctx context.Context, logger slog.Logger, client *agentsdk.Client) (CoderClient, error) {
73100
cctx, cancel := context.WithCancel(ctx)
74101
uid := uuid.New()
75102
ls := agentsdk.NewLogSender(logger)
@@ -98,7 +125,7 @@ func OpenCoderClient(ctx context.Context, accessURL *url.URL, logger slog.Logger
98125
}
99126
}()
100127

101-
return &coderClient{
128+
return &agentClientV2{
102129
ctx: cctx,
103130
cancel: cancel,
104131
source: uid,
@@ -108,14 +135,34 @@ func OpenCoderClient(ctx context.Context, accessURL *url.URL, logger slog.Logger
108135
}, nil
109136
}
110137

138+
func OpenCoderClient(ctx context.Context, accessURL *url.URL, logger slog.Logger, token string) (CoderClient, error) {
139+
client := agentsdk.New(accessURL)
140+
client.SetSessionToken(token)
141+
142+
resp, err := client.SDK.BuildInfo(ctx)
143+
if err != nil {
144+
return nil, xerrors.Errorf("build info: %w", err)
145+
}
146+
147+
if semver.Compare(semver.MajorMinor(resp.Version), "v2.13") < 0 {
148+
return &agentClientV1{
149+
ctx: ctx,
150+
client: client,
151+
}, nil
152+
}
153+
154+
return newAgentClientV2(ctx, logger, client)
155+
}
156+
111157
type CoderLogger struct {
112158
ctx context.Context
113159
client CoderClient
114160
logger slog.Logger
115161
}
116162

117-
func OpenCoderLogger(client CoderClient, log slog.Logger) Logger {
163+
func OpenCoderLogger(ctx context.Context, client CoderClient, log slog.Logger) Logger {
118164
coder := &CoderLogger{
165+
ctx: ctx,
119166
client: client,
120167
logger: log,
121168
}
@@ -156,3 +203,21 @@ func (c *CoderLogger) Write(p []byte) (int, error) {
156203
func (c *CoderLogger) Close() error {
157204
return c.client.Close()
158205
}
206+
207+
// cutString cuts a string up into smaller strings that have a len no greater
208+
// than the provided max size.
209+
// If the string is less than the max size the return slice has one
210+
// element with a value of the provided string.
211+
func cutString(s string, maxSize int) []string {
212+
if len(s) <= maxSize {
213+
return []string{s}
214+
}
215+
216+
toks := []string{}
217+
for len(s) > maxSize {
218+
toks = append(toks, s[:maxSize])
219+
s = s[maxSize:]
220+
}
221+
222+
return append(toks, s)
223+
}

cli/docker.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ func dockerCmd() *cobra.Command {
175175
}
176176

177177
blog = buildlog.MultiLogger(
178-
buildlog.OpenCoderLogger(agent, log),
178+
buildlog.OpenCoderLogger(ctx, agent, log),
179179
blog,
180180
)
181181
}

go.mod

+16-18
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
module github.com/coder/envbox
22

3-
go 1.22.3
4-
5-
toolchain go1.22.4
3+
go 1.22.4
64

75
// There are a few minor changes we make to Tailscale that we're slowly upstreaming. Compare here:
86
// https://github.com/tailscale/tailscale/compare/main...coder:tailscale:main
97
replace tailscale.com => github.com/coder/tailscale v1.1.1-0.20240530071520-1ac63d3a4ee3
108

119
require (
1210
cdr.dev/slog v1.6.2-0.20240126064726-20367d4aede6
13-
github.com/coder/coder/v2 v2.12.3
11+
github.com/coder/coder/v2 v2.12.0
1412
github.com/coder/retry v1.5.1
1513
github.com/cpuguy83/dockercfg v0.3.1
1614
github.com/docker/docker v24.0.9+incompatible
@@ -25,7 +23,8 @@ require (
2523
github.com/stretchr/testify v1.9.0
2624
github.com/vishvananda/netlink v1.2.1-beta.2
2725
golang.org/x/exp v0.0.0-20240222234643-814bf88cf225
28-
golang.org/x/sys v0.20.0
26+
golang.org/x/mod v0.18.0
27+
golang.org/x/sys v0.21.0
2928
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028
3029
k8s.io/mount-utils v0.26.2
3130
k8s.io/utils v0.0.0-20230406110748-d93618cff8a2
@@ -50,7 +49,7 @@ require (
5049
github.com/akutz/memconn v0.1.0 // indirect
5150
github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74 // indirect
5251
github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect
53-
github.com/aws/aws-sdk-go-v2 v1.27.0 // indirect
52+
github.com/aws/aws-sdk-go-v2 v1.30.0 // indirect
5453
github.com/aws/aws-sdk-go-v2/config v1.27.7 // indirect
5554
github.com/aws/aws-sdk-go-v2/credentials v1.17.7 // indirect
5655
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.3 // indirect
@@ -73,7 +72,7 @@ require (
7372
github.com/charmbracelet/lipgloss v0.8.0 // indirect
7473
github.com/coder/pretty v0.0.0-20230908205945-e89ba86370e0 // indirect
7574
github.com/coder/serpent v0.7.0 // indirect
76-
github.com/coder/terraform-provider-coder v0.22.0 // indirect
75+
github.com/coder/terraform-provider-coder v0.23.0 // indirect
7776
github.com/containerd/continuity v0.4.2 // indirect
7877
github.com/coreos/go-iptables v0.6.0 // indirect
7978
github.com/coreos/go-oidc/v3 v3.10.0 // indirect
@@ -109,7 +108,7 @@ require (
109108
github.com/hashicorp/go-multierror v1.1.1 // indirect
110109
github.com/hashicorp/go-uuid v1.0.3 // indirect
111110
github.com/hashicorp/go-version v1.7.0 // indirect
112-
github.com/hashicorp/hcl/v2 v2.20.0 // indirect
111+
github.com/hashicorp/hcl/v2 v2.21.0 // indirect
113112
github.com/hashicorp/logutils v1.0.0 // indirect
114113
github.com/hashicorp/terraform-plugin-go v0.12.0 // indirect
115114
github.com/hashicorp/terraform-plugin-log v0.7.0 // indirect
@@ -123,7 +122,7 @@ require (
123122
github.com/jmespath/go-jmespath v0.4.0 // indirect
124123
github.com/josharian/native v1.1.1-0.20230202152459-5c7d0dd6ab86 // indirect
125124
github.com/jsimonetti/rtnetlink v1.3.5 // indirect
126-
github.com/klauspost/compress v1.17.7 // indirect
125+
github.com/klauspost/compress v1.17.9 // indirect
127126
github.com/kortschak/wol v0.0.0-20200729010619-da482cc4850a // indirect
128127
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
129128
github.com/mattn/go-colorable v0.1.13 // indirect
@@ -171,7 +170,7 @@ require (
171170
github.com/tcnksm/go-httpstat v0.2.0 // indirect
172171
github.com/tinylib/msgp v1.1.8 // indirect
173172
github.com/u-root/uio v0.0.0-20240209044354-b3d14b93376a // indirect
174-
github.com/valyala/fasthttp v1.54.0 // indirect
173+
github.com/valyala/fasthttp v1.55.0 // indirect
175174
github.com/vishvananda/netns v0.0.4 // indirect
176175
github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect
177176
github.com/vmihailenco/msgpack/v4 v4.3.12 // indirect
@@ -193,20 +192,19 @@ require (
193192
go.uber.org/atomic v1.11.0 // indirect
194193
go4.org/mem v0.0.0-20220726221520-4f986261bf13 // indirect
195194
go4.org/netipx v0.0.0-20230728180743-ad4cb58a6516 // indirect
196-
golang.org/x/crypto v0.23.0 // indirect
197-
golang.org/x/mod v0.17.0 // indirect
198-
golang.org/x/net v0.25.0 // indirect
195+
golang.org/x/crypto v0.24.0 // indirect
196+
golang.org/x/net v0.26.0 // indirect
199197
golang.org/x/oauth2 v0.20.0 // indirect
200198
golang.org/x/sync v0.7.0 // indirect
201-
golang.org/x/term v0.20.0 // indirect
202-
golang.org/x/text v0.15.0 // indirect
199+
golang.org/x/term v0.21.0 // indirect
200+
golang.org/x/text v0.16.0 // indirect
203201
golang.org/x/time v0.5.0 // indirect
204-
golang.org/x/tools v0.21.0 // indirect
202+
golang.org/x/tools v0.22.0 // indirect
205203
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect
206204
golang.zx2c4.com/wireguard/windows v0.5.3 // indirect
207205
google.golang.org/appengine v1.6.8 // indirect
208-
google.golang.org/genproto/googleapis/api v0.0.0-20240506185236-b8a5c65736ae // indirect
209-
google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8 // indirect
206+
google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8 // indirect
207+
google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e // indirect
210208
google.golang.org/grpc v1.64.0 // indirect
211209
google.golang.org/protobuf v1.34.1 // indirect
212210
gopkg.in/DataDog/dd-trace-go.v1 v1.64.0 // indirect

0 commit comments

Comments
 (0)