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

Skip to content

Commit b43cb4d

Browse files
committed
Merge branch 'main' into bryphe/refactor/add-codeblock-component
2 parents eb9aee3 + 430341b commit b43cb4d

File tree

22 files changed

+8457
-270
lines changed

22 files changed

+8457
-270
lines changed

.github/workflows/coder.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,9 @@ jobs:
198198
- run: yarn build
199199
working-directory: site
200200

201+
- run: yarn storybook:build
202+
working-directory: site
203+
201204
- run: yarn test:coverage
202205
working-directory: site
203206

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ yarn-error.log
1919
site/.eslintcache
2020
site/.next/
2121
site/node_modules/
22+
site/storybook-static/
2223
site/yarn-error.log
2324
coverage/
2425

.golangci.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ linters:
241241
- staticcheck
242242
- structcheck
243243
- tenv
244+
- testpackage
244245
- tparallel
245246
- typecheck
246247
- unconvert

.vscode/settings.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,13 @@
3434
"goleak",
3535
"hashicorp",
3636
"httpmw",
37+
"Jobf",
3738
"moby",
3839
"nhooyr",
3940
"nolint",
4041
"nosec",
4142
"oneof",
43+
"parameterscopeid",
4244
"protobuf",
4345
"provisionerd",
4446
"provisionersdk",

coderd/coderd.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ func New(options *Options) http.Handler {
6262
r.Use(httpmw.ExtractProjectParam(options.Database))
6363
r.Get("/", api.projectByOrganization)
6464
r.Get("/workspaces", api.workspacesByProject)
65+
r.Route("/parameters", func(r chi.Router) {
66+
r.Get("/", api.parametersByProject)
67+
r.Post("/", api.postParametersByProject)
68+
})
6569
r.Route("/history", func(r chi.Router) {
6670
r.Get("/", api.projectHistoryByOrganization)
6771
r.Post("/", api.postProjectHistoryByOrganization)

coderd/parameters.go

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package coderd
2+
3+
import (
4+
"database/sql"
5+
"errors"
6+
"fmt"
7+
"net/http"
8+
"time"
9+
10+
"github.com/go-chi/render"
11+
"github.com/google/uuid"
12+
13+
"github.com/coder/coder/database"
14+
"github.com/coder/coder/httpapi"
15+
)
16+
17+
// CreateParameterValueRequest is used to create a new parameter value for a scope.
18+
type CreateParameterValueRequest struct {
19+
Name string `json:"name"`
20+
SourceValue string `json:"source_value"`
21+
SourceScheme database.ParameterSourceScheme `json:"source_scheme"`
22+
DestinationScheme database.ParameterDestinationScheme `json:"destination_scheme"`
23+
DestinationValue string `json:"destination_value"`
24+
}
25+
26+
// ParameterValue represents a set value for the scope.
27+
type ParameterValue struct {
28+
ID uuid.UUID `json:"id"`
29+
Name string `json:"name"`
30+
CreatedAt time.Time `json:"created_at"`
31+
UpdatedAt time.Time `json:"updated_at"`
32+
Scope database.ParameterScope `json:"scope"`
33+
ScopeID string `json:"scope_id"`
34+
SourceScheme database.ParameterSourceScheme `json:"source_scheme"`
35+
DestinationScheme database.ParameterDestinationScheme `json:"destination_scheme"`
36+
DestinationValue string `json:"destination_value"`
37+
}
38+
39+
// Abstracts creating parameters into a single request/response format.
40+
// Callers are in charge of validating the requester has permissions to
41+
// perform the creation.
42+
func postParameterValueForScope(rw http.ResponseWriter, r *http.Request, db database.Store, scope database.ParameterScope, scopeID string) {
43+
var createRequest CreateParameterValueRequest
44+
if !httpapi.Read(rw, r, &createRequest) {
45+
return
46+
}
47+
parameterValue, err := db.InsertParameterValue(r.Context(), database.InsertParameterValueParams{
48+
ID: uuid.New(),
49+
Name: createRequest.Name,
50+
CreatedAt: database.Now(),
51+
UpdatedAt: database.Now(),
52+
Scope: scope,
53+
ScopeID: scopeID,
54+
SourceScheme: createRequest.SourceScheme,
55+
SourceValue: createRequest.SourceValue,
56+
DestinationScheme: createRequest.DestinationScheme,
57+
DestinationValue: createRequest.DestinationValue,
58+
})
59+
if err != nil {
60+
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
61+
Message: fmt.Sprintf("insert parameter value: %s", err),
62+
})
63+
return
64+
}
65+
66+
render.Status(r, http.StatusCreated)
67+
render.JSON(rw, r, parameterValue)
68+
}
69+
70+
// Abstracts returning parameters for a scope into a standardized
71+
// request/response format. Callers are responsible for checking
72+
// requester permissions.
73+
func parametersForScope(rw http.ResponseWriter, r *http.Request, db database.Store, req database.GetParameterValuesByScopeParams) {
74+
parameterValues, err := db.GetParameterValuesByScope(r.Context(), req)
75+
if errors.Is(err, sql.ErrNoRows) {
76+
err = nil
77+
parameterValues = []database.ParameterValue{}
78+
}
79+
if err != nil {
80+
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
81+
Message: fmt.Sprintf("get parameter values: %s", err),
82+
})
83+
return
84+
}
85+
86+
apiParameterValues := make([]ParameterValue, 0, len(parameterValues))
87+
for _, parameterValue := range parameterValues {
88+
apiParameterValues = append(apiParameterValues, convertParameterValue(parameterValue))
89+
}
90+
91+
render.Status(r, http.StatusOK)
92+
render.JSON(rw, r, apiParameterValues)
93+
}
94+
95+
func convertParameterValue(parameterValue database.ParameterValue) ParameterValue {
96+
return ParameterValue{
97+
ID: parameterValue.ID,
98+
Name: parameterValue.Name,
99+
CreatedAt: parameterValue.CreatedAt,
100+
UpdatedAt: parameterValue.UpdatedAt,
101+
Scope: parameterValue.Scope,
102+
ScopeID: parameterValue.ScopeID,
103+
SourceScheme: parameterValue.SourceScheme,
104+
DestinationScheme: parameterValue.DestinationScheme,
105+
DestinationValue: parameterValue.DestinationValue,
106+
}
107+
}

