Skip to content

Commit 682238d

Browse files
authored
feat: Add echo provisioner (#162)
This replaces the cdr-basic provisioner type with "echo". It reads binary data from the directory and returns the responses in order. This is used to test project and workspace job logic.
1 parent 65de6ee commit 682238d

15 files changed

+366
-129
lines changed

coderd/coderdtest/coderdtest.go

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import (
2020
"github.com/coder/coder/database"
2121
"github.com/coder/coder/database/databasefake"
2222
"github.com/coder/coder/database/postgres"
23-
"github.com/coder/coder/provisioner/terraform"
23+
"github.com/coder/coder/provisioner/echo"
2424
"github.com/coder/coder/provisionerd"
2525
"github.com/coder/coder/provisionersdk"
2626
"github.com/coder/coder/provisionersdk/proto"
@@ -64,21 +64,19 @@ func (s *Server) RandomInitialUser(t *testing.T) coderd.CreateInitialUserRequest
6464
return req
6565
}
6666

67-
// AddProvisionerd launches a new provisionerd instance!
67+
// AddProvisionerd launches a new provisionerd instance with the
68+
// test provisioner registered.
6869
func (s *Server) AddProvisionerd(t *testing.T) io.Closer {
69-
tfClient, tfServer := provisionersdk.TransportPipe()
70+
echoClient, echoServer := provisionersdk.TransportPipe()
7071
ctx, cancelFunc := context.WithCancel(context.Background())
7172
t.Cleanup(func() {
72-
_ = tfClient.Close()
73-
_ = tfServer.Close()
73+
_ = echoClient.Close()
74+
_ = echoServer.Close()
7475
cancelFunc()
7576
})
7677
go func() {
77-
err := terraform.Serve(ctx, &terraform.ServeOptions{
78-
ServeOptions: &provisionersdk.ServeOptions{
79-
Listener: tfServer,
80-
},
81-
Logger: slogtest.Make(t, nil).Named("terraform-provisioner").Leveled(slog.LevelDebug),
78+
err := echo.Serve(ctx, &provisionersdk.ServeOptions{
79+
Listener: echoServer,
8280
})
8381
require.NoError(t, err)
8482
}()
@@ -88,7 +86,7 @@ func (s *Server) AddProvisionerd(t *testing.T) io.Closer {
8886
PollInterval: 50 * time.Millisecond,
8987
UpdateInterval: 50 * time.Millisecond,
9088
Provisioners: provisionerd.Provisioners{
91-
string(database.ProvisionerTypeTerraform): proto.NewDRPCProvisionerClient(provisionersdk.Conn(tfClient)),
89+
string(database.ProvisionerTypeEcho): proto.NewDRPCProvisionerClient(provisionersdk.Conn(echoClient)),
9290
},
9391
WorkDirectory: t.TempDir(),
9492
})

coderd/projecthistory_test.go

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import (
1111
"github.com/coder/coder/coderd"
1212
"github.com/coder/coder/coderd/coderdtest"
1313
"github.com/coder/coder/database"
14+
"github.com/coder/coder/provisioner/echo"
15+
"github.com/coder/coder/provisionersdk/proto"
1416
)
1517

1618
func TestProjectHistory(t *testing.T) {
@@ -22,7 +24,7 @@ func TestProjectHistory(t *testing.T) {
2224
user := server.RandomInitialUser(t)
2325
project, err := server.Client.CreateProject(context.Background(), user.Organization, coderd.CreateProjectRequest{
2426
Name: "someproject",
25-
Provisioner: database.ProvisionerTypeTerraform,
27+
Provisioner: database.ProvisionerTypeEcho,
2628
})
2729
require.NoError(t, err)
2830
versions, err := server.Client.ListProjectHistory(context.Background(), user.Organization, project.Name)
@@ -36,21 +38,18 @@ func TestProjectHistory(t *testing.T) {
3638
user := server.RandomInitialUser(t)
3739
project, err := server.Client.CreateProject(context.Background(), user.Organization, coderd.CreateProjectRequest{
3840
Name: "someproject",
39-
Provisioner: database.ProvisionerTypeTerraform,
41+
Provisioner: database.ProvisionerTypeEcho,
4042
})
4143
require.NoError(t, err)
42-
var buffer bytes.Buffer
43-
writer := tar.NewWriter(&buffer)
44-
err = writer.WriteHeader(&tar.Header{
45-
Name: "file",
46-
Size: 1 << 10,
47-
})
48-
require.NoError(t, err)
49-
_, err = writer.Write(make([]byte, 1<<10))
44+
data, err := echo.Tar([]*proto.Parse_Response{{
45+
Type: &proto.Parse_Response_Complete{
46+
Complete: &proto.Parse_Complete{},
47+
},
48+
}}, nil)
5049
require.NoError(t, err)
5150
history, err := server.Client.CreateProjectHistory(context.Background(), user.Organization, project.Name, coderd.CreateProjectHistoryRequest{
5251
StorageMethod: database.ProjectStorageMethodInlineArchive,
53-
StorageSource: buffer.Bytes(),
52+
StorageSource: data,
5453
})
5554
require.NoError(t, err)
5655
versions, err := server.Client.ListProjectHistory(context.Background(), user.Organization, project.Name)
@@ -67,7 +66,7 @@ func TestProjectHistory(t *testing.T) {
6766
user := server.RandomInitialUser(t)
6867
project, err := server.Client.CreateProject(context.Background(), user.Organization, coderd.CreateProjectRequest{
6968
Name: "someproject",
70-
Provisioner: database.ProvisionerTypeTerraform,
69+
Provisioner: database.ProvisionerTypeEcho,
7170
})
7271
require.NoError(t, err)
7372
var buffer bytes.Buffer
@@ -92,7 +91,7 @@ func TestProjectHistory(t *testing.T) {
9291
user := server.RandomInitialUser(t)
9392
project, err := server.Client.CreateProject(context.Background(), user.Organization, coderd.CreateProjectRequest{
9493
Name: "someproject",
95-
Provisioner: database.ProvisionerTypeTerraform,
94+
Provisioner: database.ProvisionerTypeEcho,
9695
})
9796
require.NoError(t, err)
9897
_, err = server.Client.CreateProjectHistory(context.Background(), user.Organization, project.Name, coderd.CreateProjectHistoryRequest{

coderd/projects.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ type Project database.Project
2222
// CreateProjectRequest enables callers to create a new Project.
2323
type CreateProjectRequest struct {
2424
Name string `json:"name" validate:"username,required"`
25-
Provisioner database.ProvisionerType `json:"provisioner" validate:"oneof=terraform cdr-basic,required"`
25+
Provisioner database.ProvisionerType `json:"provisioner" validate:"oneof=terraform echo,required"`
2626
}
2727

2828
// Lists all projects the authenticated user has access to.

coderd/projects_test.go

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package coderd_test
22

33
import (
4-
"archive/tar"
5-
"bytes"
64
"context"
75
"testing"
86
"time"
@@ -12,6 +10,8 @@ import (
1210
"github.com/coder/coder/coderd"
1311
"github.com/coder/coder/coderd/coderdtest"
1412
"github.com/coder/coder/database"
13+
"github.com/coder/coder/provisioner/echo"
14+
"github.com/coder/coder/provisionersdk/proto"
1515
)
1616

1717
func TestProjects(t *testing.T) {
@@ -23,7 +23,7 @@ func TestProjects(t *testing.T) {
2323
user := server.RandomInitialUser(t)
2424
_, err := server.Client.CreateProject(context.Background(), user.Organization, coderd.CreateProjectRequest{
2525
Name: "someproject",
26-
Provisioner: database.ProvisionerTypeTerraform,
26+
Provisioner: database.ProvisionerTypeEcho,
2727
})
2828
require.NoError(t, err)
2929
})
@@ -34,12 +34,12 @@ func TestProjects(t *testing.T) {
3434
user := server.RandomInitialUser(t)
3535
_, err := server.Client.CreateProject(context.Background(), user.Organization, coderd.CreateProjectRequest{
3636
Name: "someproject",
37-
Provisioner: database.ProvisionerTypeTerraform,
37+
Provisioner: database.ProvisionerTypeEcho,
3838
})
3939
require.NoError(t, err)
4040
_, err = server.Client.CreateProject(context.Background(), user.Organization, coderd.CreateProjectRequest{
4141
Name: "someproject",
42-
Provisioner: database.ProvisionerTypeTerraform,
42+
Provisioner: database.ProvisionerTypeEcho,
4343
})
4444
require.Error(t, err)
4545
})
@@ -59,7 +59,7 @@ func TestProjects(t *testing.T) {
5959
user := server.RandomInitialUser(t)
6060
_, err := server.Client.CreateProject(context.Background(), user.Organization, coderd.CreateProjectRequest{
6161
Name: "someproject",
62-
Provisioner: database.ProvisionerTypeTerraform,
62+
Provisioner: database.ProvisionerTypeEcho,
6363
})
6464
require.NoError(t, err)
6565
// Ensure global query works.
@@ -89,7 +89,7 @@ func TestProjects(t *testing.T) {
8989
user := server.RandomInitialUser(t)
9090
project, err := server.Client.CreateProject(context.Background(), user.Organization, coderd.CreateProjectRequest{
9191
Name: "someproject",
92-
Provisioner: database.ProvisionerTypeTerraform,
92+
Provisioner: database.ProvisionerTypeEcho,
9393
})
9494
require.NoError(t, err)
9595
_, err = server.Client.Project(context.Background(), user.Organization, project.Name)
@@ -102,7 +102,7 @@ func TestProjects(t *testing.T) {
102102
user := server.RandomInitialUser(t)
103103
project, err := server.Client.CreateProject(context.Background(), user.Organization, coderd.CreateProjectRequest{
104104
Name: "someproject",
105-
Provisioner: database.ProvisionerTypeTerraform,
105+
Provisioner: database.ProvisionerTypeEcho,
106106
})
107107
require.NoError(t, err)
108108
_, err = server.Client.ProjectParameters(context.Background(), user.Organization, project.Name)
@@ -115,7 +115,7 @@ func TestProjects(t *testing.T) {
115115
user := server.RandomInitialUser(t)
116116
project, err := server.Client.CreateProject(context.Background(), user.Organization, coderd.CreateProjectRequest{
117117
Name: "someproject",
118-
Provisioner: database.ProvisionerTypeTerraform,
118+
Provisioner: database.ProvisionerTypeEcho,
119119
})
120120
require.NoError(t, err)
121121
_, err = server.Client.CreateProjectParameter(context.Background(), user.Organization, project.Name, coderd.CreateParameterValueRequest{
@@ -135,24 +135,22 @@ func TestProjects(t *testing.T) {
135135
_ = server.AddProvisionerd(t)
136136
project, err := server.Client.CreateProject(context.Background(), user.Organization, coderd.CreateProjectRequest{
137137
Name: "someproject",
138-
Provisioner: database.ProvisionerTypeTerraform,
138+
Provisioner: database.ProvisionerTypeEcho,
139139
})
140140
require.NoError(t, err)
141-
var buffer bytes.Buffer
142-
writer := tar.NewWriter(&buffer)
143-
content := `variable "example" {
144-
default = "hi"
145-
}`
146-
err = writer.WriteHeader(&tar.Header{
147-
Name: "main.tf",
148-
Size: int64(len(content)),
149-
})
150-
require.NoError(t, err)
151-
_, err = writer.Write([]byte(content))
141+
data, err := echo.Tar([]*proto.Parse_Response{{
142+
Type: &proto.Parse_Response_Complete{
143+
Complete: &proto.Parse_Complete{
144+
ParameterSchemas: []*proto.ParameterSchema{{
145+
Name: "example",
146+
}},
147+
},
148+
},
149+
}}, nil)
152150
require.NoError(t, err)
153151
history, err := server.Client.CreateProjectHistory(context.Background(), user.Organization, project.Name, coderd.CreateProjectHistoryRequest{
154152
StorageMethod: database.ProjectStorageMethodInlineArchive,
155-
StorageSource: buffer.Bytes(),
153+
StorageSource: data,
156154
})
157155
require.NoError(t, err)
158156
require.Eventually(t, func() bool {

coderd/provisionerdaemons.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ func (api *api) provisionerDaemonsServe(rw http.ResponseWriter, r *http.Request)
6565
ID: uuid.New(),
6666
CreatedAt: database.Now(),
6767
Name: namesgenerator.GetRandomName(1),
68-
Provisioners: []database.ProvisionerType{database.ProvisionerTypeCdrBasic, database.ProvisionerTypeTerraform},
68+
Provisioners: []database.ProvisionerType{database.ProvisionerTypeEcho, database.ProvisionerTypeTerraform},
6969
})
7070
if err != nil {
7171
_ = conn.Close(websocket.StatusInternalError, fmt.Sprintf("insert provisioner daemon:% s", err))

coderd/workspacehistory_test.go

Lines changed: 18 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package coderd_test
22

33
import (
4-
"archive/tar"
5-
"bytes"
64
"context"
75
"testing"
86
"time"
@@ -14,6 +12,7 @@ import (
1412
"github.com/coder/coder/coderd/coderdtest"
1513
"github.com/coder/coder/codersdk"
1614
"github.com/coder/coder/database"
15+
"github.com/coder/coder/provisioner/echo"
1716
)
1817

1918
func TestWorkspaceHistory(t *testing.T) {
@@ -22,7 +21,7 @@ func TestWorkspaceHistory(t *testing.T) {
2221
setupProjectAndWorkspace := func(t *testing.T, client *codersdk.Client, user coderd.CreateInitialUserRequest) (coderd.Project, coderd.Workspace) {
2322
project, err := client.CreateProject(context.Background(), user.Organization, coderd.CreateProjectRequest{
2423
Name: "banana",
25-
Provisioner: database.ProvisionerTypeTerraform,
24+
Provisioner: database.ProvisionerTypeEcho,
2625
})
2726
require.NoError(t, err)
2827
workspace, err := client.CreateWorkspace(context.Background(), "", coderd.CreateWorkspaceRequest{
@@ -33,24 +32,10 @@ func TestWorkspaceHistory(t *testing.T) {
3332
return project, workspace
3433
}
3534

36-
setupProjectHistory := func(t *testing.T, client *codersdk.Client, user coderd.CreateInitialUserRequest, project coderd.Project, files map[string]string) coderd.ProjectHistory {
37-
var buffer bytes.Buffer
38-
writer := tar.NewWriter(&buffer)
39-
for path, content := range files {
40-
err := writer.WriteHeader(&tar.Header{
41-
Name: path,
42-
Size: int64(len(content)),
43-
})
44-
require.NoError(t, err)
45-
_, err = writer.Write([]byte(content))
46-
require.NoError(t, err)
47-
}
48-
err := writer.Flush()
49-
require.NoError(t, err)
50-
35+
setupProjectHistory := func(t *testing.T, client *codersdk.Client, user coderd.CreateInitialUserRequest, project coderd.Project, data []byte) coderd.ProjectHistory {
5136
projectHistory, err := client.CreateProjectHistory(context.Background(), user.Organization, project.Name, coderd.CreateProjectHistoryRequest{
5237
StorageMethod: database.ProjectStorageMethodInlineArchive,
53-
StorageSource: buffer.Bytes(),
38+
StorageSource: data,
5439
})
5540
require.NoError(t, err)
5641
require.Eventually(t, func() bool {
@@ -71,9 +56,9 @@ func TestWorkspaceHistory(t *testing.T) {
7156
history, err := server.Client.ListWorkspaceHistory(context.Background(), "", workspace.Name)
7257
require.NoError(t, err)
7358
require.Len(t, history, 0)
74-
projectVersion := setupProjectHistory(t, server.Client, user, project, map[string]string{
75-
"example": "file",
76-
})
59+
data, err := echo.Tar(echo.ParseComplete, echo.ProvisionComplete)
60+
require.NoError(t, err)
61+
projectVersion := setupProjectHistory(t, server.Client, user, project, data)
7762
_, err = server.Client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{
7863
ProjectHistoryID: projectVersion.ID,
7964
Transition: database.WorkspaceTransitionCreate,
@@ -92,9 +77,9 @@ func TestWorkspaceHistory(t *testing.T) {
9277
project, workspace := setupProjectAndWorkspace(t, server.Client, user)
9378
_, err := server.Client.WorkspaceHistory(context.Background(), "", workspace.Name, "")
9479
require.Error(t, err)
95-
projectHistory := setupProjectHistory(t, server.Client, user, project, map[string]string{
96-
"some": "file",
97-
})
80+
data, err := echo.Tar(echo.ParseComplete, echo.ProvisionComplete)
81+
require.NoError(t, err)
82+
projectHistory := setupProjectHistory(t, server.Client, user, project, data)
9883
_, err = server.Client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{
9984
ProjectHistoryID: projectHistory.ID,
10085
Transition: database.WorkspaceTransitionCreate,
@@ -110,10 +95,10 @@ func TestWorkspaceHistory(t *testing.T) {
11095
user := server.RandomInitialUser(t)
11196
_ = server.AddProvisionerd(t)
11297
project, workspace := setupProjectAndWorkspace(t, server.Client, user)
113-
projectHistory := setupProjectHistory(t, server.Client, user, project, map[string]string{
114-
"main.tf": `resource "null_resource" "example" {}`,
115-
})
116-
_, err := server.Client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{
98+
data, err := echo.Tar(echo.ParseComplete, echo.ProvisionComplete)
99+
require.NoError(t, err)
100+
projectHistory := setupProjectHistory(t, server.Client, user, project, data)
101+
_, err = server.Client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{
117102
ProjectHistoryID: projectHistory.ID,
118103
Transition: database.WorkspaceTransitionCreate,
119104
})
@@ -135,11 +120,11 @@ func TestWorkspaceHistory(t *testing.T) {
135120
user := server.RandomInitialUser(t)
136121
_ = server.AddProvisionerd(t)
137122
project, workspace := setupProjectAndWorkspace(t, server.Client, user)
138-
projectHistory := setupProjectHistory(t, server.Client, user, project, map[string]string{
139-
"some": "content",
140-
})
123+
data, err := echo.Tar(echo.ParseComplete, echo.ProvisionComplete)
124+
require.NoError(t, err)
125+
projectHistory := setupProjectHistory(t, server.Client, user, project, data)
141126

142-
_, err := server.Client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{
127+
_, err = server.Client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{
143128
ProjectHistoryID: projectHistory.ID,
144129
Transition: database.WorkspaceTransitionCreate,
145130
})

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy