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

Skip to content

Commit e87f31d

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

File tree

14 files changed

+258
-29
lines changed

14 files changed

+258
-29
lines changed

.github/workflows/coder.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,6 @@ jobs:
151151
- run: go install gotest.tools/gotestsum@latest
152152

153153
- uses: hashicorp/setup-terraform@v1
154-
if: runner.os == 'Linux'
155154
with:
156155
terraform_version: 1.1.2
157156
terraform_wrapper: false

.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/cmd/root.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"cdr.dev/slog"
1212
"cdr.dev/slog/sloggers/sloghuman"
1313
"github.com/coder/coder/coderd"
14+
"github.com/coder/coder/database"
1415
"github.com/coder/coder/database/databasefake"
1516
)
1617

@@ -24,6 +25,7 @@ func Root() *cobra.Command {
2425
handler := coderd.New(&coderd.Options{
2526
Logger: slog.Make(sloghuman.Sink(os.Stderr)),
2627
Database: databasefake.New(),
28+
Pubsub: database.NewPubsubInMemory(),
2729
})
2830

2931
listener, err := net.Listen("tcp", address)

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: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ func (api *api) provisionerDaemons(rw http.ResponseWriter, r *http.Request) {
3333
daemons, err := api.Database.GetProvisionerDaemons(r.Context())
3434
if errors.Is(err, sql.ErrNoRows) {
3535
err = nil
36+
daemons = []database.ProvisionerDaemon{}
3637
}
3738
if err != nil {
3839
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
@@ -76,9 +77,10 @@ func (api *api) provisionerDaemonsServe(rw http.ResponseWriter, r *http.Request)
7677
}
7778
mux := drpcmux.New()
7879
err = proto.DRPCRegisterProvisionerDaemon(mux, &provisionerdServer{
79-
ID: daemon.ID,
80-
Database: api.Database,
81-
Pubsub: api.Pubsub,
80+
ID: daemon.ID,
81+
Database: api.Database,
82+
Pubsub: api.Pubsub,
83+
Provisioners: daemon.Provisioners,
8284
})
8385
if err != nil {
8486
_ = conn.Close(websocket.StatusInternalError, fmt.Sprintf("drpc register provisioner daemon: %s", err))
@@ -103,9 +105,10 @@ type projectImportJob struct {
103105

104106
// Implementation of the provisioner daemon protobuf server.
105107
type provisionerdServer struct {
106-
ID uuid.UUID
107-
Database database.Store
108-
Pubsub database.Pubsub
108+
ID uuid.UUID
109+
Provisioners []database.ProvisionerType
110+
Database database.Store
111+
Pubsub database.Pubsub
109112
}
110113

111114
// AcquireJob queries the database to lock a job.
@@ -120,7 +123,7 @@ func (server *provisionerdServer) AcquireJob(ctx context.Context, _ *proto.Empty
120123
UUID: server.ID,
121124
Valid: true,
122125
},
123-
Types: []database.ProvisionerType{database.ProvisionerTypeTerraform},
126+
Types: server.Provisioners,
124127
})
125128
if errors.Is(err, sql.ErrNoRows) {
126129
// The provisioner daemon assumes no jobs are available if

coderd/provisioners.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ const (
1919
ProvisionerJobStatusPending ProvisionerJobStatus = "pending"
2020
ProvisionerJobStatusRunning ProvisionerJobStatus = "running"
2121
ProvisionerJobStatusSucceeded ProvisionerJobStatus = "succeeded"
22+
ProvisionerJobStatusCancelled ProvisionerJobStatus = "canceled"
2223
ProvisionerJobStatusFailed ProvisionerJobStatus = "failed"
2324
)
2425

@@ -41,6 +42,7 @@ func convertProvisionerJob(provisionerJob database.ProvisionerJob) ProvisionerJo
4142
Error: provisionerJob.Error.String,
4243
Provisioner: provisionerJob.Provisioner,
4344
}
45+
// Applying values optional to the struct.
4446
if provisionerJob.StartedAt.Valid {
4547
job.StartedAt = &provisionerJob.StartedAt.Time
4648
}
@@ -56,7 +58,7 @@ func convertProvisionerJob(provisionerJob database.ProvisionerJob) ProvisionerJo
5658

5759
switch {
5860
case provisionerJob.CancelledAt.Valid:
59-
job.Status = ProvisionerJobStatusFailed
61+
job.Status = ProvisionerJobStatusCancelled
6062
case !provisionerJob.StartedAt.Valid:
6163
job.Status = ProvisionerJobStatusPending
6264
case provisionerJob.CompletedAt.Valid:
@@ -68,5 +70,9 @@ func convertProvisionerJob(provisionerJob database.ProvisionerJob) ProvisionerJo
6870
job.Status = ProvisionerJobStatusRunning
6971
}
7072

73+
if job.Error != "" {
74+
job.Status = ProvisionerJobStatusFailed
75+
}
76+
7177
return job
7278
}

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)