Skip to content

Commit 5255b13

Browse files
committed
Add provisioner daemons
1 parent e97287f commit 5255b13

File tree

4 files changed

+99
-2
lines changed

4 files changed

+99
-2
lines changed

enterprise/cli/provisionerdaemons.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package cli

enterprise/coderd/provisionerdaemons.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ func (api *API) provisionerDaemonServe(rw http.ResponseWriter, r *http.Request)
107107

108108
if tags[provisionerdserver.TagScope] == provisionerdserver.ScopeOrganization {
109109
if !api.AGPL.Authorize(r, rbac.ActionCreate, rbac.ResourceProvisionerDaemon) {
110-
httpapi.Write(r.Context(), rw, http.StatusUnauthorized, codersdk.Response{
110+
httpapi.Write(r.Context(), rw, http.StatusForbidden, codersdk.Response{
111111
Message: "You aren't allowed to create provisioner daemons for the organization.",
112112
})
113113
return
@@ -130,6 +130,8 @@ func (api *API) provisionerDaemonServe(rw http.ResponseWriter, r *http.Request)
130130
return
131131
}
132132

133+
fmt.Printf("TAGS %+v\n", daemon.Tags)
134+
133135
rawTags, err := json.Marshal(daemon.Tags)
134136
if err != nil {
135137
httpapi.Write(r.Context(), rw, http.StatusInternalServerError, codersdk.Response{

enterprise/coderd/provisionerdaemons_test.go

Lines changed: 92 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,26 @@ package coderd_test
22

33
import (
44
"context"
5+
"net/http"
56
"testing"
7+
"time"
68

9+
"github.com/google/uuid"
710
"github.com/stretchr/testify/require"
811

912
"github.com/coder/coder/coderd/coderdtest"
13+
"github.com/coder/coder/coderd/provisionerdserver"
1014
"github.com/coder/coder/codersdk"
1115
"github.com/coder/coder/enterprise/coderd/coderdenttest"
16+
"github.com/coder/coder/provisioner/echo"
17+
"github.com/coder/coder/provisionerd"
18+
provisionerdproto "github.com/coder/coder/provisionerd/proto"
19+
"github.com/coder/coder/provisionersdk/proto"
1220
)
1321

1422
func TestProvisionerDaemonServe(t *testing.T) {
1523
t.Parallel()
16-
t.Run("Serve", func(t *testing.T) {
24+
t.Run("Organization", func(t *testing.T) {
1725
t.Parallel()
1826
client := coderdenttest.New(t, nil)
1927
user := coderdtest.CreateFirstUser(t, client)
@@ -23,6 +31,89 @@ func TestProvisionerDaemonServe(t *testing.T) {
2331
require.NoError(t, err)
2432
srv.DRPCConn().Close()
2533
})
34+
35+
t.Run("OrganizationNoPerms", func(t *testing.T) {
36+
t.Parallel()
37+
client := coderdenttest.New(t, nil)
38+
user := coderdtest.CreateFirstUser(t, client)
39+
another := coderdtest.CreateAnotherUser(t, client, user.OrganizationID)
40+
_, err := another.ServeProvisionerDaemon(context.Background(), user.OrganizationID, []codersdk.ProvisionerType{
41+
codersdk.ProvisionerTypeEcho,
42+
}, map[string]string{
43+
provisionerdserver.TagScope: provisionerdserver.ScopeOrganization,
44+
})
45+
require.Error(t, err)
46+
var apiError *codersdk.Error
47+
require.ErrorAs(t, err, &apiError)
48+
require.Equal(t, http.StatusForbidden, apiError.StatusCode())
49+
})
50+
51+
t.Run("UserLocal", func(t *testing.T) {
52+
t.Parallel()
53+
client := coderdenttest.New(t, nil)
54+
user := coderdtest.CreateFirstUser(t, client)
55+
srv := provisionerd.New(func(ctx context.Context) (provisionerdproto.DRPCProvisionerDaemonClient, error) {
56+
return client.ServeProvisionerDaemon(context.Background(), user.OrganizationID, []codersdk.ProvisionerType{
57+
codersdk.ProvisionerTypeEcho,
58+
}, map[string]string{
59+
provisionerdserver.TagScope: provisionerdserver.ScopeUser,
60+
})
61+
}, nil)
62+
defer srv.Close()
63+
64+
authToken := uuid.NewString()
65+
data, err := echo.Tar(&echo.Responses{
66+
Parse: echo.ParseComplete,
67+
ProvisionDryRun: []*proto.Provision_Response{{
68+
Type: &proto.Provision_Response_Complete{
69+
Complete: &proto.Provision_Complete{
70+
Resources: []*proto.Resource{{
71+
Name: "example",
72+
Type: "aws_instance",
73+
Agents: []*proto.Agent{{
74+
Id: uuid.NewString(),
75+
Name: "example",
76+
}},
77+
}},
78+
},
79+
},
80+
}},
81+
Provision: []*proto.Provision_Response{{
82+
Type: &proto.Provision_Response_Complete{
83+
Complete: &proto.Provision_Complete{
84+
Resources: []*proto.Resource{{
85+
Name: "example",
86+
Type: "aws_instance",
87+
Agents: []*proto.Agent{{
88+
Id: uuid.NewString(),
89+
Name: "example",
90+
Auth: &proto.Agent_Token{
91+
Token: authToken,
92+
},
93+
}},
94+
}},
95+
},
96+
},
97+
}},
98+
})
99+
require.NoError(t, err)
100+
file, err := client.Upload(context.Background(), codersdk.ContentTypeTar, data)
101+
require.NoError(t, err)
102+
103+
_, err = client.CreateTemplateVersion(context.Background(), user.OrganizationID, codersdk.CreateTemplateVersionRequest{
104+
Name: "example",
105+
StorageMethod: codersdk.ProvisionerStorageMethodFile,
106+
FileID: file.ID,
107+
Provisioner: codersdk.ProvisionerTypeEcho,
108+
ProvisionerTags: map[string]string{
109+
provisionerdserver.TagScope: provisionerdserver.ScopeUser,
110+
},
111+
})
112+
require.NoError(t, err)
113+
// coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
114+
115+
time.Sleep(time.Second)
116+
})
26117
}
27118

28119
func TestPostProvisionerDaemon(t *testing.T) {

provisionerd/provisionerd.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ type Options struct {
5858

5959
// New creates and starts a provisioner daemon.
6060
func New(clientDialer Dialer, opts *Options) *Server {
61+
if opts == nil {
62+
opts = &Options{}
63+
}
6164
if opts.PollInterval == 0 {
6265
opts.PollInterval = 5 * time.Second
6366
}

0 commit comments

Comments
 (0)