coderd/projects.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,3 +149,21 @@ func (api *api) workspacesByProject(rw http.ResponseWriter, r *http.Request) {
149149
render.Status(r, http.StatusOK)
150150
render.JSON(rw, r, apiWorkspaces)
151151
}
152+
153+
// Creates parameters for a project.
154+
// This should validate the calling user has permissions!
155+
func (api *api) postParametersByProject(rw http.ResponseWriter, r *http.Request) {
156+
project := httpmw.ProjectParam(r)
157+
158+
postParameterValueForScope(rw, r, api.Database, database.ParameterScopeProject, project.ID.String())
159+
}
160+
161+
// Lists parameters for a project.
162+
func (api *api) parametersByProject(rw http.ResponseWriter, r *http.Request) {
163+
project := httpmw.ProjectParam(r)
164+
165+
parametersForScope(rw, r, api.Database, database.GetParameterValuesByScopeParams{
166+
Scope: database.ParameterScopeProject,
167+
ScopeID: project.ID.String(),
168+
})
169+
}

coderd/projects_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,4 +92,36 @@ func TestProjects(t *testing.T) {
9292
_, err = server.Client.Project(context.Background(), user.Organization, project.Name)
9393
require.NoError(t, err)
9494
})
95+
96+
t.Run("Parameters", func(t *testing.T) {
97+
t.Parallel()
98+
server := coderdtest.New(t)
99+
user := server.RandomInitialUser(t)
100+
project, err := server.Client.CreateProject(context.Background(), user.Organization, coderd.CreateProjectRequest{
101+
Name: "someproject",
102+
Provisioner: database.ProvisionerTypeTerraform,
103+
})
104+
require.NoError(t, err)
105+
_, err = server.Client.ProjectParameters(context.Background(), user.Organization, project.Name)
106+
require.NoError(t, err)
107+
})
108+
109+
t.Run("CreateParameter", func(t *testing.T) {
110+
t.Parallel()
111+
server := coderdtest.New(t)
112+
user := server.RandomInitialUser(t)
113+
project, err := server.Client.CreateProject(context.Background(), user.Organization, coderd.CreateProjectRequest{
114+
Name: "someproject",
115+
Provisioner: database.ProvisionerTypeTerraform,
116+
})
117+
require.NoError(t, err)
118+
_, err = server.Client.CreateProjectParameter(context.Background(), user.Organization, project.Name, coderd.CreateParameterValueRequest{
119+
Name: "hi",
120+
SourceValue: "tomato",
121+
SourceScheme: database.ParameterSourceSchemeData,
122+
DestinationScheme: database.ParameterDestinationSchemeEnvironmentVariable,
123+
DestinationValue: "moo",
124+
})
125+
require.NoError(t, err)
126+
})
95127
}

