mirror of
https://github.com/coder/coder.git
synced 2026-10-29 17:44:33 +08:00
chore: Remove url and wildcard url from moon create (#7224)
* chore: Remove url and wildcard url from moon create
This commit is contained in:
Generated
-6
@@ -6941,12 +6941,6 @@ const docTemplate = `{
|
|||||||
},
|
},
|
||||||
"name": {
|
"name": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
|
||||||
"url": {
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"wildcard_hostname": {
|
|
||||||
"type": "string"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
Generated
-6
@@ -6182,12 +6182,6 @@
|
|||||||
},
|
},
|
||||||
"name": {
|
"name": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
|
||||||
"url": {
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"wildcard_hostname": {
|
|
||||||
"type": "string"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -5193,8 +5193,6 @@ func (q *fakeQuerier) InsertWorkspaceProxy(_ context.Context, arg database.Inser
|
|||||||
Name: arg.Name,
|
Name: arg.Name,
|
||||||
DisplayName: arg.DisplayName,
|
DisplayName: arg.DisplayName,
|
||||||
Icon: arg.Icon,
|
Icon: arg.Icon,
|
||||||
Url: arg.Url,
|
|
||||||
WildcardHostname: arg.WildcardHostname,
|
|
||||||
TokenHashedSecret: arg.TokenHashedSecret,
|
TokenHashedSecret: arg.TokenHashedSecret,
|
||||||
CreatedAt: arg.CreatedAt,
|
CreatedAt: arg.CreatedAt,
|
||||||
UpdatedAt: arg.UpdatedAt,
|
UpdatedAt: arg.UpdatedAt,
|
||||||
|
|||||||
@@ -343,19 +343,27 @@ func WorkspaceProxy(t testing.TB, db database.Store, orig database.WorkspaceProx
|
|||||||
require.NoError(t, err, "generate secret")
|
require.NoError(t, err, "generate secret")
|
||||||
hashedSecret := sha256.Sum256([]byte(secret))
|
hashedSecret := sha256.Sum256([]byte(secret))
|
||||||
|
|
||||||
resource, err := db.InsertWorkspaceProxy(context.Background(), database.InsertWorkspaceProxyParams{
|
proxy, err := db.InsertWorkspaceProxy(context.Background(), database.InsertWorkspaceProxyParams{
|
||||||
ID: takeFirst(orig.ID, uuid.New()),
|
ID: takeFirst(orig.ID, uuid.New()),
|
||||||
Name: takeFirst(orig.Name, namesgenerator.GetRandomName(1)),
|
Name: takeFirst(orig.Name, namesgenerator.GetRandomName(1)),
|
||||||
DisplayName: takeFirst(orig.DisplayName, namesgenerator.GetRandomName(1)),
|
DisplayName: takeFirst(orig.DisplayName, namesgenerator.GetRandomName(1)),
|
||||||
Icon: takeFirst(orig.Icon, namesgenerator.GetRandomName(1)),
|
Icon: takeFirst(orig.Icon, namesgenerator.GetRandomName(1)),
|
||||||
Url: takeFirst(orig.Url, fmt.Sprintf("https://%s.com", namesgenerator.GetRandomName(1))),
|
|
||||||
WildcardHostname: takeFirst(orig.WildcardHostname, fmt.Sprintf("*.%s.com", namesgenerator.GetRandomName(1))),
|
|
||||||
TokenHashedSecret: hashedSecret[:],
|
TokenHashedSecret: hashedSecret[:],
|
||||||
CreatedAt: takeFirst(orig.CreatedAt, database.Now()),
|
CreatedAt: takeFirst(orig.CreatedAt, database.Now()),
|
||||||
UpdatedAt: takeFirst(orig.UpdatedAt, database.Now()),
|
UpdatedAt: takeFirst(orig.UpdatedAt, database.Now()),
|
||||||
})
|
})
|
||||||
require.NoError(t, err, "insert proxy")
|
require.NoError(t, err, "insert proxy")
|
||||||
return resource, secret
|
|
||||||
|
// Also set these fields if the caller wants them.
|
||||||
|
if orig.Url != "" || orig.WildcardHostname != "" {
|
||||||
|
proxy, err = db.RegisterWorkspaceProxy(context.Background(), database.RegisterWorkspaceProxyParams{
|
||||||
|
Url: orig.Url,
|
||||||
|
WildcardHostname: orig.WildcardHostname,
|
||||||
|
ID: proxy.ID,
|
||||||
|
})
|
||||||
|
require.NoError(t, err, "update proxy")
|
||||||
|
}
|
||||||
|
return proxy, secret
|
||||||
}
|
}
|
||||||
|
|
||||||
func File(t testing.TB, db database.Store, orig database.File) database.File {
|
func File(t testing.TB, db database.Store, orig database.File) database.File {
|
||||||
|
|||||||
@@ -2983,18 +2983,18 @@ const insertWorkspaceProxy = `-- name: InsertWorkspaceProxy :one
|
|||||||
INSERT INTO
|
INSERT INTO
|
||||||
workspace_proxies (
|
workspace_proxies (
|
||||||
id,
|
id,
|
||||||
|
url,
|
||||||
|
wildcard_hostname,
|
||||||
name,
|
name,
|
||||||
display_name,
|
display_name,
|
||||||
icon,
|
icon,
|
||||||
url,
|
|
||||||
wildcard_hostname,
|
|
||||||
token_hashed_secret,
|
token_hashed_secret,
|
||||||
created_at,
|
created_at,
|
||||||
updated_at,
|
updated_at,
|
||||||
deleted
|
deleted
|
||||||
)
|
)
|
||||||
VALUES
|
VALUES
|
||||||
($1, $2, $3, $4, $5, $6, $7, $8, $9, false) RETURNING id, name, display_name, icon, url, wildcard_hostname, created_at, updated_at, deleted, token_hashed_secret
|
($1, '', '', $2, $3, $4, $5, $6, $7, false) RETURNING id, name, display_name, icon, url, wildcard_hostname, created_at, updated_at, deleted, token_hashed_secret
|
||||||
`
|
`
|
||||||
|
|
||||||
type InsertWorkspaceProxyParams struct {
|
type InsertWorkspaceProxyParams struct {
|
||||||
@@ -3002,8 +3002,6 @@ type InsertWorkspaceProxyParams struct {
|
|||||||
Name string `db:"name" json:"name"`
|
Name string `db:"name" json:"name"`
|
||||||
DisplayName string `db:"display_name" json:"display_name"`
|
DisplayName string `db:"display_name" json:"display_name"`
|
||||||
Icon string `db:"icon" json:"icon"`
|
Icon string `db:"icon" json:"icon"`
|
||||||
Url string `db:"url" json:"url"`
|
|
||||||
WildcardHostname string `db:"wildcard_hostname" json:"wildcard_hostname"`
|
|
||||||
TokenHashedSecret []byte `db:"token_hashed_secret" json:"token_hashed_secret"`
|
TokenHashedSecret []byte `db:"token_hashed_secret" json:"token_hashed_secret"`
|
||||||
CreatedAt time.Time `db:"created_at" json:"created_at"`
|
CreatedAt time.Time `db:"created_at" json:"created_at"`
|
||||||
UpdatedAt time.Time `db:"updated_at" json:"updated_at"`
|
UpdatedAt time.Time `db:"updated_at" json:"updated_at"`
|
||||||
@@ -3015,8 +3013,6 @@ func (q *sqlQuerier) InsertWorkspaceProxy(ctx context.Context, arg InsertWorkspa
|
|||||||
arg.Name,
|
arg.Name,
|
||||||
arg.DisplayName,
|
arg.DisplayName,
|
||||||
arg.Icon,
|
arg.Icon,
|
||||||
arg.Url,
|
|
||||||
arg.WildcardHostname,
|
|
||||||
arg.TokenHashedSecret,
|
arg.TokenHashedSecret,
|
||||||
arg.CreatedAt,
|
arg.CreatedAt,
|
||||||
arg.UpdatedAt,
|
arg.UpdatedAt,
|
||||||
|
|||||||
@@ -2,18 +2,18 @@
|
|||||||
INSERT INTO
|
INSERT INTO
|
||||||
workspace_proxies (
|
workspace_proxies (
|
||||||
id,
|
id,
|
||||||
|
url,
|
||||||
|
wildcard_hostname,
|
||||||
name,
|
name,
|
||||||
display_name,
|
display_name,
|
||||||
icon,
|
icon,
|
||||||
url,
|
|
||||||
wildcard_hostname,
|
|
||||||
token_hashed_secret,
|
token_hashed_secret,
|
||||||
created_at,
|
created_at,
|
||||||
updated_at,
|
updated_at,
|
||||||
deleted
|
deleted
|
||||||
)
|
)
|
||||||
VALUES
|
VALUES
|
||||||
($1, $2, $3, $4, $5, $6, $7, $8, $9, false) RETURNING *;
|
($1, '', '', $2, $3, $4, $5, $6, $7, false) RETURNING *;
|
||||||
|
|
||||||
-- name: RegisterWorkspaceProxy :one
|
-- name: RegisterWorkspaceProxy :one
|
||||||
UPDATE
|
UPDATE
|
||||||
|
|||||||
@@ -26,11 +26,9 @@ type WorkspaceProxy struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type CreateWorkspaceProxyRequest struct {
|
type CreateWorkspaceProxyRequest struct {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
DisplayName string `json:"display_name"`
|
DisplayName string `json:"display_name"`
|
||||||
Icon string `json:"icon"`
|
Icon string `json:"icon"`
|
||||||
URL string `json:"url"`
|
|
||||||
WildcardHostname string `json:"wildcard_hostname"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type CreateWorkspaceProxyResponse struct {
|
type CreateWorkspaceProxyResponse struct {
|
||||||
|
|||||||
@@ -1236,9 +1236,7 @@ curl -X POST http://coder-server:8080/api/v2/workspaceproxies \
|
|||||||
{
|
{
|
||||||
"display_name": "string",
|
"display_name": "string",
|
||||||
"icon": "string",
|
"icon": "string",
|
||||||
"name": "string",
|
"name": "string"
|
||||||
"url": "string",
|
|
||||||
"wildcard_hostname": "string"
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
+6
-10
@@ -1557,21 +1557,17 @@ CreateParameterRequest is a structure used to create a new parameter value for a
|
|||||||
{
|
{
|
||||||
"display_name": "string",
|
"display_name": "string",
|
||||||
"icon": "string",
|
"icon": "string",
|
||||||
"name": "string",
|
"name": "string"
|
||||||
"url": "string",
|
|
||||||
"wildcard_hostname": "string"
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Properties
|
### Properties
|
||||||
|
|
||||||
| Name | Type | Required | Restrictions | Description |
|
| Name | Type | Required | Restrictions | Description |
|
||||||
| ------------------- | ------ | -------- | ------------ | ----------- |
|
| -------------- | ------ | -------- | ------------ | ----------- |
|
||||||
| `display_name` | string | false | | |
|
| `display_name` | string | false | | |
|
||||||
| `icon` | string | false | | |
|
| `icon` | string | false | | |
|
||||||
| `name` | string | false | | |
|
| `name` | string | false | | |
|
||||||
| `url` | string | false | | |
|
|
||||||
| `wildcard_hostname` | string | false | | |
|
|
||||||
|
|
||||||
## codersdk.CreateWorkspaceRequest
|
## codersdk.CreateWorkspaceRequest
|
||||||
|
|
||||||
|
|||||||
@@ -55,13 +55,11 @@ func (r *RootCmd) deleteProxy() *clibase.Cmd {
|
|||||||
|
|
||||||
func (r *RootCmd) createProxy() *clibase.Cmd {
|
func (r *RootCmd) createProxy() *clibase.Cmd {
|
||||||
var (
|
var (
|
||||||
proxyName string
|
proxyName string
|
||||||
displayName string
|
displayName string
|
||||||
proxyIcon string
|
proxyIcon string
|
||||||
proxyURL string
|
onlyToken bool
|
||||||
proxyWildcardHostname string
|
formatter = cliui.NewOutputFormatter(
|
||||||
onlyToken bool
|
|
||||||
formatter = cliui.NewOutputFormatter(
|
|
||||||
// Text formatter should be human readable.
|
// Text formatter should be human readable.
|
||||||
cliui.ChangeFormatterData(cliui.TextFormat(), func(data any) (any, error) {
|
cliui.ChangeFormatterData(cliui.TextFormat(), func(data any) (any, error) {
|
||||||
response, ok := data.(codersdk.CreateWorkspaceProxyResponse)
|
response, ok := data.(codersdk.CreateWorkspaceProxyResponse)
|
||||||
@@ -94,11 +92,9 @@ func (r *RootCmd) createProxy() *clibase.Cmd {
|
|||||||
Handler: func(inv *clibase.Invocation) error {
|
Handler: func(inv *clibase.Invocation) error {
|
||||||
ctx := inv.Context()
|
ctx := inv.Context()
|
||||||
resp, err := client.CreateWorkspaceProxy(ctx, codersdk.CreateWorkspaceProxyRequest{
|
resp, err := client.CreateWorkspaceProxy(ctx, codersdk.CreateWorkspaceProxyRequest{
|
||||||
Name: proxyName,
|
Name: proxyName,
|
||||||
DisplayName: displayName,
|
DisplayName: displayName,
|
||||||
Icon: proxyIcon,
|
Icon: proxyIcon,
|
||||||
URL: proxyURL,
|
|
||||||
WildcardHostname: proxyWildcardHostname,
|
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("create workspace proxy: %w", err)
|
return xerrors.Errorf("create workspace proxy: %w", err)
|
||||||
@@ -136,16 +132,6 @@ func (r *RootCmd) createProxy() *clibase.Cmd {
|
|||||||
Description: "Display icon of the proxy.",
|
Description: "Display icon of the proxy.",
|
||||||
Value: clibase.StringOf(&proxyIcon),
|
Value: clibase.StringOf(&proxyIcon),
|
||||||
},
|
},
|
||||||
clibase.Option{
|
|
||||||
Flag: "access-url",
|
|
||||||
Description: "Access URL of the proxy.",
|
|
||||||
Value: clibase.StringOf(&proxyURL),
|
|
||||||
},
|
|
||||||
clibase.Option{
|
|
||||||
Flag: "wildcard-access-url",
|
|
||||||
Description: "(Optional) Access url of the proxy for subdomain based apps.",
|
|
||||||
Value: clibase.StringOf(&proxyWildcardHostname),
|
|
||||||
},
|
|
||||||
clibase.Option{
|
clibase.Option{
|
||||||
Flag: "only-token",
|
Flag: "only-token",
|
||||||
Description: "Only print the token. This is useful for scripting.",
|
Description: "Only print the token. This is useful for scripting.",
|
||||||
|
|||||||
@@ -49,7 +49,6 @@ func Test_ProxyCRUD(t *testing.T) {
|
|||||||
"--name", expectedName,
|
"--name", expectedName,
|
||||||
"--display-name", "Test Proxy",
|
"--display-name", "Test Proxy",
|
||||||
"--icon", "/emojis/1f4bb.png",
|
"--icon", "/emojis/1f4bb.png",
|
||||||
"--access-url", "http://localhost:3010",
|
|
||||||
"--only-token",
|
"--only-token",
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -99,7 +98,6 @@ func Test_ProxyCRUD(t *testing.T) {
|
|||||||
Name: expectedName,
|
Name: expectedName,
|
||||||
DisplayName: "Test Proxy",
|
DisplayName: "Test Proxy",
|
||||||
Icon: "/emojis/us.png",
|
Icon: "/emojis/us.png",
|
||||||
URL: "http://localhost:3010",
|
|
||||||
})
|
})
|
||||||
require.NoError(t, err, "failed to create workspace proxy")
|
require.NoError(t, err, "failed to create workspace proxy")
|
||||||
|
|
||||||
|
|||||||
@@ -108,10 +108,8 @@ func NewWorkspaceProxy(t *testing.T, coderdAPI *coderd.API, owner *codersdk.Clie
|
|||||||
}
|
}
|
||||||
|
|
||||||
proxyRes, err := owner.CreateWorkspaceProxy(ctx, codersdk.CreateWorkspaceProxyRequest{
|
proxyRes, err := owner.CreateWorkspaceProxy(ctx, codersdk.CreateWorkspaceProxyRequest{
|
||||||
Name: options.Name,
|
Name: options.Name,
|
||||||
Icon: "/emojis/flag.png",
|
Icon: "/emojis/flag.png",
|
||||||
URL: accessURL.String(),
|
|
||||||
WildcardHostname: options.AppHostname,
|
|
||||||
})
|
})
|
||||||
require.NoError(t, err, "failed to create workspace proxy")
|
require.NoError(t, err, "failed to create workspace proxy")
|
||||||
|
|
||||||
|
|||||||
@@ -91,24 +91,6 @@ func (api *API) postWorkspaceProxy(rw http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := validateProxyURL(req.URL); err != nil {
|
|
||||||
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
|
|
||||||
Message: "URL is invalid.",
|
|
||||||
Detail: err.Error(),
|
|
||||||
})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if req.WildcardHostname != "" {
|
|
||||||
if _, err := httpapi.CompileHostnamePattern(req.WildcardHostname); err != nil {
|
|
||||||
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
|
|
||||||
Message: "Wildcard URL is invalid.",
|
|
||||||
Detail: err.Error(),
|
|
||||||
})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
id := uuid.New()
|
id := uuid.New()
|
||||||
secret, err := cryptorand.HexString(64)
|
secret, err := cryptorand.HexString(64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -123,8 +105,6 @@ func (api *API) postWorkspaceProxy(rw http.ResponseWriter, r *http.Request) {
|
|||||||
Name: req.Name,
|
Name: req.Name,
|
||||||
DisplayName: req.DisplayName,
|
DisplayName: req.DisplayName,
|
||||||
Icon: req.Icon,
|
Icon: req.Icon,
|
||||||
Url: req.URL,
|
|
||||||
WildcardHostname: req.WildcardHostname,
|
|
||||||
TokenHashedSecret: hashedSecret[:],
|
TokenHashedSecret: hashedSecret[:],
|
||||||
CreatedAt: database.Now(),
|
CreatedAt: database.Now(),
|
||||||
UpdatedAt: database.Now(),
|
UpdatedAt: database.Now(),
|
||||||
|
|||||||
@@ -52,10 +52,8 @@ func TestWorkspaceProxyCRUD(t *testing.T) {
|
|||||||
})
|
})
|
||||||
ctx := testutil.Context(t, testutil.WaitLong)
|
ctx := testutil.Context(t, testutil.WaitLong)
|
||||||
proxyRes, err := client.CreateWorkspaceProxy(ctx, codersdk.CreateWorkspaceProxyRequest{
|
proxyRes, err := client.CreateWorkspaceProxy(ctx, codersdk.CreateWorkspaceProxyRequest{
|
||||||
Name: namesgenerator.GetRandomName(1),
|
Name: namesgenerator.GetRandomName(1),
|
||||||
Icon: "/emojis/flag.png",
|
Icon: "/emojis/flag.png",
|
||||||
URL: "https://" + namesgenerator.GetRandomName(1) + ".com",
|
|
||||||
WildcardHostname: "*.sub.example.com",
|
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
@@ -87,10 +85,8 @@ func TestWorkspaceProxyCRUD(t *testing.T) {
|
|||||||
})
|
})
|
||||||
ctx := testutil.Context(t, testutil.WaitLong)
|
ctx := testutil.Context(t, testutil.WaitLong)
|
||||||
proxyRes, err := client.CreateWorkspaceProxy(ctx, codersdk.CreateWorkspaceProxyRequest{
|
proxyRes, err := client.CreateWorkspaceProxy(ctx, codersdk.CreateWorkspaceProxyRequest{
|
||||||
Name: namesgenerator.GetRandomName(1),
|
Name: namesgenerator.GetRandomName(1),
|
||||||
Icon: "/emojis/flag.png",
|
Icon: "/emojis/flag.png",
|
||||||
URL: "https://" + namesgenerator.GetRandomName(1) + ".com",
|
|
||||||
WildcardHostname: "*.sub.example.com",
|
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
@@ -156,10 +152,8 @@ func TestIssueSignedAppToken(t *testing.T) {
|
|||||||
|
|
||||||
createProxyCtx := testutil.Context(t, testutil.WaitLong)
|
createProxyCtx := testutil.Context(t, testutil.WaitLong)
|
||||||
proxyRes, err := client.CreateWorkspaceProxy(createProxyCtx, codersdk.CreateWorkspaceProxyRequest{
|
proxyRes, err := client.CreateWorkspaceProxy(createProxyCtx, codersdk.CreateWorkspaceProxyRequest{
|
||||||
Name: namesgenerator.GetRandomName(1),
|
Name: namesgenerator.GetRandomName(1),
|
||||||
Icon: "/emojis/flag.png",
|
Icon: "/emojis/flag.png",
|
||||||
URL: "https://" + namesgenerator.GetRandomName(1) + ".com",
|
|
||||||
WildcardHostname: "*.sub.example.com",
|
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -183,7 +183,7 @@ fatal() {
|
|||||||
# Attempt to delete the proxy first, in case it already exists.
|
# Attempt to delete the proxy first, in case it already exists.
|
||||||
"${CODER_DEV_SHIM}" proxy delete local-proxy || true
|
"${CODER_DEV_SHIM}" proxy delete local-proxy || true
|
||||||
# Create the proxy
|
# Create the proxy
|
||||||
proxy_session_token=$("${CODER_DEV_SHIM}" proxy create --name=local-proxy --display-name="Local Proxy" --icon="/emojis/1f4bb.png" --access-url=http://localhost:3010 --only-token)
|
proxy_session_token=$("${CODER_DEV_SHIM}" proxy create --name=local-proxy --display-name="Local Proxy" --icon="/emojis/1f4bb.png" --only-token)
|
||||||
# Start the proxy
|
# Start the proxy
|
||||||
start_cmd PROXY "" "${CODER_DEV_SHIM}" proxy server --http-address=localhost:3010 --proxy-session-token="${proxy_session_token}" --primary-access-url=http://localhost:3000
|
start_cmd PROXY "" "${CODER_DEV_SHIM}" proxy server --http-address=localhost:3010 --proxy-session-token="${proxy_session_token}" --primary-access-url=http://localhost:3000
|
||||||
) || echo "Failed to create workspace proxy. No workspace proxy created."
|
) || echo "Failed to create workspace proxy. No workspace proxy created."
|
||||||
|
|||||||
@@ -260,8 +260,6 @@ export interface CreateWorkspaceProxyRequest {
|
|||||||
readonly name: string
|
readonly name: string
|
||||||
readonly display_name: string
|
readonly display_name: string
|
||||||
readonly icon: string
|
readonly icon: string
|
||||||
readonly url: string
|
|
||||||
readonly wildcard_hostname: string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// From codersdk/workspaceproxy.go
|
// From codersdk/workspaceproxy.go
|
||||||
|
|||||||
Reference in New Issue
Block a user