Skip to content

Commit 85290fa

Browse files
authored
chore: remove codersdk dependency (#194)
Part of #178 In order to update our branch of Kaniko, we need to first update to go1.22. This is not currently possible while depending on codersdk. - Manually vendored relevant parts of codersdk and agentsdk into internal/notcodersdk - Replaced existing usage of codersdk / agentsdk with internal/notcodersdk - Added test for coder log sending functionality
1 parent e6844c2 commit 85290fa

File tree

13 files changed

+786
-725
lines changed

13 files changed

+786
-725
lines changed

cmd/envbuilder/main.go

+20-16
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,8 @@ import (
1313
"time"
1414

1515
"cdr.dev/slog"
16-
"github.com/coder/coder/v2/codersdk"
17-
"github.com/coder/coder/v2/codersdk/agentsdk"
1816
"github.com/coder/envbuilder"
17+
"github.com/coder/envbuilder/internal/notcodersdk"
1918
"github.com/coder/serpent"
2019

2120
// *Never* remove this. Certificates are not bundled as part
@@ -25,12 +24,21 @@ import (
2524
)
2625

2726
func main() {
27+
cmd := envbuilderCmd()
28+
err := cmd.Invoke().WithOS().Run()
29+
if err != nil {
30+
fmt.Fprintf(os.Stderr, "error: %v", err)
31+
os.Exit(1)
32+
}
33+
}
34+
35+
func envbuilderCmd() serpent.Command {
2836
var options envbuilder.Options
2937
cmd := serpent.Command{
3038
Use: "envbuilder",
3139
Options: options.CLI(),
3240
Handler: func(inv *serpent.Invocation) error {
33-
var sendLogs func(ctx context.Context, log ...agentsdk.Log) error
41+
var sendLogs func(ctx context.Context, log ...notcodersdk.Log) error
3442
if options.CoderAgentToken != "" {
3543
if options.CoderAgentURL == "" {
3644
return errors.New("CODER_AGENT_URL must be set if CODER_AGENT_TOKEN is set")
@@ -39,34 +47,34 @@ func main() {
3947
if err != nil {
4048
return fmt.Errorf("unable to parse CODER_AGENT_URL as URL: %w", err)
4149
}
42-
client := agentsdk.New(u)
50+
client := notcodersdk.New(u)
4351
client.SetSessionToken(options.CoderAgentToken)
44-
client.SDK.HTTPClient = &http.Client{
52+
client.HTTPClient = &http.Client{
4553
Transport: &http.Transport{
4654
TLSClientConfig: &tls.Config{
4755
InsecureSkipVerify: options.Insecure,
4856
},
4957
},
5058
}
5159
var flushAndClose func(ctx context.Context) error
52-
sendLogs, flushAndClose = agentsdk.LogsSender(agentsdk.ExternalLogSourceID, client.PatchLogs, slog.Logger{})
60+
sendLogs, flushAndClose = notcodersdk.LogsSender(notcodersdk.ExternalLogSourceID, client.PatchLogs, slog.Logger{})
5361
defer flushAndClose(inv.Context())
5462

5563
// This adds the envbuilder subsystem.
5664
// If telemetry is enabled in a Coder deployment,
5765
// this will be reported and help us understand
5866
// envbuilder usage.
59-
if !slices.Contains(options.CoderAgentSubsystem, string(codersdk.AgentSubsystemEnvbuilder)) {
60-
options.CoderAgentSubsystem = append(options.CoderAgentSubsystem, string(codersdk.AgentSubsystemEnvbuilder))
67+
if !slices.Contains(options.CoderAgentSubsystem, string(notcodersdk.AgentSubsystemEnvbuilder)) {
68+
options.CoderAgentSubsystem = append(options.CoderAgentSubsystem, string(notcodersdk.AgentSubsystemEnvbuilder))
6169
os.Setenv("CODER_AGENT_SUBSYSTEM", strings.Join(options.CoderAgentSubsystem, ","))
6270
}
6371
}
6472

65-
options.Logger = func(level codersdk.LogLevel, format string, args ...interface{}) {
73+
options.Logger = func(level notcodersdk.LogLevel, format string, args ...interface{}) {
6674
output := fmt.Sprintf(format, args...)
6775
fmt.Fprintln(inv.Stderr, output)
6876
if sendLogs != nil {
69-
sendLogs(inv.Context(), agentsdk.Log{
77+
sendLogs(inv.Context(), notcodersdk.Log{
7078
CreatedAt: time.Now(),
7179
Output: output,
7280
Level: level,
@@ -76,14 +84,10 @@ func main() {
7684

7785
err := envbuilder.Run(inv.Context(), options)
7886
if err != nil {
79-
options.Logger(codersdk.LogLevelError, "error: %s", err)
87+
options.Logger(notcodersdk.LogLevelError, "error: %s", err)
8088
}
8189
return err
8290
},
8391
}
84-
err := cmd.Invoke().WithOS().Run()
85-
if err != nil {
86-
fmt.Fprintf(os.Stderr, "error: %v", err)
87-
os.Exit(1)
88-
}
92+
return cmd
8993
}

cmd/envbuilder/main_test.go

+84
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"encoding/json"
6+
"net/http"
7+
"net/http/httptest"
8+
"path/filepath"
9+
"testing"
10+
"time"
11+
12+
"cdr.dev/slog/sloggers/slogtest"
13+
"github.com/coder/envbuilder/internal/notcodersdk"
14+
"github.com/coder/serpent"
15+
"github.com/google/uuid"
16+
"github.com/stretchr/testify/assert"
17+
"github.com/stretchr/testify/require"
18+
)
19+
20+
func Test_sendLogs(t *testing.T) {
21+
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
22+
defer cancel()
23+
// Random token for testing log fowarding
24+
agentToken := uuid.NewString()
25+
26+
// Server to read logs posted by envbuilder. Matched to backlog limit.
27+
logCh := make(chan notcodersdk.Log, 100)
28+
logs := make([]notcodersdk.Log, 0)
29+
go func() {
30+
for {
31+
select {
32+
case <-ctx.Done():
33+
return
34+
case log, ok := <-logCh:
35+
if !ok {
36+
return
37+
}
38+
logs = append(logs, log)
39+
}
40+
}
41+
}()
42+
logSrv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
43+
if !assert.Equal(t, http.MethodPatch, r.Method) {
44+
w.WriteHeader(http.StatusMethodNotAllowed)
45+
return
46+
}
47+
assert.Equal(t, agentToken, r.Header.Get(notcodersdk.SessionTokenHeader))
48+
var res notcodersdk.PatchLogs
49+
if !assert.NoError(t, json.NewDecoder(r.Body).Decode(&res)) {
50+
w.WriteHeader(http.StatusInternalServerError)
51+
return
52+
}
53+
if !assert.Equal(t, notcodersdk.ExternalLogSourceID, res.LogSourceID) {
54+
w.WriteHeader(http.StatusInternalServerError)
55+
return
56+
}
57+
for _, log := range res.Logs {
58+
logCh <- log
59+
}
60+
w.WriteHeader(http.StatusOK)
61+
}))
62+
63+
// Make an empty working directory
64+
tmpDir := t.TempDir()
65+
t.Setenv("ENVBUILDER_DEVCONTAINER_DIR", tmpDir)
66+
t.Setenv("ENVBUILDER_DOCKERFILE_DIR", filepath.Join(tmpDir, "Dockerfile"))
67+
t.Setenv("ENVBUILDER_WORKSPACE_FOLDER", tmpDir)
68+
t.Setenv("CODER_AGENT_TOKEN", agentToken)
69+
t.Setenv("CODER_AGENT_URL", logSrv.URL)
70+
71+
testLogger := slogtest.Make(t, &slogtest.Options{IgnoreErrors: true})
72+
cmd := envbuilderCmd()
73+
inv := &serpent.Invocation{
74+
Command: &cmd,
75+
Args: []string{},
76+
Logger: testLogger,
77+
Environ: serpent.Environ{},
78+
}
79+
80+
err := inv.WithOS().Run()
81+
require.ErrorContains(t, err, "no such file or directory")
82+
require.NotEmpty(t, logs)
83+
require.Contains(t, logs[len(logs)-1].Output, "no such file or directory")
84+
}

0 commit comments

Comments
 (0)