chore: Force codersdk to not import anything from database (#1576)

* chore: Force codersdk to not import anything from database (linter rule)
* chore: Move all database types in codersdk out
This commit is contained in:
Steven Masley
2022-05-19 13:04:44 -05:00
committed by GitHub
parent a0834404f7
commit 6c1117094d
41 changed files with 384 additions and 299 deletions
+1 -1
View File
@@ -103,7 +103,7 @@ linters-settings:
settings:
ruleguard:
failOn: all
rules: rules.go
rules: '${configDir}/scripts/rules.go'
staticcheck:
# https://staticcheck.io/docs/options#checks
+4 -5
View File
@@ -12,7 +12,6 @@ import (
"github.com/google/uuid"
"golang.org/x/xerrors"
"github.com/coder/coder/coderd/database"
"github.com/coder/coder/codersdk"
)
@@ -165,16 +164,16 @@ func ProvisionerJob(ctx context.Context, writer io.Writer, opts ProvisionerJobOp
}
output := ""
switch log.Level {
case database.LogLevelTrace, database.LogLevelDebug:
case codersdk.LogLevelTrace, codersdk.LogLevelDebug:
if !opts.Verbose {
continue
}
output = Styles.Placeholder.Render(log.Output)
case database.LogLevelError:
case codersdk.LogLevelError:
output = defaultStyles.Error.Render(log.Output)
case database.LogLevelWarn:
case codersdk.LogLevelWarn:
output = Styles.Warn.Render(log.Output)
case database.LogLevelInfo:
case codersdk.LogLevelInfo:
output = log.Output
}
jobMutex.Lock()
+1 -1
View File
@@ -41,7 +41,7 @@ func WorkspaceResources(writer io.Writer, resources []codersdk.WorkspaceResource
// Address on stop indexes whether a resource still exists when in the stopped transition.
addressOnStop := map[string]codersdk.WorkspaceResource{}
for _, resource := range resources {
if resource.Transition != database.WorkspaceTransitionStop {
if resource.Transition != codersdk.WorkspaceTransitionStop {
continue
}
addressOnStop[resource.Type+"."+resource.Name] = resource
+5 -5
View File
@@ -22,7 +22,7 @@ func TestWorkspaceResources(t *testing.T) {
err := cliui.WorkspaceResources(ptty.Output(), []codersdk.WorkspaceResource{{
Type: "google_compute_instance",
Name: "dev",
Transition: database.WorkspaceTransitionStart,
Transition: codersdk.WorkspaceTransitionStart,
Agents: []codersdk.WorkspaceAgent{{
Name: "dev",
Status: codersdk.WorkspaceAgentConnected,
@@ -46,15 +46,15 @@ func TestWorkspaceResources(t *testing.T) {
done := make(chan struct{})
go func() {
err := cliui.WorkspaceResources(ptty.Output(), []codersdk.WorkspaceResource{{
Transition: database.WorkspaceTransitionStart,
Transition: codersdk.WorkspaceTransitionStart,
Type: "google_compute_disk",
Name: "root",
}, {
Transition: database.WorkspaceTransitionStop,
Transition: codersdk.WorkspaceTransitionStop,
Type: "google_compute_disk",
Name: "root",
}, {
Transition: database.WorkspaceTransitionStart,
Transition: codersdk.WorkspaceTransitionStart,
Type: "google_compute_instance",
Name: "dev",
Agents: []codersdk.WorkspaceAgent{{
@@ -65,7 +65,7 @@ func TestWorkspaceResources(t *testing.T) {
Architecture: "amd64",
}},
}, {
Transition: database.WorkspaceTransitionStart,
Transition: codersdk.WorkspaceTransitionStart,
Type: "kubernetes_pod",
Name: "dev",
Agents: []codersdk.WorkspaceAgent{{
+1 -2
View File
@@ -15,7 +15,6 @@ import (
"github.com/coder/coder/cli/cliflag"
"github.com/coder/coder/cli/cliui"
"github.com/coder/coder/coderd/database"
"github.com/coder/coder/codersdk"
)
@@ -86,7 +85,7 @@ func configSSH() *cobra.Command {
return err
}
for _, resource := range resources {
if resource.Transition != database.WorkspaceTransitionStart {
if resource.Transition != codersdk.WorkspaceTransitionStart {
continue
}
for _, agent := range resource.Agents {
+2 -3
View File
@@ -10,7 +10,6 @@ import (
"github.com/coder/coder/cli/cliflag"
"github.com/coder/coder/cli/cliui"
"github.com/coder/coder/coderd/database"
"github.com/coder/coder/codersdk"
)
@@ -134,8 +133,8 @@ func create() *cobra.Command {
parameters = append(parameters, codersdk.CreateParameterRequest{
Name: parameterSchema.Name,
SourceValue: value,
SourceScheme: database.ParameterSourceSchemeData,
DestinationScheme: database.ParameterDestinationScheme(parameterSchema.DefaultDestinationScheme),
SourceScheme: codersdk.ParameterSourceSchemeData,
DestinationScheme: parameterSchema.DefaultDestinationScheme,
})
}
_, _ = fmt.Fprintln(cmd.OutOrStdout())
+1 -2
View File
@@ -6,7 +6,6 @@ import (
"github.com/spf13/cobra"
"github.com/coder/coder/cli/cliui"
"github.com/coder/coder/coderd/database"
"github.com/coder/coder/codersdk"
)
@@ -33,7 +32,7 @@ func delete() *cobra.Command {
}
before := time.Now()
build, err := client.CreateWorkspaceBuild(cmd.Context(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{
Transition: database.WorkspaceTransitionDelete,
Transition: codersdk.WorkspaceTransitionDelete,
})
if err != nil {
return err
+3 -4
View File
@@ -11,7 +11,6 @@ import (
"github.com/coder/coder/cli/cliui"
"github.com/coder/coder/coderd/autobuild/schedule"
"github.com/coder/coder/coderd/database"
"github.com/coder/coder/codersdk"
)
@@ -66,17 +65,17 @@ func list() *cobra.Command {
}
switch workspace.LatestBuild.Transition {
case database.WorkspaceTransitionStart:
case codersdk.WorkspaceTransitionStart:
status = "Running"
if inProgress {
status = "Starting"
}
case database.WorkspaceTransitionStop:
case codersdk.WorkspaceTransitionStop:
status = "Stopped"
if inProgress {
status = "Stopping"
}
case database.WorkspaceTransitionDelete:
case codersdk.WorkspaceTransitionDelete:
status = "Deleted"
if inProgress {
status = "Deleting"
+1 -2
View File
@@ -18,7 +18,6 @@ import (
coderagent "github.com/coder/coder/agent"
"github.com/coder/coder/cli/cliui"
"github.com/coder/coder/coderd/database"
"github.com/coder/coder/codersdk"
)
@@ -80,7 +79,7 @@ func portForward() *cobra.Command {
if err != nil {
return err
}
if workspace.LatestBuild.Transition != database.WorkspaceTransitionStart {
if workspace.LatestBuild.Transition != codersdk.WorkspaceTransitionStart {
return xerrors.New("workspace must be in start transition to port-forward")
}
if workspace.LatestBuild.Job.CompletedAt == nil {
+1 -1
View File
@@ -395,7 +395,7 @@ func server() *cobra.Command {
for _, workspace := range workspaces {
before := time.Now()
build, err := client.CreateWorkspaceBuild(cmd.Context(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{
Transition: database.WorkspaceTransitionDelete,
Transition: codersdk.WorkspaceTransitionDelete,
})
if err != nil {
return xerrors.Errorf("delete workspace: %w", err)
+2 -3
View File
@@ -22,7 +22,6 @@ import (
"github.com/coder/coder/cli/cliui"
"github.com/coder/coder/coderd/autobuild/notify"
"github.com/coder/coder/coderd/autobuild/schedule"
"github.com/coder/coder/coderd/database"
"github.com/coder/coder/codersdk"
"github.com/coder/coder/cryptorand"
)
@@ -193,7 +192,7 @@ func getWorkspaceAndAgent(cmd *cobra.Command, client *codersdk.Client, orgID uui
}
}
if workspace.LatestBuild.Transition != database.WorkspaceTransitionStart {
if workspace.LatestBuild.Transition != codersdk.WorkspaceTransitionStart {
return codersdk.Workspace{}, codersdk.WorkspaceAgent{}, xerrors.New("workspace must be in start transition to ssh")
}
if workspace.LatestBuild.Job.CompletedAt == nil {
@@ -202,7 +201,7 @@ func getWorkspaceAndAgent(cmd *cobra.Command, client *codersdk.Client, orgID uui
return codersdk.Workspace{}, codersdk.WorkspaceAgent{}, err
}
}
if workspace.LatestBuild.Transition == database.WorkspaceTransitionDelete {
if workspace.LatestBuild.Transition == codersdk.WorkspaceTransitionDelete {
return codersdk.Workspace{}, codersdk.WorkspaceAgent{}, xerrors.Errorf("workspace %q is being deleted", workspace.Name)
}
+1 -2
View File
@@ -6,7 +6,6 @@ import (
"github.com/spf13/cobra"
"github.com/coder/coder/cli/cliui"
"github.com/coder/coder/coderd/database"
"github.com/coder/coder/codersdk"
)
@@ -31,7 +30,7 @@ func start() *cobra.Command {
}
before := time.Now()
build, err := client.CreateWorkspaceBuild(cmd.Context(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{
Transition: database.WorkspaceTransitionStart,
Transition: codersdk.WorkspaceTransitionStart,
})
if err != nil {
return err
+1 -2
View File
@@ -6,7 +6,6 @@ import (
"github.com/spf13/cobra"
"github.com/coder/coder/cli/cliui"
"github.com/coder/coder/coderd/database"
"github.com/coder/coder/codersdk"
)
@@ -31,7 +30,7 @@ func stop() *cobra.Command {
}
before := time.Now()
build, err := client.CreateWorkspaceBuild(cmd.Context(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{
Transition: database.WorkspaceTransitionStop,
Transition: codersdk.WorkspaceTransitionStop,
})
if err != nil {
return err
+4 -4
View File
@@ -128,9 +128,9 @@ func templateCreate() *cobra.Command {
func createValidTemplateVersion(cmd *cobra.Command, client *codersdk.Client, organization codersdk.Organization, provisioner database.ProvisionerType, hash string, parameters ...codersdk.CreateParameterRequest) (*codersdk.TemplateVersion, []codersdk.CreateParameterRequest, error) {
before := time.Now()
version, err := client.CreateTemplateVersion(cmd.Context(), organization.ID, codersdk.CreateTemplateVersionRequest{
StorageMethod: database.ProvisionerStorageMethodFile,
StorageMethod: codersdk.ProvisionerStorageMethodFile,
StorageSource: hash,
Provisioner: provisioner,
Provisioner: codersdk.ProvisionerType(provisioner),
ParameterValues: parameters,
})
if err != nil {
@@ -192,8 +192,8 @@ func createValidTemplateVersion(cmd *cobra.Command, client *codersdk.Client, org
parameters = append(parameters, codersdk.CreateParameterRequest{
Name: parameterSchema.Name,
SourceValue: value,
SourceScheme: database.ParameterSourceSchemeData,
DestinationScheme: database.ParameterDestinationScheme(parameterSchema.DefaultDestinationScheme),
SourceScheme: codersdk.ParameterSourceSchemeData,
DestinationScheme: parameterSchema.DefaultDestinationScheme,
})
_, _ = fmt.Fprintln(cmd.OutOrStdout())
}
+2 -3
View File
@@ -10,7 +10,6 @@ import (
"golang.org/x/xerrors"
"github.com/coder/coder/cli/cliui"
"github.com/coder/coder/coderd/database"
"github.com/coder/coder/codersdk"
"github.com/coder/coder/provisionersdk"
)
@@ -68,9 +67,9 @@ func templateUpdate() *cobra.Command {
before := time.Now()
templateVersion, err := client.CreateTemplateVersion(cmd.Context(), organization.ID, codersdk.CreateTemplateVersionRequest{
TemplateID: template.ID,
StorageMethod: database.ProvisionerStorageMethodFile,
StorageMethod: codersdk.ProvisionerStorageMethodFile,
StorageSource: resp.Hash,
Provisioner: database.ProvisionerType(provisioner),
Provisioner: codersdk.ProvisionerType(provisioner),
})
if err != nil {
return err
+6 -6
View File
@@ -118,7 +118,7 @@ func main() {
log := codersdk.ProvisionerJobLog{
CreatedAt: time.Now(),
Output: fmt.Sprintf("Some log %d", count),
Level: database.LogLevelInfo,
Level: codersdk.LogLevelInfo,
}
switch {
case count == 10:
@@ -133,7 +133,7 @@ func main() {
log.Stage = "Cleaning Up"
}
if count%5 == 0 {
log.Level = database.LogLevelWarn
log.Level = codersdk.LogLevelWarn
}
count++
if log.Output == "" && log.Stage == "" {
@@ -188,15 +188,15 @@ func main() {
RunE: func(cmd *cobra.Command, args []string) error {
disconnected := database.Now().Add(-4 * time.Second)
return cliui.WorkspaceResources(cmd.OutOrStdout(), []codersdk.WorkspaceResource{{
Transition: database.WorkspaceTransitionStart,
Transition: codersdk.WorkspaceTransitionStart,
Type: "google_compute_disk",
Name: "root",
}, {
Transition: database.WorkspaceTransitionStop,
Transition: codersdk.WorkspaceTransitionStop,
Type: "google_compute_disk",
Name: "root",
}, {
Transition: database.WorkspaceTransitionStart,
Transition: codersdk.WorkspaceTransitionStart,
Type: "google_compute_instance",
Name: "dev",
Agents: []codersdk.WorkspaceAgent{{
@@ -207,7 +207,7 @@ func main() {
Architecture: "amd64",
}},
}, {
Transition: database.WorkspaceTransitionStart,
Transition: codersdk.WorkspaceTransitionStart,
Type: "kubernetes_pod",
Name: "dev",
Agents: []codersdk.WorkspaceAgent{{
@@ -56,7 +56,7 @@ func TestExecutorAutostartOK(t *testing.T) {
ws := mustWorkspace(t, client, workspace.ID)
require.NotEqual(t, workspace.LatestBuild.ID, ws.LatestBuild.ID, "expected a workspace build to occur")
require.Equal(t, codersdk.ProvisionerJobSucceeded, ws.LatestBuild.Job.Status, "expected provisioner job to have succeeded")
require.Equal(t, database.WorkspaceTransitionStart, ws.LatestBuild.Transition, "expected latest transition to be start")
require.Equal(t, codersdk.WorkspaceTransitionStart, ws.LatestBuild.Transition, "expected latest transition to be start")
}
func TestExecutorAutostartTemplateUpdated(t *testing.T) {
@@ -107,7 +107,7 @@ func TestExecutorAutostartTemplateUpdated(t *testing.T) {
ws := mustWorkspace(t, client, workspace.ID)
require.NotEqual(t, workspace.LatestBuild.ID, ws.LatestBuild.ID, "expected a workspace build to occur")
require.Equal(t, codersdk.ProvisionerJobSucceeded, ws.LatestBuild.Job.Status, "expected provisioner job to have succeeded")
require.Equal(t, database.WorkspaceTransitionStart, ws.LatestBuild.Transition, "expected latest transition to be start")
require.Equal(t, codersdk.WorkspaceTransitionStart, ws.LatestBuild.Transition, "expected latest transition to be start")
require.Equal(t, workspace.LatestBuild.TemplateVersionID, ws.LatestBuild.TemplateVersionID, "expected workspace build to be using the old template version")
}
@@ -126,7 +126,7 @@ func TestExecutorAutostartAlreadyRunning(t *testing.T) {
)
// Given: we ensure the workspace is running
require.Equal(t, database.WorkspaceTransitionStart, workspace.LatestBuild.Transition)
require.Equal(t, codersdk.WorkspaceTransitionStart, workspace.LatestBuild.Transition)
// Given: the workspace initially has autostart disabled
require.Empty(t, workspace.AutostartSchedule)
@@ -148,7 +148,7 @@ func TestExecutorAutostartAlreadyRunning(t *testing.T) {
<-time.After(5 * time.Second)
ws := mustWorkspace(t, client, workspace.ID)
require.Equal(t, workspace.LatestBuild.ID, ws.LatestBuild.ID, "expected no further workspace builds to occur")
require.Equal(t, database.WorkspaceTransitionStart, ws.LatestBuild.Transition, "expected workspace to be running")
require.Equal(t, codersdk.WorkspaceTransitionStart, ws.LatestBuild.Transition, "expected workspace to be running")
}
func TestExecutorAutostartNotEnabled(t *testing.T) {
@@ -196,7 +196,7 @@ func TestExecutorAutostopOK(t *testing.T) {
workspace = mustProvisionWorkspace(t, client)
)
// Given: workspace is running
require.Equal(t, database.WorkspaceTransitionStart, workspace.LatestBuild.Transition)
require.Equal(t, codersdk.WorkspaceTransitionStart, workspace.LatestBuild.Transition)
// Given: the workspace initially has autostop disabled
require.Empty(t, workspace.AutostopSchedule)
@@ -219,7 +219,7 @@ func TestExecutorAutostopOK(t *testing.T) {
ws := mustWorkspace(t, client, workspace.ID)
require.NotEqual(t, workspace.LatestBuild.ID, ws.LatestBuild.ID, "expected a workspace build to occur")
require.Equal(t, codersdk.ProvisionerJobSucceeded, ws.LatestBuild.Job.Status, "expected provisioner job to have succeeded")
require.Equal(t, database.WorkspaceTransitionStop, ws.LatestBuild.Transition, "expected workspace not to be running")
require.Equal(t, codersdk.WorkspaceTransitionStop, ws.LatestBuild.Transition, "expected workspace not to be running")
}
func TestExecutorAutostopAlreadyStopped(t *testing.T) {
@@ -259,7 +259,7 @@ func TestExecutorAutostopAlreadyStopped(t *testing.T) {
<-time.After(5 * time.Second)
ws := mustWorkspace(t, client, workspace.ID)
require.Equal(t, workspace.LatestBuild.ID, ws.LatestBuild.ID, "expected no further workspace builds to occur")
require.Equal(t, database.WorkspaceTransitionStop, ws.LatestBuild.Transition, "expected workspace not to be running")
require.Equal(t, codersdk.WorkspaceTransitionStop, ws.LatestBuild.Transition, "expected workspace not to be running")
}
func TestExecutorAutostopNotEnabled(t *testing.T) {
@@ -275,7 +275,7 @@ func TestExecutorAutostopNotEnabled(t *testing.T) {
)
// Given: workspace is running
require.Equal(t, database.WorkspaceTransitionStart, workspace.LatestBuild.Transition)
require.Equal(t, codersdk.WorkspaceTransitionStart, workspace.LatestBuild.Transition)
// Given: the workspace has autostop disabled
require.Empty(t, workspace.AutostopSchedule)
@@ -290,7 +290,7 @@ func TestExecutorAutostopNotEnabled(t *testing.T) {
<-time.After(5 * time.Second)
ws := mustWorkspace(t, client, workspace.ID)
require.Equal(t, workspace.LatestBuild.ID, ws.LatestBuild.ID, "expected no further workspace builds to occur")
require.Equal(t, database.WorkspaceTransitionStart, ws.LatestBuild.Transition, "expected workspace to be running")
require.Equal(t, codersdk.WorkspaceTransitionStart, ws.LatestBuild.Transition, "expected workspace to be running")
}
func TestExecutorWorkspaceDeleted(t *testing.T) {
@@ -330,7 +330,7 @@ func TestExecutorWorkspaceDeleted(t *testing.T) {
<-time.After(5 * time.Second)
ws := mustWorkspace(t, client, workspace.ID)
require.Equal(t, workspace.LatestBuild.ID, ws.LatestBuild.ID, "expected no further workspace builds to occur")
require.Equal(t, database.WorkspaceTransitionDelete, ws.LatestBuild.Transition, "expected workspace to be deleted")
require.Equal(t, codersdk.WorkspaceTransitionDelete, ws.LatestBuild.Transition, "expected workspace to be deleted")
}
func TestExecutorWorkspaceTooEarly(t *testing.T) {
@@ -369,7 +369,7 @@ func TestExecutorWorkspaceTooEarly(t *testing.T) {
<-time.After(5 * time.Second)
ws := mustWorkspace(t, client, workspace.ID)
require.Equal(t, workspace.LatestBuild.ID, ws.LatestBuild.ID, "expected no further workspace builds to occur")
require.Equal(t, database.WorkspaceTransitionStart, ws.LatestBuild.Transition, "expected workspace to be running")
require.Equal(t, codersdk.WorkspaceTransitionStart, ws.LatestBuild.Transition, "expected workspace to be running")
}
func TestExecutorAutostartMultipleOK(t *testing.T) {
@@ -419,13 +419,13 @@ func TestExecutorAutostartMultipleOK(t *testing.T) {
ws := mustWorkspace(t, client, workspace.ID)
require.NotEqual(t, workspace.LatestBuild.ID, ws.LatestBuild.ID, "expected a workspace build to occur")
require.Equal(t, codersdk.ProvisionerJobSucceeded, ws.LatestBuild.Job.Status, "expected provisioner job to have succeeded")
require.Equal(t, database.WorkspaceTransitionStart, ws.LatestBuild.Transition, "expected latest transition to be start")
require.Equal(t, codersdk.WorkspaceTransitionStart, ws.LatestBuild.Transition, "expected latest transition to be start")
builds, err := client.WorkspaceBuilds(ctx, codersdk.WorkspaceBuildsRequest{WorkspaceID: ws.ID})
require.NoError(t, err, "fetch list of workspace builds from primary")
// One build to start, one stop transition, and one autostart. No more.
require.Equal(t, database.WorkspaceTransitionStart, builds[0].Transition)
require.Equal(t, database.WorkspaceTransitionStop, builds[1].Transition)
require.Equal(t, database.WorkspaceTransitionStart, builds[2].Transition)
require.Equal(t, codersdk.WorkspaceTransitionStart, builds[0].Transition)
require.Equal(t, codersdk.WorkspaceTransitionStop, builds[1].Transition)
require.Equal(t, codersdk.WorkspaceTransitionStart, builds[2].Transition)
require.Len(t, builds, 3, "unexpected number of builds for workspace from primary")
// Builds are returned most recent first.
@@ -450,21 +450,21 @@ func mustTransitionWorkspace(t *testing.T, client *codersdk.Client, workspaceID
ctx := context.Background()
workspace, err := client.Workspace(ctx, workspaceID)
require.NoError(t, err, "unexpected error fetching workspace")
require.Equal(t, workspace.LatestBuild.Transition, from, "expected workspace state: %s got: %s", from, workspace.LatestBuild.Transition)
require.Equal(t, workspace.LatestBuild.Transition, codersdk.WorkspaceTransition(from), "expected workspace state: %s got: %s", from, workspace.LatestBuild.Transition)
template, err := client.Template(ctx, workspace.TemplateID)
require.NoError(t, err, "fetch workspace template")
build, err := client.CreateWorkspaceBuild(ctx, workspace.ID, codersdk.CreateWorkspaceBuildRequest{
TemplateVersionID: template.ActiveVersionID,
Transition: to,
Transition: codersdk.WorkspaceTransition(to),
})
require.NoError(t, err, "unexpected error transitioning workspace to %s", to)
_ = coderdtest.AwaitWorkspaceBuildJob(t, client, build.ID)
updated := mustWorkspace(t, client, workspace.ID)
require.Equal(t, to, updated.LatestBuild.Transition, "expected workspace to be in state %s but got %s", to, updated.LatestBuild.Transition)
require.Equal(t, codersdk.WorkspaceTransition(to), updated.LatestBuild.Transition, "expected workspace to be in state %s but got %s", to, updated.LatestBuild.Transition)
return updated
}
+3
View File
@@ -325,6 +325,9 @@ func New(options *Options) (http.Handler, func()) {
r.Get("/state", api.workspaceBuildState)
})
})
var _ = xerrors.New("test")
r.NotFound(site.DefaultHandler().ServeHTTP)
return r, func() {
api.websocketWaitMutex.Lock()
+5 -5
View File
@@ -288,8 +288,8 @@ func CreateTemplateVersion(t *testing.T, client *codersdk.Client, organizationID
require.NoError(t, err)
templateVersion, err := client.CreateTemplateVersion(context.Background(), organizationID, codersdk.CreateTemplateVersionRequest{
StorageSource: file.Hash,
StorageMethod: database.ProvisionerStorageMethodFile,
Provisioner: database.ProvisionerTypeEcho,
StorageMethod: codersdk.ProvisionerStorageMethodFile,
Provisioner: codersdk.ProvisionerTypeEcho,
})
require.NoError(t, err)
return templateVersion
@@ -302,7 +302,7 @@ func CreateWorkspaceBuild(
workspace codersdk.Workspace,
transition database.WorkspaceTransition) codersdk.WorkspaceBuild {
req := codersdk.CreateWorkspaceBuildRequest{
Transition: transition,
Transition: codersdk.WorkspaceTransition(transition),
}
build, err := client.CreateWorkspaceBuild(context.Background(), workspace.ID, req)
require.NoError(t, err)
@@ -331,8 +331,8 @@ func UpdateTemplateVersion(t *testing.T, client *codersdk.Client, organizationID
templateVersion, err := client.CreateTemplateVersion(context.Background(), organizationID, codersdk.CreateTemplateVersionRequest{
TemplateID: templateID,
StorageSource: file.Hash,
StorageMethod: database.ProvisionerStorageMethodFile,
Provisioner: database.ProvisionerTypeEcho,
StorageMethod: codersdk.ProvisionerStorageMethodFile,
Provisioner: codersdk.ProvisionerTypeEcho,
})
require.NoError(t, err)
return templateVersion
+6 -6
View File
@@ -49,9 +49,9 @@ func (api *api) postParameter(rw http.ResponseWriter, r *http.Request) {
UpdatedAt: database.Now(),
Scope: scope,
ScopeID: scopeID,
SourceScheme: createRequest.SourceScheme,
SourceScheme: database.ParameterSourceScheme(createRequest.SourceScheme),
SourceValue: createRequest.SourceValue,
DestinationScheme: createRequest.DestinationScheme,
DestinationScheme: database.ParameterDestinationScheme(createRequest.DestinationScheme),
})
if err != nil {
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
@@ -140,10 +140,10 @@ func convertParameterSchema(parameterSchema database.ParameterSchema) (codersdk.
JobID: parameterSchema.JobID,
Name: parameterSchema.Name,
Description: parameterSchema.Description,
DefaultSourceScheme: string(parameterSchema.DefaultSourceScheme),
DefaultSourceScheme: codersdk.ParameterSourceScheme(parameterSchema.DefaultSourceScheme),
DefaultSourceValue: parameterSchema.DefaultSourceValue,
AllowOverrideSource: parameterSchema.AllowOverrideSource,
DefaultDestinationScheme: string(parameterSchema.DefaultDestinationScheme),
DefaultDestinationScheme: codersdk.ParameterDestinationScheme(parameterSchema.DefaultDestinationScheme),
AllowOverrideDestination: parameterSchema.AllowOverrideDestination,
DefaultRefresh: parameterSchema.DefaultRefresh,
RedisplayValue: parameterSchema.RedisplayValue,
@@ -163,8 +163,8 @@ func convertParameterValue(parameterValue database.ParameterValue) codersdk.Para
Scope: codersdk.ParameterScope(parameterValue.Scope),
ScopeID: parameterValue.ScopeID,
Name: parameterValue.Name,
SourceScheme: parameterValue.SourceScheme,
DestinationScheme: parameterValue.DestinationScheme,
SourceScheme: codersdk.ParameterSourceScheme(parameterValue.SourceScheme),
DestinationScheme: codersdk.ParameterDestinationScheme(parameterValue.DestinationScheme),
}
}
+12 -13
View File
@@ -8,7 +8,6 @@ import (
"github.com/stretchr/testify/require"
"github.com/coder/coder/coderd/coderdtest"
"github.com/coder/coder/coderd/database"
"github.com/coder/coder/codersdk"
)
@@ -21,8 +20,8 @@ func TestPostParameter(t *testing.T) {
_, err := client.CreateParameter(context.Background(), codersdk.ParameterScope("something"), user.OrganizationID, codersdk.CreateParameterRequest{
Name: "example",
SourceValue: "tomato",
SourceScheme: database.ParameterSourceSchemeData,
DestinationScheme: database.ParameterDestinationSchemeProvisionerVariable,
SourceScheme: codersdk.ParameterSourceSchemeData,
DestinationScheme: codersdk.ParameterDestinationSchemeProvisionerVariable,
})
var apiErr *codersdk.Error
require.ErrorAs(t, err, &apiErr)
@@ -36,8 +35,8 @@ func TestPostParameter(t *testing.T) {
_, err := client.CreateParameter(context.Background(), codersdk.ParameterOrganization, user.OrganizationID, codersdk.CreateParameterRequest{
Name: "example",
SourceValue: "tomato",
SourceScheme: database.ParameterSourceSchemeData,
DestinationScheme: database.ParameterDestinationSchemeProvisionerVariable,
SourceScheme: codersdk.ParameterSourceSchemeData,
DestinationScheme: codersdk.ParameterDestinationSchemeProvisionerVariable,
})
require.NoError(t, err)
})
@@ -49,16 +48,16 @@ func TestPostParameter(t *testing.T) {
_, err := client.CreateParameter(context.Background(), codersdk.ParameterOrganization, user.OrganizationID, codersdk.CreateParameterRequest{
Name: "example",
SourceValue: "tomato",
SourceScheme: database.ParameterSourceSchemeData,
DestinationScheme: database.ParameterDestinationSchemeProvisionerVariable,
SourceScheme: codersdk.ParameterSourceSchemeData,
DestinationScheme: codersdk.ParameterDestinationSchemeProvisionerVariable,
})
require.NoError(t, err)
_, err = client.CreateParameter(context.Background(), codersdk.ParameterOrganization, user.OrganizationID, codersdk.CreateParameterRequest{
Name: "example",
SourceValue: "tomato",
SourceScheme: database.ParameterSourceSchemeData,
DestinationScheme: database.ParameterDestinationSchemeProvisionerVariable,
SourceScheme: codersdk.ParameterSourceSchemeData,
DestinationScheme: codersdk.ParameterDestinationSchemeProvisionerVariable,
})
var apiErr *codersdk.Error
require.ErrorAs(t, err, &apiErr)
@@ -82,8 +81,8 @@ func TestParameters(t *testing.T) {
_, err := client.CreateParameter(context.Background(), codersdk.ParameterOrganization, user.OrganizationID, codersdk.CreateParameterRequest{
Name: "example",
SourceValue: "tomato",
SourceScheme: database.ParameterSourceSchemeData,
DestinationScheme: database.ParameterDestinationSchemeProvisionerVariable,
SourceScheme: codersdk.ParameterSourceSchemeData,
DestinationScheme: codersdk.ParameterDestinationSchemeProvisionerVariable,
})
require.NoError(t, err)
params, err := client.Parameters(context.Background(), codersdk.ParameterOrganization, user.OrganizationID)
@@ -110,8 +109,8 @@ func TestDeleteParameter(t *testing.T) {
param, err := client.CreateParameter(context.Background(), codersdk.ParameterOrganization, user.OrganizationID, codersdk.CreateParameterRequest{
Name: "example",
SourceValue: "tomato",
SourceScheme: database.ParameterSourceSchemeData,
DestinationScheme: database.ParameterDestinationSchemeProvisionerVariable,
SourceScheme: codersdk.ParameterSourceSchemeData,
DestinationScheme: codersdk.ParameterDestinationSchemeProvisionerVariable,
})
require.NoError(t, err)
err = client.DeleteParameter(context.Background(), codersdk.ParameterOrganization, user.OrganizationID, param.Name)
+2 -3
View File
@@ -11,7 +11,6 @@ import (
"github.com/stretchr/testify/require"
"github.com/coder/coder/coderd/coderdtest"
"github.com/coder/coder/coderd/database"
"github.com/coder/coder/codersdk"
"github.com/coder/coder/provisionersdk"
)
@@ -34,9 +33,9 @@ func TestProvisionerDaemons(t *testing.T) {
t.Log(resp.Hash)
version, err := client.CreateTemplateVersion(context.Background(), user.OrganizationID, codersdk.CreateTemplateVersionRequest{
StorageMethod: database.ProvisionerStorageMethodFile,
StorageMethod: codersdk.ProvisionerStorageMethodFile,
StorageSource: resp.Hash,
Provisioner: database.ProvisionerTypeEcho,
Provisioner: codersdk.ProvisionerTypeEcho,
})
require.NoError(t, err)
require.Eventually(t, func() bool {
+2 -2
View File
@@ -244,8 +244,8 @@ func convertProvisionerJobLog(provisionerJobLog database.ProvisionerJobLog) code
return codersdk.ProvisionerJobLog{
ID: provisionerJobLog.ID,
CreatedAt: provisionerJobLog.CreatedAt,
Source: provisionerJobLog.Source,
Level: provisionerJobLog.Level,
Source: codersdk.LogSource(provisionerJobLog.Source),
Level: codersdk.LogLevel(provisionerJobLog.Level),
Stage: provisionerJobLog.Stage,
Output: provisionerJobLog.Output,
}
+3 -3
View File
@@ -158,9 +158,9 @@ func (api *api) postTemplateByOrganization(rw http.ResponseWriter, r *http.Reque
UpdatedAt: database.Now(),
Scope: database.ParameterScopeTemplate,
ScopeID: dbTemplate.ID,
SourceScheme: parameterValue.SourceScheme,
SourceScheme: database.ParameterSourceScheme(parameterValue.SourceScheme),
SourceValue: parameterValue.SourceValue,
DestinationScheme: parameterValue.DestinationScheme,
DestinationScheme: database.ParameterDestinationScheme(parameterValue.DestinationScheme),
})
if err != nil {
return xerrors.Errorf("insert parameter value: %w", err)
@@ -278,7 +278,7 @@ func convertTemplate(template database.Template, workspaceOwnerCount uint32) cod
UpdatedAt: template.UpdatedAt,
OrganizationID: template.OrganizationID,
Name: template.Name,
Provisioner: template.Provisioner,
Provisioner: codersdk.ProvisionerType(template.Provisioner),
ActiveVersionID: template.ActiveVersionID,
WorkspaceOwnerCount: workspaceOwnerCount,
Description: template.Description,
+3 -3
View File
@@ -324,9 +324,9 @@ func (api *api) postTemplateVersionsByOrganization(rw http.ResponseWriter, r *ht
UpdatedAt: database.Now(),
Scope: database.ParameterScopeImportJob,
ScopeID: jobID,
SourceScheme: parameterValue.SourceScheme,
SourceScheme: database.ParameterSourceScheme(parameterValue.SourceScheme),
SourceValue: parameterValue.SourceValue,
DestinationScheme: parameterValue.DestinationScheme,
DestinationScheme: database.ParameterDestinationScheme(parameterValue.DestinationScheme),
})
if err != nil {
return xerrors.Errorf("insert parameter value: %w", err)
@@ -339,7 +339,7 @@ func (api *api) postTemplateVersionsByOrganization(rw http.ResponseWriter, r *ht
UpdatedAt: database.Now(),
OrganizationID: organization.ID,
InitiatorID: apiKey.UserID,
Provisioner: req.Provisioner,
Provisioner: database.ProvisionerType(req.Provisioner),
StorageMethod: database.ProvisionerStorageMethodFile,
StorageSource: file.Hash,
Type: database.ProvisionerJobTypeTemplateVersionImport,
+10 -11
View File
@@ -11,7 +11,6 @@ import (
"github.com/stretchr/testify/require"
"github.com/coder/coder/coderd/coderdtest"
"github.com/coder/coder/coderd/database"
"github.com/coder/coder/codersdk"
"github.com/coder/coder/provisioner/echo"
"github.com/coder/coder/provisionersdk/proto"
@@ -38,9 +37,9 @@ func TestPostTemplateVersionsByOrganization(t *testing.T) {
templateID := uuid.New()
_, err := client.CreateTemplateVersion(context.Background(), user.OrganizationID, codersdk.CreateTemplateVersionRequest{
TemplateID: templateID,
StorageMethod: database.ProvisionerStorageMethodFile,
StorageMethod: codersdk.ProvisionerStorageMethodFile,
StorageSource: "hash",
Provisioner: database.ProvisionerTypeEcho,
Provisioner: codersdk.ProvisionerTypeEcho,
})
var apiErr *codersdk.Error
require.ErrorAs(t, err, &apiErr)
@@ -52,9 +51,9 @@ func TestPostTemplateVersionsByOrganization(t *testing.T) {
client := coderdtest.New(t, nil)
user := coderdtest.CreateFirstUser(t, client)
_, err := client.CreateTemplateVersion(context.Background(), user.OrganizationID, codersdk.CreateTemplateVersionRequest{
StorageMethod: database.ProvisionerStorageMethodFile,
StorageMethod: codersdk.ProvisionerStorageMethodFile,
StorageSource: "hash",
Provisioner: database.ProvisionerTypeEcho,
Provisioner: codersdk.ProvisionerTypeEcho,
})
var apiErr *codersdk.Error
require.ErrorAs(t, err, &apiErr)
@@ -74,14 +73,14 @@ func TestPostTemplateVersionsByOrganization(t *testing.T) {
file, err := client.Upload(context.Background(), codersdk.ContentTypeTar, data)
require.NoError(t, err)
_, err = client.CreateTemplateVersion(context.Background(), user.OrganizationID, codersdk.CreateTemplateVersionRequest{
StorageMethod: database.ProvisionerStorageMethodFile,
StorageMethod: codersdk.ProvisionerStorageMethodFile,
StorageSource: file.Hash,
Provisioner: database.ProvisionerTypeEcho,
Provisioner: codersdk.ProvisionerTypeEcho,
ParameterValues: []codersdk.CreateParameterRequest{{
Name: "example",
SourceValue: "value",
SourceScheme: database.ParameterSourceSchemeData,
DestinationScheme: database.ParameterDestinationSchemeProvisionerVariable,
SourceScheme: codersdk.ParameterSourceSchemeData,
DestinationScheme: codersdk.ParameterDestinationSchemeProvisionerVariable,
}},
})
require.NoError(t, err)
@@ -480,8 +479,8 @@ func TestPaginatedTemplateVersions(t *testing.T) {
templateVersion, err := client.CreateTemplateVersion(ctx, user.OrganizationID, codersdk.CreateTemplateVersionRequest{
TemplateID: template.ID,
StorageSource: file.Hash,
StorageMethod: database.ProvisionerStorageMethodFile,
Provisioner: database.ProvisionerTypeEcho,
StorageMethod: codersdk.ProvisionerStorageMethodFile,
Provisioner: codersdk.ProvisionerTypeEcho,
})
require.NoError(t, err)
+5 -5
View File
@@ -153,9 +153,9 @@ func (api *api) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
// Rbac action depends on the transition
var action rbac.Action
switch createBuild.Transition {
case database.WorkspaceTransitionDelete:
case codersdk.WorkspaceTransitionDelete:
action = rbac.ActionDelete
case database.WorkspaceTransitionStart, database.WorkspaceTransitionStop:
case codersdk.WorkspaceTransitionStart, codersdk.WorkspaceTransitionStop:
action = rbac.ActionUpdate
default:
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
@@ -291,7 +291,7 @@ func (api *api) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
Name: namesgenerator.GetRandomName(1),
ProvisionerState: state,
InitiatorID: apiKey.UserID,
Transition: createBuild.Transition,
Transition: database.WorkspaceTransition(createBuild.Transition),
JobID: provisionerJob.ID,
})
if err != nil {
@@ -442,7 +442,7 @@ func convertWorkspaceBuild(workspaceBuild database.WorkspaceBuild, job codersdk.
TemplateVersionID: workspaceBuild.TemplateVersionID,
BuildNumber: workspaceBuild.BuildNumber,
Name: workspaceBuild.Name,
Transition: workspaceBuild.Transition,
Transition: codersdk.WorkspaceTransition(workspaceBuild.Transition),
InitiatorID: workspaceBuild.InitiatorID,
Job: job,
}
@@ -453,7 +453,7 @@ func convertWorkspaceResource(resource database.WorkspaceResource, agents []code
ID: resource.ID,
CreatedAt: resource.CreatedAt,
JobID: resource.JobID,
Transition: resource.Transition,
Transition: codersdk.WorkspaceTransition(resource.Transition),
Type: resource.Type,
Name: resource.Name,
Agents: agents,
+2 -2
View File
@@ -445,9 +445,9 @@ func (api *api) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req
UpdatedAt: database.Now(),
Scope: database.ParameterScopeWorkspace,
ScopeID: workspace.ID,
SourceScheme: parameterValue.SourceScheme,
SourceScheme: database.ParameterSourceScheme(parameterValue.SourceScheme),
SourceValue: parameterValue.SourceValue,
DestinationScheme: parameterValue.DestinationScheme,
DestinationScheme: database.ParameterDestinationScheme(parameterValue.DestinationScheme),
})
if err != nil {
return xerrors.Errorf("insert parameter value: %w", err)
+6 -7
View File
@@ -14,7 +14,6 @@ import (
"github.com/coder/coder/coderd/autobuild/schedule"
"github.com/coder/coder/coderd/coderdtest"
"github.com/coder/coder/coderd/database"
"github.com/coder/coder/codersdk"
"github.com/coder/coder/provisioner/echo"
"github.com/coder/coder/provisionersdk/proto"
@@ -55,7 +54,7 @@ func TestWorkspace(t *testing.T) {
// Delete the workspace
build, err := client.CreateWorkspaceBuild(context.Background(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{
Transition: database.WorkspaceTransitionDelete,
Transition: codersdk.WorkspaceTransitionDelete,
})
require.NoError(t, err, "delete the workspace")
coderdtest.AwaitWorkspaceBuildJob(t, client, build.ID)
@@ -271,7 +270,7 @@ func TestPostWorkspaceBuild(t *testing.T) {
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
_, err := client.CreateWorkspaceBuild(context.Background(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{
TemplateVersionID: uuid.New(),
Transition: database.WorkspaceTransitionStart,
Transition: codersdk.WorkspaceTransitionStart,
})
require.Error(t, err)
var apiErr *codersdk.Error
@@ -311,7 +310,7 @@ func TestPostWorkspaceBuild(t *testing.T) {
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
_, err := client.CreateWorkspaceBuild(context.Background(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{
TemplateVersionID: template.ActiveVersionID,
Transition: database.WorkspaceTransitionStart,
Transition: codersdk.WorkspaceTransitionStart,
})
require.Error(t, err)
var apiErr *codersdk.Error
@@ -331,7 +330,7 @@ func TestPostWorkspaceBuild(t *testing.T) {
coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
build, err := client.CreateWorkspaceBuild(context.Background(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{
TemplateVersionID: template.ActiveVersionID,
Transition: database.WorkspaceTransitionStart,
Transition: codersdk.WorkspaceTransitionStart,
})
require.NoError(t, err)
require.Equal(t, workspace.LatestBuild.BuildNumber+1, build.BuildNumber)
@@ -351,7 +350,7 @@ func TestPostWorkspaceBuild(t *testing.T) {
wantState := []byte("something")
build, err := client.CreateWorkspaceBuild(context.Background(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{
TemplateVersionID: template.ActiveVersionID,
Transition: database.WorkspaceTransitionStart,
Transition: codersdk.WorkspaceTransitionStart,
ProvisionerState: wantState,
})
require.NoError(t, err)
@@ -371,7 +370,7 @@ func TestPostWorkspaceBuild(t *testing.T) {
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
build, err := client.CreateWorkspaceBuild(context.Background(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{
Transition: database.WorkspaceTransitionDelete,
Transition: codersdk.WorkspaceTransitionDelete,
})
require.NoError(t, err)
require.Equal(t, workspace.LatestBuild.BuildNumber+1, build.BuildNumber)
+15 -4
View File
@@ -9,8 +9,19 @@ import (
"github.com/google/uuid"
"golang.org/x/xerrors"
)
"github.com/coder/coder/coderd/database"
type ProvisionerStorageMethod string
const (
ProvisionerStorageMethodFile ProvisionerStorageMethod = "file"
)
type ProvisionerType string
const (
ProvisionerTypeEcho ProvisionerType = "echo"
ProvisionerTypeTerraform ProvisionerType = "terraform"
)
// Organization is the JSON representation of a Coder organization.
@@ -26,9 +37,9 @@ type CreateTemplateVersionRequest struct {
// TemplateID optionally associates a version with a template.
TemplateID uuid.UUID `json:"template_id,omitempty"`
StorageMethod database.ProvisionerStorageMethod `json:"storage_method" validate:"oneof=file,required"`
StorageSource string `json:"storage_source" validate:"required"`
Provisioner database.ProvisionerType `json:"provisioner" validate:"oneof=terraform echo,required"`
StorageMethod ProvisionerStorageMethod `json:"storage_method" validate:"oneof=file,required"`
StorageSource string `json:"storage_source" validate:"required"`
Provisioner ProvisionerType `json:"provisioner" validate:"oneof=terraform echo,required"`
// ParameterValues allows for additional parameters to be provided
// during the dry-run provision stage.
ParameterValues []CreateParameterRequest `json:"parameter_values,omitempty"`
+50 -30
View File
@@ -9,8 +9,6 @@ import (
"time"
"github.com/google/uuid"
"github.com/coder/coder/coderd/database"
)
type ParameterScope string
@@ -22,35 +20,57 @@ const (
ParameterWorkspace ParameterScope = "workspace"
)
type ParameterSourceScheme string
const (
ParameterSourceSchemeNone ParameterSourceScheme = "none"
ParameterSourceSchemeData ParameterSourceScheme = "data"
)
type ParameterDestinationScheme string
const (
ParameterDestinationSchemeNone ParameterDestinationScheme = "none"
ParameterDestinationSchemeEnvironmentVariable ParameterDestinationScheme = "environment_variable"
ParameterDestinationSchemeProvisionerVariable ParameterDestinationScheme = "provisioner_variable"
)
type ParameterTypeSystem string
const (
ParameterTypeSystemNone ParameterTypeSystem = "none"
ParameterTypeSystemHCL ParameterTypeSystem = "hcl"
)
// Parameter represents a set value for the scope.
type Parameter struct {
ID uuid.UUID `json:"id"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
Scope ParameterScope `json:"scope"`
ScopeID uuid.UUID `json:"scope_id"`
Name string `json:"name"`
SourceScheme database.ParameterSourceScheme `json:"source_scheme"`
DestinationScheme database.ParameterDestinationScheme `json:"destination_scheme"`
ID uuid.UUID `json:"id"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
Scope ParameterScope `json:"scope"`
ScopeID uuid.UUID `json:"scope_id"`
Name string `json:"name"`
SourceScheme ParameterSourceScheme `json:"source_scheme"`
DestinationScheme ParameterDestinationScheme `json:"destination_scheme"`
}
type ParameterSchema struct {
ID uuid.UUID `json:"id"`
CreatedAt time.Time `json:"created_at"`
JobID uuid.UUID `json:"job_id"`
Name string `json:"name"`
Description string `json:"description"`
DefaultSourceScheme string `json:"default_source_scheme"`
DefaultSourceValue string `json:"default_source_value"`
AllowOverrideSource bool `json:"allow_override_source"`
DefaultDestinationScheme string `json:"default_destination_scheme"`
AllowOverrideDestination bool `json:"allow_override_destination"`
DefaultRefresh string `json:"default_refresh"`
RedisplayValue bool `json:"redisplay_value"`
ValidationError string `json:"validation_error"`
ValidationCondition string `json:"validation_condition"`
ValidationTypeSystem string `json:"validation_type_system"`
ValidationValueType string `json:"validation_value_type"`
ID uuid.UUID `json:"id"`
CreatedAt time.Time `json:"created_at"`
JobID uuid.UUID `json:"job_id"`
Name string `json:"name"`
Description string `json:"description"`
DefaultSourceScheme ParameterSourceScheme `json:"default_source_scheme"`
DefaultSourceValue string `json:"default_source_value"`
AllowOverrideSource bool `json:"allow_override_source"`
DefaultDestinationScheme ParameterDestinationScheme `json:"default_destination_scheme"`
AllowOverrideDestination bool `json:"allow_override_destination"`
DefaultRefresh string `json:"default_refresh"`
RedisplayValue bool `json:"redisplay_value"`
ValidationError string `json:"validation_error"`
ValidationCondition string `json:"validation_condition"`
ValidationTypeSystem string `json:"validation_type_system"`
ValidationValueType string `json:"validation_value_type"`
// This is a special array of items provided if the validation condition
// explicitly states the value must be one of a set.
@@ -59,10 +79,10 @@ type ParameterSchema struct {
// CreateParameterRequest is used to create a new parameter value for a scope.
type CreateParameterRequest struct {
Name string `json:"name" validate:"required"`
SourceValue string `json:"source_value" validate:"required"`
SourceScheme database.ParameterSourceScheme `json:"source_scheme" validate:"oneof=data,required"`
DestinationScheme database.ParameterDestinationScheme `json:"destination_scheme" validate:"oneof=environment_variable provisioner_variable,required"`
Name string `json:"name" validate:"required"`
SourceValue string `json:"source_value" validate:"required"`
SourceScheme ParameterSourceScheme `json:"source_scheme" validate:"oneof=data,required"`
DestinationScheme ParameterDestinationScheme `json:"destination_scheme" validate:"oneof=environment_variable provisioner_variable,required"`
}
func (c *Client) CreateParameter(ctx context.Context, scope ParameterScope, id uuid.UUID, req CreateParameterRequest) (Parameter, error) {
+32 -8
View File
@@ -2,6 +2,7 @@ package codersdk
import (
"context"
"database/sql"
"encoding/json"
"fmt"
"io"
@@ -15,12 +16,35 @@ import (
"golang.org/x/xerrors"
"nhooyr.io/websocket"
"github.com/coder/coder/coderd/database"
"github.com/coder/coder/provisionerd/proto"
"github.com/coder/coder/provisionersdk"
)
type ProvisionerDaemon database.ProvisionerDaemon
type LogSource string
const (
LogSourceProvisionerDaemon LogSource = "provisioner_daemon"
LogSourceProvisioner LogSource = "provisioner"
)
type LogLevel string
const (
LogLevelTrace LogLevel = "trace"
LogLevelDebug LogLevel = "debug"
LogLevelInfo LogLevel = "info"
LogLevelWarn LogLevel = "warn"
LogLevelError LogLevel = "error"
)
type ProvisionerDaemon struct {
ID uuid.UUID `json:"id"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt sql.NullTime `json:"updated_at"`
OrganizationID uuid.NullUUID `json:"organization_id"`
Name string `json:"name"`
Provisioners []ProvisionerType `json:"provisioners"`
}
// ProvisionerJobStaus represents the at-time state of a job.
type ProvisionerJobStatus string
@@ -54,12 +78,12 @@ type ProvisionerJob struct {
}
type ProvisionerJobLog struct {
ID uuid.UUID `json:"id"`
CreatedAt time.Time `json:"created_at"`
Source database.LogSource `json:"log_source"`
Level database.LogLevel `json:"log_level"`
Stage string `json:"stage"`
Output string `json:"output"`
ID uuid.UUID `json:"id"`
CreatedAt time.Time `json:"created_at"`
Source LogSource `json:"log_source"`
Level LogLevel `json:"log_level"`
Stage string `json:"stage"`
Output string `json:"output"`
}
// ListenProvisionerDaemon returns the gRPC service for a provisioner daemon implementation.
+9 -11
View File
@@ -8,22 +8,20 @@ import (
"time"
"github.com/google/uuid"
"github.com/coder/coder/coderd/database"
)
// Template is the JSON representation of a Coder template. This type matches the
// database object for now, but is abstracted for ease of change later on.
type Template struct {
ID uuid.UUID `json:"id"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
OrganizationID uuid.UUID `json:"organization_id"`
Name string `json:"name"`
Provisioner database.ProvisionerType `json:"provisioner"`
ActiveVersionID uuid.UUID `json:"active_version_id"`
WorkspaceOwnerCount uint32 `json:"workspace_owner_count"`
Description string `json:"description"`
ID uuid.UUID `json:"id"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
OrganizationID uuid.UUID `json:"organization_id"`
Name string `json:"name"`
Provisioner ProvisionerType `json:"provisioner"`
ActiveVersionID uuid.UUID `json:"active_version_id"`
WorkspaceOwnerCount uint32 `json:"workspace_owner_count"`
Description string `json:"description"`
}
type UpdateActiveTemplateVersion struct {
+13 -3
View File
@@ -8,8 +8,6 @@ import (
"time"
"github.com/google/uuid"
"github.com/coder/coder/coderd/parameter"
)
// TemplateVersion represents a single version of a template.
@@ -24,7 +22,19 @@ type TemplateVersion struct {
}
// TemplateVersionParameter represents a computed parameter value.
type TemplateVersionParameter parameter.ComputedValue
type TemplateVersionParameter struct {
ID uuid.UUID `json:"id"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
Scope ParameterScope `json:"scope"`
ScopeID uuid.UUID `json:"scope_id"`
Name string `json:"name"`
SourceScheme ParameterSourceScheme `json:"source_scheme"`
SourceValue string `json:"source_value"`
DestinationScheme ParameterDestinationScheme `json:"destination_scheme"`
SchemaID uuid.UUID `json:"schema_id"`
DefaultSourceValue bool `json:"default_source_value"`
}
// TemplateVersion returns a template version by ID.
func (c *Client) TemplateVersion(ctx context.Context, id uuid.UUID) (TemplateVersion, error) {
+17 -11
View File
@@ -9,23 +9,29 @@ import (
"time"
"github.com/google/uuid"
)
"github.com/coder/coder/coderd/database"
type WorkspaceTransition string
const (
WorkspaceTransitionStart WorkspaceTransition = "start"
WorkspaceTransitionStop WorkspaceTransition = "stop"
WorkspaceTransitionDelete WorkspaceTransition = "delete"
)
// WorkspaceBuild is an at-point representation of a workspace state.
// BuildNumbers start at 1 and increase by 1 for each subsequent build
type WorkspaceBuild struct {
ID uuid.UUID `json:"id"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
WorkspaceID uuid.UUID `json:"workspace_id"`
TemplateVersionID uuid.UUID `json:"template_version_id"`
BuildNumber int32 `json:"build_number"`
Name string `json:"name"`
Transition database.WorkspaceTransition `json:"transition"`
InitiatorID uuid.UUID `json:"initiator_id"`
Job ProvisionerJob `json:"job"`
ID uuid.UUID `json:"id"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
WorkspaceID uuid.UUID `json:"workspace_id"`
TemplateVersionID uuid.UUID `json:"template_version_id"`
BuildNumber int32 `json:"build_number"`
Name string `json:"name"`
Transition WorkspaceTransition `json:"transition"`
InitiatorID uuid.UUID `json:"initiator_id"`
Job ProvisionerJob `json:"job"`
}
// WorkspaceBuild returns a single workspace build for a workspace.
+7 -9
View File
@@ -8,8 +8,6 @@ import (
"time"
"github.com/google/uuid"
"github.com/coder/coder/coderd/database"
)
type WorkspaceAgentStatus string
@@ -21,13 +19,13 @@ const (
)
type WorkspaceResource struct {
ID uuid.UUID `json:"id"`
CreatedAt time.Time `json:"created_at"`
JobID uuid.UUID `json:"job_id"`
Transition database.WorkspaceTransition `json:"workspace_transition"`
Type string `json:"type"`
Name string `json:"name"`
Agents []WorkspaceAgent `json:"agents,omitempty"`
ID uuid.UUID `json:"id"`
CreatedAt time.Time `json:"created_at"`
JobID uuid.UUID `json:"job_id"`
Transition WorkspaceTransition `json:"workspace_transition"`
Type string `json:"type"`
Name string `json:"name"`
Agents []WorkspaceAgent `json:"agents,omitempty"`
}
type WorkspaceAgent struct {
+4 -6
View File
@@ -11,8 +11,6 @@ import (
"golang.org/x/xerrors"
"nhooyr.io/websocket"
"nhooyr.io/websocket/wsjson"
"github.com/coder/coder/coderd/database"
)
// Workspace is a deployment of a template. It references a specific
@@ -34,10 +32,10 @@ type Workspace struct {
// CreateWorkspaceBuildRequest provides options to update the latest workspace build.
type CreateWorkspaceBuildRequest struct {
TemplateVersionID uuid.UUID `json:"template_version_id,omitempty"`
Transition database.WorkspaceTransition `json:"transition" validate:"oneof=create start stop delete,required"`
DryRun bool `json:"dry_run,omitempty"`
ProvisionerState []byte `json:"state,omitempty"`
TemplateVersionID uuid.UUID `json:"template_version_id,omitempty"`
Transition WorkspaceTransition `json:"transition" validate:"oneof=create start stop delete,required"`
DryRun bool `json:"dry_run,omitempty"`
ProvisionerState []byte `json:"state,omitempty"`
}
// Workspace returns a single workspace.
-26
View File
@@ -1,26 +0,0 @@
package gorules
import (
"github.com/quasilyte/go-ruleguard/dsl"
)
// Use xerrors everywhere! It provides additional stacktrace info!
//nolint:unused,deadcode,varnamelen
func xerrors(m dsl.Matcher) {
m.Import("errors")
m.Import("fmt")
m.Import("golang.org/x/xerrors")
m.Match("fmt.Errorf($*args)").
Suggest("xerrors.New($args)").
Report("Use xerrors to provide additional stacktrace information!")
m.Match("fmt.Errorf($*args)").
Suggest("xerrors.Errorf($args)").
Report("Use xerrors to provide additional stacktrace information!")
m.Match("errors.New($msg)").
Where(m["msg"].Type.Is("string")).
Suggest("xerrors.New($msg)").
Report("Use xerrors to provide additional stacktrace information!")
}
+43
View File
@@ -0,0 +1,43 @@
// Package gorules defines custom lint rules for ruleguard.
//
// golangci-lint runs these rules via go-critic, which includes support
// for ruleguard. All Go files in this directory define lint rules
// in the Ruleguard DSL; see:
//
// - https://go-ruleguard.github.io/by-example/
// - https://pkg.go.dev/github.com/quasilyte/go-ruleguard/dsl
//
// You run one of the following commands to execute your go rules only:
// golangci-lint run
// golangci-lint run --disable-all --enable=gocritic
package gorules
import (
"github.com/quasilyte/go-ruleguard/dsl"
)
// Use xerrors everywhere! It provides additional stacktrace info!
//nolint:unused,deadcode,varnamelen
func xerrors(m dsl.Matcher) {
m.Import("errors")
m.Import("fmt")
m.Import("golang.org/x/xerrors")
m.Match("fmt.Errorf($*args)").
Suggest("xerrors.New($args)").
Report("Use xerrors to provide additional stacktrace information!")
m.Match("errors.$_($msg)").
Where(m["msg"].Type.Is("string")).
Suggest("xerrors.New($msg)").
Report("Use xerrors to provide additional stacktrace information!")
}
// databaseImport enforces not importing any database types into /codersdk.
//nolint:unused,deadcode,varnamelen
func databaseImport(m dsl.Matcher) {
m.Import("github.com/coder/coder/coderd/database")
m.Match("database.$_").
Report("Do not import any database types into codersdk").
Where(m.File().PkgPath.Matches("github.com/coder/coder/codersdk"))
}
+77 -63
View File
@@ -49,17 +49,15 @@ export interface CreateOrganizationRequest {
readonly name: string
}
// From codersdk/parameters.go:61:6
// From codersdk/parameters.go:81:6
export interface CreateParameterRequest {
readonly name: string
readonly source_value: string
// This is likely an enum in an external package ("github.com/coder/coder/coderd/database.ParameterSourceScheme")
readonly source_scheme: string
// This is likely an enum in an external package ("github.com/coder/coder/coderd/database.ParameterDestinationScheme")
readonly destination_scheme: string
readonly source_scheme: ParameterSourceScheme
readonly destination_scheme: ParameterDestinationScheme
}
// From codersdk/organizations.go:38:6
// From codersdk/organizations.go:49:6
export interface CreateTemplateRequest {
readonly name: string
readonly description?: string
@@ -67,14 +65,12 @@ export interface CreateTemplateRequest {
readonly parameter_values?: CreateParameterRequest[]
}
// From codersdk/organizations.go:25:6
// From codersdk/organizations.go:36:6
export interface CreateTemplateVersionRequest {
readonly template_id?: string
// This is likely an enum in an external package ("github.com/coder/coder/coderd/database.ProvisionerStorageMethod")
readonly storage_method: string
readonly storage_method: ProvisionerStorageMethod
readonly storage_source: string
// This is likely an enum in an external package ("github.com/coder/coder/coderd/database.ProvisionerType")
readonly provisioner: string
readonly provisioner: ProvisionerType
readonly parameter_values?: CreateParameterRequest[]
}
@@ -86,16 +82,15 @@ export interface CreateUserRequest {
readonly organization_id: string
}
// From codersdk/workspaces.go:36:6
// From codersdk/workspaces.go:34:6
export interface CreateWorkspaceBuildRequest {
readonly template_version_id?: string
// This is likely an enum in an external package ("github.com/coder/coder/coderd/database.WorkspaceTransition")
readonly transition: string
readonly transition: WorkspaceTransition
readonly dry_run?: boolean
readonly state?: string
}
// From codersdk/organizations.go:56:6
// From codersdk/organizations.go:67:6
export interface CreateWorkspaceRequest {
readonly template_id: string
readonly name: string
@@ -131,7 +126,7 @@ export interface LoginWithPasswordResponse {
readonly session_token: string
}
// From codersdk/organizations.go:17:6
// From codersdk/organizations.go:28:6
export interface Organization {
readonly id: string
readonly name: string
@@ -155,7 +150,7 @@ export interface Pagination {
readonly offset?: number
}
// From codersdk/parameters.go:26:6
// From codersdk/parameters.go:46:6
export interface Parameter {
readonly id: string
readonly created_at: string
@@ -163,48 +158,42 @@ export interface Parameter {
readonly scope: ParameterScope
readonly scope_id: string
readonly name: string
// This is likely an enum in an external package ("github.com/coder/coder/coderd/database.ParameterSourceScheme")
readonly source_scheme: string
// This is likely an enum in an external package ("github.com/coder/coder/coderd/database.ParameterDestinationScheme")
readonly destination_scheme: string
readonly source_scheme: ParameterSourceScheme
readonly destination_scheme: ParameterDestinationScheme
}
// From codersdk/parameters.go:37:6
// From codersdk/parameters.go:57:6
export interface ParameterSchema {
readonly id: string
readonly created_at: string
readonly job_id: string
readonly name: string
readonly description: string
// This is likely an enum in an external package ("github.com/coder/coder/coderd/database.ParameterSourceScheme")
readonly default_source_scheme: string
readonly default_source_scheme: ParameterSourceScheme
readonly default_source_value: string
readonly allow_override_source: boolean
// This is likely an enum in an external package ("github.com/coder/coder/coderd/database.ParameterDestinationScheme")
readonly default_destination_scheme: string
readonly default_destination_scheme: ParameterDestinationScheme
readonly allow_override_destination: boolean
readonly default_refresh: string
readonly redisplay_value: boolean
readonly validation_error: string
readonly validation_condition: string
// This is likely an enum in an external package ("github.com/coder/coder/coderd/database.ParameterTypeSystem")
readonly validation_type_system: string
readonly validation_value_type: string
readonly validation_contains: string[]
}
// From codersdk/provisionerdaemons.go:23:6
// From codersdk/provisionerdaemons.go:40:6
export interface ProvisionerDaemon {
readonly id: string
readonly created_at: string
readonly updated_at?: string
readonly organization_id?: string
readonly name: string
// This is likely an enum in an external package ("github.com/coder/coder/coderd/database.ProvisionerType")
readonly provisioners: string[]
readonly provisioners: ProvisionerType[]
}
// From codersdk/provisionerdaemons.go:46:6
// From codersdk/provisionerdaemons.go:70:6
export interface ProvisionerJob {
readonly id: string
readonly created_at: string
@@ -215,14 +204,12 @@ export interface ProvisionerJob {
readonly worker_id?: string
}
// From codersdk/provisionerdaemons.go:56:6
// From codersdk/provisionerdaemons.go:80:6
export interface ProvisionerJobLog {
readonly id: string
readonly created_at: string
// This is likely an enum in an external package ("github.com/coder/coder/coderd/database.LogSource")
readonly log_source: string
// This is likely an enum in an external package ("github.com/coder/coder/coderd/database.LogLevel")
readonly log_level: string
readonly log_source: LogSource
readonly log_level: LogLevel
readonly stage: string
readonly output: string
}
@@ -233,21 +220,20 @@ export interface Role {
readonly display_name: string
}
// From codersdk/templates.go:17:6
// From codersdk/templates.go:15:6
export interface Template {
readonly id: string
readonly created_at: string
readonly updated_at: string
readonly organization_id: string
readonly name: string
// This is likely an enum in an external package ("github.com/coder/coder/coderd/database.ProvisionerType")
readonly provisioner: string
readonly provisioner: ProvisionerType
readonly active_version_id: string
readonly workspace_owner_count: number
readonly description: string
}
// From codersdk/templateversions.go:16:6
// From codersdk/templateversions.go:14:6
export interface TemplateVersion {
readonly id: string
readonly template_id?: string
@@ -258,21 +244,27 @@ export interface TemplateVersion {
readonly readme: string
}
// From codersdk/templateversions.go:27:6
// From codersdk/templateversions.go:25:6
export interface TemplateVersionParameter {
// Named type "github.com/coder/coder/coderd/database.ParameterValue" unknown, using "any"
// eslint-disable-next-line @typescript-eslint/no-explicit-any
readonly ParameterValue: any
readonly id: string
readonly created_at: string
readonly updated_at: string
readonly scope: ParameterScope
readonly scope_id: string
readonly name: string
readonly source_scheme: ParameterSourceScheme
readonly source_value: string
readonly destination_scheme: ParameterDestinationScheme
readonly schema_id: string
readonly default_source_value: boolean
}
// From codersdk/templates.go:75:6
// From codersdk/templates.go:73:6
export interface TemplateVersionsByTemplateRequest extends Pagination {
readonly template_id: string
}
// From codersdk/templates.go:29:6
// From codersdk/templates.go:27:6
export interface UpdateActiveTemplateVersion {
readonly id: string
}
@@ -293,12 +285,12 @@ export interface UpdateUserProfileRequest {
readonly username: string
}
// From codersdk/workspaces.go:134:6
// From codersdk/workspaces.go:141:6
export interface UpdateWorkspaceAutostartRequest {
readonly schedule: string
}
// From codersdk/workspaces.go:154:6
// From codersdk/workspaces.go:161:6
export interface UpdateWorkspaceAutostopRequest {
readonly schedule: string
}
@@ -353,7 +345,7 @@ export interface UsersRequest extends Pagination {
readonly status?: string
}
// From codersdk/workspaces.go:20:6
// From codersdk/workspaces.go:18:6
export interface Workspace {
readonly id: string
readonly created_at: string
@@ -369,7 +361,7 @@ export interface Workspace {
readonly autostop_schedule: string
}
// From codersdk/workspaceresources.go:33:6
// From codersdk/workspaceresources.go:31:6
export interface WorkspaceAgent {
readonly id: string
readonly created_at: string
@@ -393,7 +385,7 @@ export interface WorkspaceAgentAuthenticateResponse {
readonly session_token: string
}
// From codersdk/workspaceresources.go:59:6
// From codersdk/workspaceresources.go:57:6
export interface WorkspaceAgentInstanceMetadata {
readonly jail_orchestrator: string
readonly operating_system: string
@@ -406,7 +398,7 @@ export interface WorkspaceAgentInstanceMetadata {
readonly vnc: boolean
}
// From codersdk/workspaceresources.go:51:6
// From codersdk/workspaceresources.go:49:6
export interface WorkspaceAgentResourceMetadata {
readonly memory_total: number
readonly disk_total: number
@@ -415,7 +407,7 @@ export interface WorkspaceAgentResourceMetadata {
readonly cpu_mhz: number
}
// From codersdk/workspacebuilds.go:18:6
// From codersdk/workspacebuilds.go:24:6
export interface WorkspaceBuild {
readonly id: string
readonly created_at: string
@@ -424,43 +416,65 @@ export interface WorkspaceBuild {
readonly template_version_id: string
readonly build_number: number
readonly name: string
// This is likely an enum in an external package ("github.com/coder/coder/coderd/database.WorkspaceTransition")
readonly transition: string
readonly transition: WorkspaceTransition
readonly initiator_id: string
readonly job: ProvisionerJob
}
// From codersdk/workspaces.go:57:6
// From codersdk/workspaces.go:64:6
export interface WorkspaceBuildsRequest extends Pagination {
readonly WorkspaceID: string
}
// From codersdk/workspaces.go:173:6
// From codersdk/workspaces.go:180:6
export interface WorkspaceFilter {
readonly OrganizationID: string
readonly Owner: string
}
// From codersdk/workspaceresources.go:23:6
// From codersdk/workspaceresources.go:21:6
export interface WorkspaceResource {
readonly id: string
readonly created_at: string
readonly job_id: string
// This is likely an enum in an external package ("github.com/coder/coder/coderd/database.WorkspaceTransition")
readonly workspace_transition: string
readonly workspace_transition: WorkspaceTransition
readonly type: string
readonly name: string
readonly agents?: WorkspaceAgent[]
}
// From codersdk/parameters.go:16:6
// From codersdk/provisionerdaemons.go:30:6
export type LogLevel = "debug" | "error" | "info" | "trace" | "warn"
// From codersdk/provisionerdaemons.go:23:6
export type LogSource = "provisioner" | "provisioner_daemon"
// From codersdk/parameters.go:30:6
export type ParameterDestinationScheme = "environment_variable" | "none" | "provisioner_variable"
// From codersdk/parameters.go:14:6
export type ParameterScope = "organization" | "template" | "user" | "workspace"
// From codersdk/provisionerdaemons.go:26:6
// From codersdk/parameters.go:23:6
export type ParameterSourceScheme = "data" | "none"
// From codersdk/parameters.go:38:6
export type ParameterTypeSystem = "hcl" | "none"
// From codersdk/provisionerdaemons.go:50:6
export type ProvisionerJobStatus = "canceled" | "canceling" | "failed" | "pending" | "running" | "succeeded"
// From codersdk/organizations.go:14:6
export type ProvisionerStorageMethod = "file"
// From codersdk/organizations.go:20:6
export type ProvisionerType = "echo" | "terraform"
// From codersdk/users.go:17:6
export type UserStatus = "active" | "suspended"
// From codersdk/workspaceresources.go:15:6
// From codersdk/workspaceresources.go:13:6
export type WorkspaceAgentStatus = "connected" | "connecting" | "disconnected"
// From codersdk/workspacebuilds.go:14:6
export type WorkspaceTransition = "delete" | "start" | "stop"
+4 -4
View File
@@ -62,7 +62,7 @@ export const MockProvisioner: TypesGen.ProvisionerDaemon = {
created_at: "",
id: "test-provisioner",
name: "Test Provisioner",
provisioners: [],
provisioners: ["echo"],
}
export const MockProvisionerJob: TypesGen.ProvisionerJob = {
@@ -84,7 +84,7 @@ export const MockTemplate: TypesGen.Template = {
updated_at: "2022-05-18T17:39:01.382927298Z",
organization_id: MockOrganization.id,
name: "Test Template",
provisioner: MockProvisioner.id,
provisioner: MockProvisioner.provisioners[0],
active_version_id: "",
workspace_owner_count: 1,
description: "This is a test description.",
@@ -122,13 +122,13 @@ export const MockWorkspaceBuild: TypesGen.WorkspaceBuild = {
workspace_id: "test-workspace",
}
export const MockWorkspaceBuildStop = {
export const MockWorkspaceBuildStop: TypesGen.WorkspaceBuild = {
...MockWorkspaceBuild,
id: "2",
transition: "stop",
}
export const MockWorkspaceBuildDelete = {
export const MockWorkspaceBuildDelete: TypesGen.WorkspaceBuild = {
...MockWorkspaceBuild,
id: "3",
transition: "delete",