codersdk/projects.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,3 +98,31 @@ func (c *Client) CreateProjectHistory(ctx context.Context, organization, project
9898
var projectVersion coderd.ProjectHistory
9999
return projectVersion, json.NewDecoder(res.Body).Decode(&projectVersion)
100100
}
101+
102+
// ProjectParameters returns parameters scoped to a project.
103+
func (c *Client) ProjectParameters(ctx context.Context, organization, project string) ([]coderd.ParameterValue, error) {
104+
res, err := c.request(ctx, http.MethodGet, fmt.Sprintf("/api/v2/projects/%s/%s/parameters", organization, project), nil)
105+
if err != nil {
106+
return nil, err
107+
}
108+
defer res.Body.Close()
109+
if res.StatusCode != http.StatusOK {
110+
return nil, readBodyAsError(res)
111+
}
112+
var params []coderd.ParameterValue
113+
return params, json.NewDecoder(res.Body).Decode(&params)
114+
}
115+
116+
// CreateProjectParameter creates a new parameter value scoped to a project.
117+
func (c *Client) CreateProjectParameter(ctx context.Context, organization, project string, req coderd.CreateParameterValueRequest) (coderd.ParameterValue, error) {
118+
res, err := c.request(ctx, http.MethodPost, fmt.Sprintf("/api/v2/projects/%s/%s/parameters", organization, project), req)
119+
if err != nil {
120+
return coderd.ParameterValue{}, err
121+
}
122+
defer res.Body.Close()
123+
if res.StatusCode != http.StatusCreated {
124+
return coderd.ParameterValue{}, readBodyAsError(res)
125+
}
126+
var param coderd.ParameterValue
127+
return param, json.NewDecoder(res.Body).Decode(&param)
128+
}

codersdk/projects_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,4 +128,39 @@ func TestProjects(t *testing.T) {
128128
_, err = server.Client.ProjectHistory(context.Background(), user.Organization, project.Name, history.Name)
129129
require.NoError(t, err)
130130
})
131+
132+
t.Run("Parameters", func(t *testing.T) {
133+
t.Parallel()
134+
server := coderdtest.New(t)
135+
user := server.RandomInitialUser(t)
136+
project, err := server.Client.CreateProject(context.Background(), user.Organization, coderd.CreateProjectRequest{
137+
Name: "someproject",
138+
Provisioner: database.ProvisionerTypeTerraform,
139+
})
140+
require.NoError(t, err)
141+
params, err := server.Client.ProjectParameters(context.Background(), user.Organization, project.Name)
142+
require.NoError(t, err)
143+
require.NotNil(t, params)
144+
require.Len(t, params, 0)
145+
})
146+
147+
t.Run("CreateParameter", func(t *testing.T) {
148+
t.Parallel()
149+
server := coderdtest.New(t)
150+
user := server.RandomInitialUser(t)
151+
project, err := server.Client.CreateProject(context.Background(), user.Organization, coderd.CreateProjectRequest{
152+
Name: "someproject",
153+
Provisioner: database.ProvisionerTypeTerraform,
154+
})
155+
require.NoError(t, err)
156+
param, err := server.Client.CreateProjectParameter(context.Background(), user.Organization, project.Name, coderd.CreateParameterValueRequest{
157+
Name: "hi",
158+
SourceValue: "tomato",
159+
SourceScheme: database.ParameterSourceSchemeData,
160+
DestinationScheme: database.ParameterDestinationSchemeEnvironmentVariable,
161+
DestinationValue: "moo",
162+
})
163+
require.NoError(t, err)
164+
require.Equal(t, "hi", param.Name)
165+
})
131166
}

provisioner/terraform/parse_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//go:build linux
22

3-
package terraform
3+
package terraform_test
44

55
import (
66
"context"
@@ -11,6 +11,7 @@ import (
1111

1212
"github.com/stretchr/testify/require"
1313

14+
"github.com/coder/coder/provisioner/terraform"
1415
"github.com/coder/coder/provisionersdk"
1516
"github.com/coder/coder/provisionersdk/proto"
1617
)
@@ -27,7 +28,7 @@ func TestParse(t *testing.T) {
2728
cancelFunc()
2829
})
2930
go func() {
30-
err := Serve(ctx, &ServeOptions{
31+
err := terraform.Serve(ctx, &terraform.ServeOptions{
3132
ServeOptions: &provisionersdk.ServeOptions{
3233
Listener: server,
3334
},

provisioner/terraform/provision_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//go:build linux
22

3-
package terraform
3+
package terraform_test
44

55
import (
66
"context"
@@ -11,6 +11,7 @@ import (
1111

1212
"github.com/stretchr/testify/require"
1313

14+
"github.com/coder/coder/provisioner/terraform"
1415
"github.com/coder/coder/provisionersdk"
1516
"github.com/coder/coder/provisionersdk/proto"
1617
)
@@ -26,7 +27,7 @@ func TestProvision(t *testing.T) {
2627
cancelFunc()
2728
})
2829
go func() {
29-
err := Serve(ctx, &ServeOptions{
30+
err := terraform.Serve(ctx, &terraform.ServeOptions{
3031
ServeOptions: &provisionersdk.ServeOptions{
3132
Listener: server,
3233
},

0 commit comments

Comments
 (0)