Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit cb2733b

Browse files
committed
The full end-to-end operation works
1 parent 0a83477 commit cb2733b

File tree

11 files changed

+248
-27
lines changed

11 files changed

+248
-27
lines changed

.vscode/settings.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"coderdtest",
2929
"codersdk",
3030
"drpc",
31+
"drpcconn",
3132
"drpcmux",
3233
"drpcserver",
3334
"goleak",
@@ -44,6 +45,8 @@
4445
"retrier",
4546
"sdkproto",
4647
"stretchr",
48+
"tfexec",
49+
"tfstate",
4750
"unconvert",
4851
"xerrors",
4952
"yamux"

coderd/coderdtest/coderdtest.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,15 @@ func (s *Server) AddProvisionerd(t *testing.T) io.Closer {
7878
ServeOptions: &provisionersdk.ServeOptions{
7979
Listener: tfServer,
8080
},
81+
Logger: slogtest.Make(t, nil).Named("terraform-provisioner").Leveled(slog.LevelDebug),
8182
})
8283
require.NoError(t, err)
8384
}()
8485

8586
closer := provisionerd.New(s.Client.ProvisionerDaemonClient, &provisionerd.Options{
86-
Logger: slogtest.Make(t, nil).Named("provisionerd").Leveled(slog.LevelInfo),
87-
PollInterval: 50 * time.Millisecond,
87+
Logger: slogtest.Make(t, nil).Named("provisionerd").Leveled(slog.LevelInfo),
88+
PollInterval: 50 * time.Millisecond,
89+
UpdateInterval: 50 * time.Millisecond,
8890
Provisioners: provisionerd.Provisioners{
8991
string(database.ProvisionerTypeTerraform): proto.NewDRPCProvisionerClient(provisionersdk.Conn(tfClient)),
9092
},
@@ -101,6 +103,7 @@ func (s *Server) AddProvisionerd(t *testing.T) io.Closer {
101103
func New(t *testing.T) Server {
102104
// This can be hotswapped for a live database instance.
103105
db := databasefake.New()
106+
pubsub := database.NewPubsubInMemory()
104107
if os.Getenv("DB") != "" {
105108
connectionURL, close, err := postgres.Open()
106109
require.NoError(t, err)
@@ -113,11 +116,15 @@ func New(t *testing.T) Server {
113116
err = database.Migrate(sqlDB)
114117
require.NoError(t, err)
115118
db = database.New(sqlDB)
119+
120+
pubsub, err = database.NewPubsub(context.Background(), sqlDB, connectionURL)
121+
require.NoError(t, err)
116122
}
117123

118124
handler := coderd.New(&coderd.Options{
119125
Logger: slogtest.Make(t, nil),
120126
Database: db,
127+
Pubsub: pubsub,
121128
})
122129
srv := httptest.NewServer(handler)
123130
serverURL, err := url.Parse(srv.URL)

coderd/provisionerdaemons.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,10 @@ func (api *api) provisionerDaemonsServe(rw http.ResponseWriter, r *http.Request)
7676
}
7777
mux := drpcmux.New()
7878
err = proto.DRPCRegisterProvisionerDaemon(mux, &provisionerdServer{
79-
ID: daemon.ID,
80-
Database: api.Database,
81-
Pubsub: api.Pubsub,
79+
ID: daemon.ID,
80+
Database: api.Database,
81+
Pubsub: api.Pubsub,
82+
Provisioners: daemon.Provisioners,
8283
})
8384
if err != nil {
8485
_ = conn.Close(websocket.StatusInternalError, fmt.Sprintf("drpc register provisioner daemon: %s", err))
@@ -103,9 +104,10 @@ type projectImportJob struct {
103104

104105
// Implementation of the provisioner daemon protobuf server.
105106
type provisionerdServer struct {
106-
ID uuid.UUID
107-
Database database.Store
108-
Pubsub database.Pubsub
107+
ID uuid.UUID
108+
Provisioners []database.ProvisionerType
109+
Database database.Store
110+
Pubsub database.Pubsub
109111
}
110112

111113
// AcquireJob queries the database to lock a job.
@@ -120,7 +122,7 @@ func (server *provisionerdServer) AcquireJob(ctx context.Context, _ *proto.Empty
120122
UUID: server.ID,
121123
Valid: true,
122124
},
123-
Types: []database.ProvisionerType{database.ProvisionerTypeTerraform},
125+
Types: server.Provisioners,
124126
})
125127
if errors.Is(err, sql.ErrNoRows) {
126128
// The provisioner daemon assumes no jobs are available if

coderd/workspacehistory.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ type WorkspaceHistory struct {
2727
ProjectHistoryID uuid.UUID `json:"project_history_id"`
2828
BeforeID uuid.UUID `json:"before_id"`
2929
AfterID uuid.UUID `json:"after_id"`
30+
Name string `json:"name"`
3031
Transition database.WorkspaceTransition `json:"transition"`
3132
Initiator string `json:"initiator"`
3233
Provision ProvisionerJob `json:"provision"`
@@ -144,7 +145,7 @@ func (api *api) postWorkspaceHistoryByUser(rw http.ResponseWriter, r *http.Reque
144145
}
145146

146147
workspaceHistory, err = db.InsertWorkspaceHistory(r.Context(), database.InsertWorkspaceHistoryParams{
147-
ID: uuid.New(),
148+
ID: workspaceHistoryID,
148149
CreatedAt: database.Now(),
149150
UpdatedAt: database.Now(),
150151
WorkspaceID: workspace.ID,
@@ -242,6 +243,7 @@ func convertWorkspaceHistory(workspaceHistory database.WorkspaceHistory, provisi
242243
ProjectHistoryID: workspaceHistory.ProjectHistoryID,
243244
BeforeID: workspaceHistory.BeforeID.UUID,
244245
AfterID: workspaceHistory.AfterID.UUID,
246+
Name: workspaceHistory.Name,
245247
Transition: workspaceHistory.Transition,
246248
Initiator: workspaceHistory.Initiator,
247249
Provision: convertProvisionerJob(provisionerJob),

coderd/workspacehistory_test.go

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,18 @@ func TestWorkspaceHistory(t *testing.T) {
3636
setupProjectHistory := func(t *testing.T, client *codersdk.Client, user coderd.CreateInitialUserRequest, project coderd.Project, files map[string]string) coderd.ProjectHistory {
3737
var buffer bytes.Buffer
3838
writer := tar.NewWriter(&buffer)
39-
err := writer.WriteHeader(&tar.Header{
40-
Name: "file",
41-
Size: 1 << 10,
42-
})
43-
require.NoError(t, err)
44-
_, err = writer.Write(make([]byte, 1<<10))
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()
4549
require.NoError(t, err)
50+
4651
projectHistory, err := client.CreateProjectHistory(context.Background(), user.Organization, project.Name, coderd.CreateProjectHistoryRequest{
4752
StorageMethod: database.ProjectStorageMethodInlineArchive,
4853
StorageSource: buffer.Bytes(),
@@ -65,7 +70,9 @@ func TestWorkspaceHistory(t *testing.T) {
6570
history, err := server.Client.ListWorkspaceHistory(context.Background(), "", workspace.Name)
6671
require.NoError(t, err)
6772
require.Len(t, history, 0)
68-
projectVersion := setupProjectHistory(t, server.Client, user, project, map[string]string{})
73+
projectVersion := setupProjectHistory(t, server.Client, user, project, map[string]string{
74+
"example": "file",
75+
})
6976
_, err = server.Client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{
7077
ProjectHistoryID: projectVersion.ID,
7178
Transition: database.WorkspaceTransitionCreate,
@@ -84,7 +91,9 @@ func TestWorkspaceHistory(t *testing.T) {
8491
project, workspace := setupProjectAndWorkspace(t, server.Client, user)
8592
_, err := server.Client.WorkspaceHistory(context.Background(), "", workspace.Name, "")
8693
require.Error(t, err)
87-
projectHistory := setupProjectHistory(t, server.Client, user, project, map[string]string{})
94+
projectHistory := setupProjectHistory(t, server.Client, user, project, map[string]string{
95+
"some": "file",
96+
})
8897
_, err = server.Client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{
8998
ProjectHistoryID: projectHistory.ID,
9099
Transition: database.WorkspaceTransitionCreate,
@@ -100,12 +109,23 @@ func TestWorkspaceHistory(t *testing.T) {
100109
_ = server.AddProvisionerd(t)
101110
user := server.RandomInitialUser(t)
102111
project, workspace := setupProjectAndWorkspace(t, server.Client, user)
103-
projectHistory := setupProjectHistory(t, server.Client, user, project, map[string]string{})
112+
projectHistory := setupProjectHistory(t, server.Client, user, project, map[string]string{
113+
"main.tf": `resource "null_resource" "example" {}`,
114+
})
104115
_, err := server.Client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{
105116
ProjectHistoryID: projectHistory.ID,
106117
Transition: database.WorkspaceTransitionCreate,
107118
})
108119
require.NoError(t, err)
120+
121+
var workspaceHistory coderd.WorkspaceHistory
122+
require.Eventually(t, func() bool {
123+
workspaceHistory, err = server.Client.WorkspaceHistory(context.Background(), "", workspace.Name, "")
124+
require.NoError(t, err)
125+
return workspaceHistory.Provision.Status.Completed()
126+
}, 5*time.Second, 50*time.Millisecond)
127+
require.Equal(t, "", workspaceHistory.Provision.Error)
128+
require.Equal(t, coderd.ProvisionerJobStatusSucceeded, workspaceHistory.Provision.Status)
109129
})
110130

111131
t.Run("CreateHistoryAlreadyInProgress", func(t *testing.T) {
@@ -114,7 +134,9 @@ func TestWorkspaceHistory(t *testing.T) {
114134
_ = server.AddProvisionerd(t)
115135
user := server.RandomInitialUser(t)
116136
project, workspace := setupProjectAndWorkspace(t, server.Client, user)
117-
projectHistory := setupProjectHistory(t, server.Client, user, project, map[string]string{})
137+
projectHistory := setupProjectHistory(t, server.Client, user, project, map[string]string{
138+
"some": "content",
139+
})
118140

119141
_, err := server.Client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{
120142
ProjectHistoryID: projectHistory.ID,

codersdk/projects_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ func TestProjects(t *testing.T) {
7171
require.NoError(t, err)
7272
})
7373

74-
t.Run("UnauthenticatedHistorys", func(t *testing.T) {
74+
t.Run("UnauthenticatedHistory", func(t *testing.T) {
7575
t.Parallel()
7676
server := coderdtest.New(t)
7777
_, err := server.Client.ListProjectHistory(context.Background(), "org", "project")

0 commit comments

Comments
 (0)