From ca90a0b3cb25117e0ab30f66abdd4881cb53f11c Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Thu, 19 Jan 2023 15:14:47 +0000 Subject: [PATCH 01/10] chore: Update sqlc to v1.16.0 --- .github/workflows/coder.yaml | 2 +- coderd/database/generate.sh | 2 +- dogfood/Dockerfile | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/coder.yaml b/.github/workflows/coder.yaml index 3f3c2f21261e3..9a79a590241d4 100644 --- a/.github/workflows/coder.yaml +++ b/.github/workflows/coder.yaml @@ -215,7 +215,7 @@ jobs: - name: Install sqlc run: | - curl -sSL https://github.com/kyleconroy/sqlc/releases/download/v1.13.0/sqlc_1.13.0_linux_amd64.tar.gz | sudo tar -C /usr/bin -xz sqlc + curl -sSL https://github.com/kyleconroy/sqlc/releases/download/v1.16.0/sqlc_1.16.0_linux_amd64.tar.gz | sudo tar -C /usr/bin -xz sqlc - name: Install protoc-gen-go run: go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.26 - name: Install protoc-gen-go-drpc diff --git a/coderd/database/generate.sh b/coderd/database/generate.sh index d193f6a4c7ee6..e70bbae939ff6 100755 --- a/coderd/database/generate.sh +++ b/coderd/database/generate.sh @@ -18,7 +18,7 @@ SCRIPT_DIR=$(dirname "${BASH_SOURCE[0]}") # Dump the updated schema (use make to utilize caching). make -C ../.. --no-print-directory coderd/database/dump.sql # The logic below depends on the exact version being correct :( - go run github.com/kyleconroy/sqlc/cmd/sqlc@v1.13.0 generate + go run github.com/kyleconroy/sqlc/cmd/sqlc@v1.16.0 generate first=true for fi in queries/*.sql.go; do diff --git a/dogfood/Dockerfile b/dogfood/Dockerfile index 2088598841bc6..52915db09b7d9 100644 --- a/dogfood/Dockerfile +++ b/dogfood/Dockerfile @@ -53,7 +53,7 @@ RUN mkdir --parents "$GOPATH" && \ # charts and values files go install github.com/norwoodj/helm-docs/cmd/helm-docs@v1.5.0 && \ # sqlc for Go code generation - go install github.com/kyleconroy/sqlc/cmd/sqlc@v1.10.0 && \ + go install github.com/kyleconroy/sqlc/cmd/sqlc@v1.16.0 && \ # gcr-cleaner-cli used by CI to prune unused images go install github.com/sethvargo/gcr-cleaner/cmd/gcr-cleaner-cli@v0.5.1 && \ # ruleguard for checking custom rules, without needing to run all of From 5ac5860ea3d0be419c53b41acf07aaaa9871a460 Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Thu, 19 Jan 2023 15:19:41 +0000 Subject: [PATCH 02/10] chore: Make gen --- coderd/database/models.go | 783 ++++++++++++++++++++++++++++++++- coderd/database/querier.go | 2 +- coderd/database/queries.sql.go | 38 +- coderd/database/sqlc.yaml | 2 + codersdk/workspaceagents.go | 1 + 5 files changed, 788 insertions(+), 38 deletions(-) diff --git a/coderd/database/models.go b/coderd/database/models.go index 909ca433f66e8..1717ac4d1f0b8 100644 --- a/coderd/database/models.go +++ b/coderd/database/models.go @@ -1,11 +1,12 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.13.0 +// sqlc v1.16.0 package database import ( "database/sql" + "database/sql/driver" "encoding/json" "fmt" "time" @@ -35,6 +36,45 @@ func (e *APIKeyScope) Scan(src interface{}) error { return nil } +type NullAPIKeyScope struct { + APIKeyScope APIKeyScope + Valid bool // Valid is true if APIKeyScope is not NULL +} + +// Scan implements the Scanner interface. +func (ns *NullAPIKeyScope) Scan(value interface{}) error { + if value == nil { + ns.APIKeyScope, ns.Valid = "", false + return nil + } + ns.Valid = true + return ns.APIKeyScope.Scan(value) +} + +// Value implements the driver Valuer interface. +func (ns NullAPIKeyScope) Value() (driver.Value, error) { + if !ns.Valid { + return nil, nil + } + return ns.APIKeyScope, nil +} + +func (e APIKeyScope) Valid() bool { + switch e { + case APIKeyScopeAll, + APIKeyScopeApplicationConnect: + return true + } + return false +} + +func AllAPIKeyScopeValues() []APIKeyScope { + return []APIKeyScope{ + APIKeyScopeAll, + APIKeyScopeApplicationConnect, + } +} + type AppSharingLevel string const ( @@ -55,6 +95,47 @@ func (e *AppSharingLevel) Scan(src interface{}) error { return nil } +type NullAppSharingLevel struct { + AppSharingLevel AppSharingLevel + Valid bool // Valid is true if AppSharingLevel is not NULL +} + +// Scan implements the Scanner interface. +func (ns *NullAppSharingLevel) Scan(value interface{}) error { + if value == nil { + ns.AppSharingLevel, ns.Valid = "", false + return nil + } + ns.Valid = true + return ns.AppSharingLevel.Scan(value) +} + +// Value implements the driver Valuer interface. +func (ns NullAppSharingLevel) Value() (driver.Value, error) { + if !ns.Valid { + return nil, nil + } + return ns.AppSharingLevel, nil +} + +func (e AppSharingLevel) Valid() bool { + switch e { + case AppSharingLevelOwner, + AppSharingLevelAuthenticated, + AppSharingLevelPublic: + return true + } + return false +} + +func AllAppSharingLevelValues() []AppSharingLevel { + return []AppSharingLevel{ + AppSharingLevelOwner, + AppSharingLevelAuthenticated, + AppSharingLevelPublic, + } +} + type AuditAction string const ( @@ -77,6 +158,51 @@ func (e *AuditAction) Scan(src interface{}) error { return nil } +type NullAuditAction struct { + AuditAction AuditAction + Valid bool // Valid is true if AuditAction is not NULL +} + +// Scan implements the Scanner interface. +func (ns *NullAuditAction) Scan(value interface{}) error { + if value == nil { + ns.AuditAction, ns.Valid = "", false + return nil + } + ns.Valid = true + return ns.AuditAction.Scan(value) +} + +// Value implements the driver Valuer interface. +func (ns NullAuditAction) Value() (driver.Value, error) { + if !ns.Valid { + return nil, nil + } + return ns.AuditAction, nil +} + +func (e AuditAction) Valid() bool { + switch e { + case AuditActionCreate, + AuditActionWrite, + AuditActionDelete, + AuditActionStart, + AuditActionStop: + return true + } + return false +} + +func AllAuditActionValues() []AuditAction { + return []AuditAction{ + AuditActionCreate, + AuditActionWrite, + AuditActionDelete, + AuditActionStart, + AuditActionStop, + } +} + type BuildReason string const ( @@ -97,6 +223,47 @@ func (e *BuildReason) Scan(src interface{}) error { return nil } +type NullBuildReason struct { + BuildReason BuildReason + Valid bool // Valid is true if BuildReason is not NULL +} + +// Scan implements the Scanner interface. +func (ns *NullBuildReason) Scan(value interface{}) error { + if value == nil { + ns.BuildReason, ns.Valid = "", false + return nil + } + ns.Valid = true + return ns.BuildReason.Scan(value) +} + +// Value implements the driver Valuer interface. +func (ns NullBuildReason) Value() (driver.Value, error) { + if !ns.Valid { + return nil, nil + } + return ns.BuildReason, nil +} + +func (e BuildReason) Valid() bool { + switch e { + case BuildReasonInitiator, + BuildReasonAutostart, + BuildReasonAutostop: + return true + } + return false +} + +func AllBuildReasonValues() []BuildReason { + return []BuildReason{ + BuildReasonInitiator, + BuildReasonAutostart, + BuildReasonAutostop, + } +} + type LogLevel string const ( @@ -119,6 +286,51 @@ func (e *LogLevel) Scan(src interface{}) error { return nil } +type NullLogLevel struct { + LogLevel LogLevel + Valid bool // Valid is true if LogLevel is not NULL +} + +// Scan implements the Scanner interface. +func (ns *NullLogLevel) Scan(value interface{}) error { + if value == nil { + ns.LogLevel, ns.Valid = "", false + return nil + } + ns.Valid = true + return ns.LogLevel.Scan(value) +} + +// Value implements the driver Valuer interface. +func (ns NullLogLevel) Value() (driver.Value, error) { + if !ns.Valid { + return nil, nil + } + return ns.LogLevel, nil +} + +func (e LogLevel) Valid() bool { + switch e { + case LogLevelTrace, + LogLevelDebug, + LogLevelInfo, + LogLevelWarn, + LogLevelError: + return true + } + return false +} + +func AllLogLevelValues() []LogLevel { + return []LogLevel{ + LogLevelTrace, + LogLevelDebug, + LogLevelInfo, + LogLevelWarn, + LogLevelError, + } +} + type LogSource string const ( @@ -138,6 +350,45 @@ func (e *LogSource) Scan(src interface{}) error { return nil } +type NullLogSource struct { + LogSource LogSource + Valid bool // Valid is true if LogSource is not NULL +} + +// Scan implements the Scanner interface. +func (ns *NullLogSource) Scan(value interface{}) error { + if value == nil { + ns.LogSource, ns.Valid = "", false + return nil + } + ns.Valid = true + return ns.LogSource.Scan(value) +} + +// Value implements the driver Valuer interface. +func (ns NullLogSource) Value() (driver.Value, error) { + if !ns.Valid { + return nil, nil + } + return ns.LogSource, nil +} + +func (e LogSource) Valid() bool { + switch e { + case LogSourceProvisionerDaemon, + LogSourceProvisioner: + return true + } + return false +} + +func AllLogSourceValues() []LogSource { + return []LogSource{ + LogSourceProvisionerDaemon, + LogSourceProvisioner, + } +} + type LoginType string const ( @@ -159,6 +410,49 @@ func (e *LoginType) Scan(src interface{}) error { return nil } +type NullLoginType struct { + LoginType LoginType + Valid bool // Valid is true if LoginType is not NULL +} + +// Scan implements the Scanner interface. +func (ns *NullLoginType) Scan(value interface{}) error { + if value == nil { + ns.LoginType, ns.Valid = "", false + return nil + } + ns.Valid = true + return ns.LoginType.Scan(value) +} + +// Value implements the driver Valuer interface. +func (ns NullLoginType) Value() (driver.Value, error) { + if !ns.Valid { + return nil, nil + } + return ns.LoginType, nil +} + +func (e LoginType) Valid() bool { + switch e { + case LoginTypePassword, + LoginTypeGithub, + LoginTypeOIDC, + LoginTypeToken: + return true + } + return false +} + +func AllLoginTypeValues() []LoginType { + return []LoginType{ + LoginTypePassword, + LoginTypeGithub, + LoginTypeOIDC, + LoginTypeToken, + } +} + type ParameterDestinationScheme string const ( @@ -179,6 +473,47 @@ func (e *ParameterDestinationScheme) Scan(src interface{}) error { return nil } +type NullParameterDestinationScheme struct { + ParameterDestinationScheme ParameterDestinationScheme + Valid bool // Valid is true if ParameterDestinationScheme is not NULL +} + +// Scan implements the Scanner interface. +func (ns *NullParameterDestinationScheme) Scan(value interface{}) error { + if value == nil { + ns.ParameterDestinationScheme, ns.Valid = "", false + return nil + } + ns.Valid = true + return ns.ParameterDestinationScheme.Scan(value) +} + +// Value implements the driver Valuer interface. +func (ns NullParameterDestinationScheme) Value() (driver.Value, error) { + if !ns.Valid { + return nil, nil + } + return ns.ParameterDestinationScheme, nil +} + +func (e ParameterDestinationScheme) Valid() bool { + switch e { + case ParameterDestinationSchemeNone, + ParameterDestinationSchemeEnvironmentVariable, + ParameterDestinationSchemeProvisionerVariable: + return true + } + return false +} + +func AllParameterDestinationSchemeValues() []ParameterDestinationScheme { + return []ParameterDestinationScheme{ + ParameterDestinationSchemeNone, + ParameterDestinationSchemeEnvironmentVariable, + ParameterDestinationSchemeProvisionerVariable, + } +} + type ParameterScope string const ( @@ -199,6 +534,47 @@ func (e *ParameterScope) Scan(src interface{}) error { return nil } +type NullParameterScope struct { + ParameterScope ParameterScope + Valid bool // Valid is true if ParameterScope is not NULL +} + +// Scan implements the Scanner interface. +func (ns *NullParameterScope) Scan(value interface{}) error { + if value == nil { + ns.ParameterScope, ns.Valid = "", false + return nil + } + ns.Valid = true + return ns.ParameterScope.Scan(value) +} + +// Value implements the driver Valuer interface. +func (ns NullParameterScope) Value() (driver.Value, error) { + if !ns.Valid { + return nil, nil + } + return ns.ParameterScope, nil +} + +func (e ParameterScope) Valid() bool { + switch e { + case ParameterScopeTemplate, + ParameterScopeImportJob, + ParameterScopeWorkspace: + return true + } + return false +} + +func AllParameterScopeValues() []ParameterScope { + return []ParameterScope{ + ParameterScopeTemplate, + ParameterScopeImportJob, + ParameterScopeWorkspace, + } +} + type ParameterSourceScheme string const ( @@ -218,6 +594,45 @@ func (e *ParameterSourceScheme) Scan(src interface{}) error { return nil } +type NullParameterSourceScheme struct { + ParameterSourceScheme ParameterSourceScheme + Valid bool // Valid is true if ParameterSourceScheme is not NULL +} + +// Scan implements the Scanner interface. +func (ns *NullParameterSourceScheme) Scan(value interface{}) error { + if value == nil { + ns.ParameterSourceScheme, ns.Valid = "", false + return nil + } + ns.Valid = true + return ns.ParameterSourceScheme.Scan(value) +} + +// Value implements the driver Valuer interface. +func (ns NullParameterSourceScheme) Value() (driver.Value, error) { + if !ns.Valid { + return nil, nil + } + return ns.ParameterSourceScheme, nil +} + +func (e ParameterSourceScheme) Valid() bool { + switch e { + case ParameterSourceSchemeNone, + ParameterSourceSchemeData: + return true + } + return false +} + +func AllParameterSourceSchemeValues() []ParameterSourceScheme { + return []ParameterSourceScheme{ + ParameterSourceSchemeNone, + ParameterSourceSchemeData, + } +} + type ParameterTypeSystem string const ( @@ -237,6 +652,45 @@ func (e *ParameterTypeSystem) Scan(src interface{}) error { return nil } +type NullParameterTypeSystem struct { + ParameterTypeSystem ParameterTypeSystem + Valid bool // Valid is true if ParameterTypeSystem is not NULL +} + +// Scan implements the Scanner interface. +func (ns *NullParameterTypeSystem) Scan(value interface{}) error { + if value == nil { + ns.ParameterTypeSystem, ns.Valid = "", false + return nil + } + ns.Valid = true + return ns.ParameterTypeSystem.Scan(value) +} + +// Value implements the driver Valuer interface. +func (ns NullParameterTypeSystem) Value() (driver.Value, error) { + if !ns.Valid { + return nil, nil + } + return ns.ParameterTypeSystem, nil +} + +func (e ParameterTypeSystem) Valid() bool { + switch e { + case ParameterTypeSystemNone, + ParameterTypeSystemHCL: + return true + } + return false +} + +func AllParameterTypeSystemValues() []ParameterTypeSystem { + return []ParameterTypeSystem{ + ParameterTypeSystemNone, + ParameterTypeSystemHCL, + } +} + type ProvisionerJobType string const ( @@ -257,6 +711,47 @@ func (e *ProvisionerJobType) Scan(src interface{}) error { return nil } +type NullProvisionerJobType struct { + ProvisionerJobType ProvisionerJobType + Valid bool // Valid is true if ProvisionerJobType is not NULL +} + +// Scan implements the Scanner interface. +func (ns *NullProvisionerJobType) Scan(value interface{}) error { + if value == nil { + ns.ProvisionerJobType, ns.Valid = "", false + return nil + } + ns.Valid = true + return ns.ProvisionerJobType.Scan(value) +} + +// Value implements the driver Valuer interface. +func (ns NullProvisionerJobType) Value() (driver.Value, error) { + if !ns.Valid { + return nil, nil + } + return ns.ProvisionerJobType, nil +} + +func (e ProvisionerJobType) Valid() bool { + switch e { + case ProvisionerJobTypeTemplateVersionImport, + ProvisionerJobTypeWorkspaceBuild, + ProvisionerJobTypeTemplateVersionDryRun: + return true + } + return false +} + +func AllProvisionerJobTypeValues() []ProvisionerJobType { + return []ProvisionerJobType{ + ProvisionerJobTypeTemplateVersionImport, + ProvisionerJobTypeWorkspaceBuild, + ProvisionerJobTypeTemplateVersionDryRun, + } +} + type ProvisionerStorageMethod string const ( @@ -275,6 +770,43 @@ func (e *ProvisionerStorageMethod) Scan(src interface{}) error { return nil } +type NullProvisionerStorageMethod struct { + ProvisionerStorageMethod ProvisionerStorageMethod + Valid bool // Valid is true if ProvisionerStorageMethod is not NULL +} + +// Scan implements the Scanner interface. +func (ns *NullProvisionerStorageMethod) Scan(value interface{}) error { + if value == nil { + ns.ProvisionerStorageMethod, ns.Valid = "", false + return nil + } + ns.Valid = true + return ns.ProvisionerStorageMethod.Scan(value) +} + +// Value implements the driver Valuer interface. +func (ns NullProvisionerStorageMethod) Value() (driver.Value, error) { + if !ns.Valid { + return nil, nil + } + return ns.ProvisionerStorageMethod, nil +} + +func (e ProvisionerStorageMethod) Valid() bool { + switch e { + case ProvisionerStorageMethodFile: + return true + } + return false +} + +func AllProvisionerStorageMethodValues() []ProvisionerStorageMethod { + return []ProvisionerStorageMethod{ + ProvisionerStorageMethodFile, + } +} + type ProvisionerType string const ( @@ -294,6 +826,45 @@ func (e *ProvisionerType) Scan(src interface{}) error { return nil } +type NullProvisionerType struct { + ProvisionerType ProvisionerType + Valid bool // Valid is true if ProvisionerType is not NULL +} + +// Scan implements the Scanner interface. +func (ns *NullProvisionerType) Scan(value interface{}) error { + if value == nil { + ns.ProvisionerType, ns.Valid = "", false + return nil + } + ns.Valid = true + return ns.ProvisionerType.Scan(value) +} + +// Value implements the driver Valuer interface. +func (ns NullProvisionerType) Value() (driver.Value, error) { + if !ns.Valid { + return nil, nil + } + return ns.ProvisionerType, nil +} + +func (e ProvisionerType) Valid() bool { + switch e { + case ProvisionerTypeEcho, + ProvisionerTypeTerraform: + return true + } + return false +} + +func AllProvisionerTypeValues() []ProvisionerType { + return []ProvisionerType{ + ProvisionerTypeEcho, + ProvisionerTypeTerraform, + } +} + type ResourceType string const ( @@ -320,6 +891,59 @@ func (e *ResourceType) Scan(src interface{}) error { return nil } +type NullResourceType struct { + ResourceType ResourceType + Valid bool // Valid is true if ResourceType is not NULL +} + +// Scan implements the Scanner interface. +func (ns *NullResourceType) Scan(value interface{}) error { + if value == nil { + ns.ResourceType, ns.Valid = "", false + return nil + } + ns.Valid = true + return ns.ResourceType.Scan(value) +} + +// Value implements the driver Valuer interface. +func (ns NullResourceType) Value() (driver.Value, error) { + if !ns.Valid { + return nil, nil + } + return ns.ResourceType, nil +} + +func (e ResourceType) Valid() bool { + switch e { + case ResourceTypeOrganization, + ResourceTypeTemplate, + ResourceTypeTemplateVersion, + ResourceTypeUser, + ResourceTypeWorkspace, + ResourceTypeGitSshKey, + ResourceTypeApiKey, + ResourceTypeGroup, + ResourceTypeWorkspaceBuild: + return true + } + return false +} + +func AllResourceTypeValues() []ResourceType { + return []ResourceType{ + ResourceTypeOrganization, + ResourceTypeTemplate, + ResourceTypeTemplateVersion, + ResourceTypeUser, + ResourceTypeWorkspace, + ResourceTypeGitSshKey, + ResourceTypeApiKey, + ResourceTypeGroup, + ResourceTypeWorkspaceBuild, + } +} + type UserStatus string const ( @@ -339,6 +963,45 @@ func (e *UserStatus) Scan(src interface{}) error { return nil } +type NullUserStatus struct { + UserStatus UserStatus + Valid bool // Valid is true if UserStatus is not NULL +} + +// Scan implements the Scanner interface. +func (ns *NullUserStatus) Scan(value interface{}) error { + if value == nil { + ns.UserStatus, ns.Valid = "", false + return nil + } + ns.Valid = true + return ns.UserStatus.Scan(value) +} + +// Value implements the driver Valuer interface. +func (ns NullUserStatus) Value() (driver.Value, error) { + if !ns.Valid { + return nil, nil + } + return ns.UserStatus, nil +} + +func (e UserStatus) Valid() bool { + switch e { + case UserStatusActive, + UserStatusSuspended: + return true + } + return false +} + +func AllUserStatusValues() []UserStatus { + return []UserStatus{ + UserStatusActive, + UserStatusSuspended, + } +} + type WorkspaceAppHealth string const ( @@ -360,6 +1023,49 @@ func (e *WorkspaceAppHealth) Scan(src interface{}) error { return nil } +type NullWorkspaceAppHealth struct { + WorkspaceAppHealth WorkspaceAppHealth + Valid bool // Valid is true if WorkspaceAppHealth is not NULL +} + +// Scan implements the Scanner interface. +func (ns *NullWorkspaceAppHealth) Scan(value interface{}) error { + if value == nil { + ns.WorkspaceAppHealth, ns.Valid = "", false + return nil + } + ns.Valid = true + return ns.WorkspaceAppHealth.Scan(value) +} + +// Value implements the driver Valuer interface. +func (ns NullWorkspaceAppHealth) Value() (driver.Value, error) { + if !ns.Valid { + return nil, nil + } + return ns.WorkspaceAppHealth, nil +} + +func (e WorkspaceAppHealth) Valid() bool { + switch e { + case WorkspaceAppHealthDisabled, + WorkspaceAppHealthInitializing, + WorkspaceAppHealthHealthy, + WorkspaceAppHealthUnhealthy: + return true + } + return false +} + +func AllWorkspaceAppHealthValues() []WorkspaceAppHealth { + return []WorkspaceAppHealth{ + WorkspaceAppHealthDisabled, + WorkspaceAppHealthInitializing, + WorkspaceAppHealthHealthy, + WorkspaceAppHealthUnhealthy, + } +} + type WorkspaceTransition string const ( @@ -380,6 +1086,47 @@ func (e *WorkspaceTransition) Scan(src interface{}) error { return nil } +type NullWorkspaceTransition struct { + WorkspaceTransition WorkspaceTransition + Valid bool // Valid is true if WorkspaceTransition is not NULL +} + +// Scan implements the Scanner interface. +func (ns *NullWorkspaceTransition) Scan(value interface{}) error { + if value == nil { + ns.WorkspaceTransition, ns.Valid = "", false + return nil + } + ns.Valid = true + return ns.WorkspaceTransition.Scan(value) +} + +// Value implements the driver Valuer interface. +func (ns NullWorkspaceTransition) Value() (driver.Value, error) { + if !ns.Valid { + return nil, nil + } + return ns.WorkspaceTransition, nil +} + +func (e WorkspaceTransition) Valid() bool { + switch e { + case WorkspaceTransitionStart, + WorkspaceTransitionStop, + WorkspaceTransitionDelete: + return true + } + return false +} + +func AllWorkspaceTransitionValues() []WorkspaceTransition { + return []WorkspaceTransition{ + WorkspaceTransitionStart, + WorkspaceTransitionStop, + WorkspaceTransitionDelete, + } +} + type APIKey struct { ID string `db:"id" json:"id"` // hashed_secret contains a SHA256 hash of the key secret. This is considered a secret and MUST NOT be returned from the API as it is used for API key encryption in app proxying code. @@ -489,23 +1236,23 @@ type OrganizationMember struct { } type ParameterSchema struct { - ID uuid.UUID `db:"id" json:"id"` - CreatedAt time.Time `db:"created_at" json:"created_at"` - JobID uuid.UUID `db:"job_id" json:"job_id"` - Name string `db:"name" json:"name"` - Description string `db:"description" json:"description"` - DefaultSourceScheme ParameterSourceScheme `db:"default_source_scheme" json:"default_source_scheme"` - DefaultSourceValue string `db:"default_source_value" json:"default_source_value"` - AllowOverrideSource bool `db:"allow_override_source" json:"allow_override_source"` - DefaultDestinationScheme ParameterDestinationScheme `db:"default_destination_scheme" json:"default_destination_scheme"` - AllowOverrideDestination bool `db:"allow_override_destination" json:"allow_override_destination"` - DefaultRefresh string `db:"default_refresh" json:"default_refresh"` - RedisplayValue bool `db:"redisplay_value" json:"redisplay_value"` - ValidationError string `db:"validation_error" json:"validation_error"` - ValidationCondition string `db:"validation_condition" json:"validation_condition"` - ValidationTypeSystem ParameterTypeSystem `db:"validation_type_system" json:"validation_type_system"` - ValidationValueType string `db:"validation_value_type" json:"validation_value_type"` - Index int32 `db:"index" json:"index"` + ID uuid.UUID `db:"id" json:"id"` + CreatedAt time.Time `db:"created_at" json:"created_at"` + JobID uuid.UUID `db:"job_id" json:"job_id"` + Name string `db:"name" json:"name"` + Description string `db:"description" json:"description"` + DefaultSourceScheme NullParameterSourceScheme `db:"default_source_scheme" json:"default_source_scheme"` + DefaultSourceValue string `db:"default_source_value" json:"default_source_value"` + AllowOverrideSource bool `db:"allow_override_source" json:"allow_override_source"` + DefaultDestinationScheme NullParameterDestinationScheme `db:"default_destination_scheme" json:"default_destination_scheme"` + AllowOverrideDestination bool `db:"allow_override_destination" json:"allow_override_destination"` + DefaultRefresh string `db:"default_refresh" json:"default_refresh"` + RedisplayValue bool `db:"redisplay_value" json:"redisplay_value"` + ValidationError string `db:"validation_error" json:"validation_error"` + ValidationCondition string `db:"validation_condition" json:"validation_condition"` + ValidationTypeSystem ParameterTypeSystem `db:"validation_type_system" json:"validation_type_system"` + ValidationValueType string `db:"validation_value_type" json:"validation_value_type"` + Index int32 `db:"index" json:"index"` } type ParameterValue struct { diff --git a/coderd/database/querier.go b/coderd/database/querier.go index 9910644da6157..6a11205739c87 100644 --- a/coderd/database/querier.go +++ b/coderd/database/querier.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.13.0 +// sqlc v1.16.0 package database diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index 0ba92dd09326b..7da55c4b12fa3 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.13.0 +// sqlc v1.16.0 package database @@ -468,7 +468,7 @@ type GetAuditLogsOffsetRow struct { UserUsername sql.NullString `db:"user_username" json:"user_username"` UserEmail sql.NullString `db:"user_email" json:"user_email"` UserCreatedAt sql.NullTime `db:"user_created_at" json:"user_created_at"` - UserStatus UserStatus `db:"user_status" json:"user_status"` + UserStatus NullUserStatus `db:"user_status" json:"user_status"` UserRoles []string `db:"user_roles" json:"user_roles"` UserAvatarUrl sql.NullString `db:"user_avatar_url" json:"user_avatar_url"` Count int64 `db:"count" json:"count"` @@ -1910,23 +1910,23 @@ VALUES ` type InsertParameterSchemaParams struct { - ID uuid.UUID `db:"id" json:"id"` - CreatedAt time.Time `db:"created_at" json:"created_at"` - JobID uuid.UUID `db:"job_id" json:"job_id"` - Name string `db:"name" json:"name"` - Description string `db:"description" json:"description"` - DefaultSourceScheme ParameterSourceScheme `db:"default_source_scheme" json:"default_source_scheme"` - DefaultSourceValue string `db:"default_source_value" json:"default_source_value"` - AllowOverrideSource bool `db:"allow_override_source" json:"allow_override_source"` - DefaultDestinationScheme ParameterDestinationScheme `db:"default_destination_scheme" json:"default_destination_scheme"` - AllowOverrideDestination bool `db:"allow_override_destination" json:"allow_override_destination"` - DefaultRefresh string `db:"default_refresh" json:"default_refresh"` - RedisplayValue bool `db:"redisplay_value" json:"redisplay_value"` - ValidationError string `db:"validation_error" json:"validation_error"` - ValidationCondition string `db:"validation_condition" json:"validation_condition"` - ValidationTypeSystem ParameterTypeSystem `db:"validation_type_system" json:"validation_type_system"` - ValidationValueType string `db:"validation_value_type" json:"validation_value_type"` - Index int32 `db:"index" json:"index"` + ID uuid.UUID `db:"id" json:"id"` + CreatedAt time.Time `db:"created_at" json:"created_at"` + JobID uuid.UUID `db:"job_id" json:"job_id"` + Name string `db:"name" json:"name"` + Description string `db:"description" json:"description"` + DefaultSourceScheme NullParameterSourceScheme `db:"default_source_scheme" json:"default_source_scheme"` + DefaultSourceValue string `db:"default_source_value" json:"default_source_value"` + AllowOverrideSource bool `db:"allow_override_source" json:"allow_override_source"` + DefaultDestinationScheme NullParameterDestinationScheme `db:"default_destination_scheme" json:"default_destination_scheme"` + AllowOverrideDestination bool `db:"allow_override_destination" json:"allow_override_destination"` + DefaultRefresh string `db:"default_refresh" json:"default_refresh"` + RedisplayValue bool `db:"redisplay_value" json:"redisplay_value"` + ValidationError string `db:"validation_error" json:"validation_error"` + ValidationCondition string `db:"validation_condition" json:"validation_condition"` + ValidationTypeSystem ParameterTypeSystem `db:"validation_type_system" json:"validation_type_system"` + ValidationValueType string `db:"validation_value_type" json:"validation_value_type"` + Index int32 `db:"index" json:"index"` } func (q *sqlQuerier) InsertParameterSchema(ctx context.Context, arg InsertParameterSchemaParams) (ParameterSchema, error) { diff --git a/coderd/database/sqlc.yaml b/coderd/database/sqlc.yaml index 0c20b26063b97..e53fead06d0de 100644 --- a/coderd/database/sqlc.yaml +++ b/coderd/database/sqlc.yaml @@ -55,3 +55,5 @@ sql: emit_interface: true emit_json_tags: true emit_db_tags: true + emit_enum_valid_method: true + emit_all_enum_values: true diff --git a/codersdk/workspaceagents.go b/codersdk/workspaceagents.go index 93ac907ab445e..50528c0b2ac00 100644 --- a/codersdk/workspaceagents.go +++ b/codersdk/workspaceagents.go @@ -1,5 +1,6 @@ package codersdk + import ( "context" "encoding/json" From cc002a1a2516be59944f2d81d41cf1db3121b196 Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Thu, 19 Jan 2023 15:49:33 +0000 Subject: [PATCH 03/10] chore: Fix null issues --- coderd/audit.go | 2 +- coderd/database/databasefake/databasefake.go | 2 +- coderd/database/dump.sql | 4 +-- ..._sqlc_upgrade_fix_nullable_values.down.sql | 5 +++ ...90_sqlc_upgrade_fix_nullable_values.up.sql | 7 ++++ coderd/database/models.go | 34 +++++++++---------- coderd/database/queries.sql.go | 34 +++++++++---------- codersdk/workspaceagents.go | 1 - 8 files changed, 50 insertions(+), 39 deletions(-) create mode 100644 coderd/database/migrations/000090_sqlc_upgrade_fix_nullable_values.down.sql create mode 100644 coderd/database/migrations/000090_sqlc_upgrade_fix_nullable_values.up.sql diff --git a/coderd/audit.go b/coderd/audit.go index 185776c2ba1f3..b58b8df2fb64a 100644 --- a/coderd/audit.go +++ b/coderd/audit.go @@ -198,7 +198,7 @@ func (api *API) convertAuditLog(ctx context.Context, dblog database.GetAuditLogs Username: dblog.UserUsername.String, Email: dblog.UserEmail.String, CreatedAt: dblog.UserCreatedAt.Time, - Status: codersdk.UserStatus(dblog.UserStatus), + Status: codersdk.UserStatus(dblog.UserStatus.UserStatus), Roles: []codersdk.Role{}, AvatarURL: dblog.UserAvatarUrl.String, } diff --git a/coderd/database/databasefake/databasefake.go b/coderd/database/databasefake/databasefake.go index c2db0b9998f84..9a9d6557ac5a8 100644 --- a/coderd/database/databasefake/databasefake.go +++ b/coderd/database/databasefake/databasefake.go @@ -3324,7 +3324,7 @@ func (q *fakeQuerier) GetAuditLogsOffset(ctx context.Context, arg database.GetAu UserUsername: sql.NullString{String: user.Username, Valid: userValid}, UserEmail: sql.NullString{String: user.Email, Valid: userValid}, UserCreatedAt: sql.NullTime{Time: user.CreatedAt, Valid: userValid}, - UserStatus: user.Status, + UserStatus: database.NullUserStatus{UserStatus: user.Status, Valid: true}, UserRoles: user.RBACRoles, Count: 0, }) diff --git a/coderd/database/dump.sql b/coderd/database/dump.sql index 6ed5a26954b92..5f32d13f904c7 100644 --- a/coderd/database/dump.sql +++ b/coderd/database/dump.sql @@ -238,10 +238,10 @@ CREATE TABLE parameter_schemas ( job_id uuid NOT NULL, name character varying(64) NOT NULL, description character varying(8192) DEFAULT ''::character varying NOT NULL, - default_source_scheme parameter_source_scheme, + default_source_scheme parameter_source_scheme NOT NULL, default_source_value text NOT NULL, allow_override_source boolean NOT NULL, - default_destination_scheme parameter_destination_scheme, + default_destination_scheme parameter_destination_scheme NOT NULL, allow_override_destination boolean NOT NULL, default_refresh text NOT NULL, redisplay_value boolean NOT NULL, diff --git a/coderd/database/migrations/000090_sqlc_upgrade_fix_nullable_values.down.sql b/coderd/database/migrations/000090_sqlc_upgrade_fix_nullable_values.down.sql new file mode 100644 index 0000000000000..889a43c964eb1 --- /dev/null +++ b/coderd/database/migrations/000090_sqlc_upgrade_fix_nullable_values.down.sql @@ -0,0 +1,5 @@ +BEGIN; +ALTER TABLE parameter_schemas ALTER COLUMN default_source_scheme DROP NOT NULL; + +ALTER TABLE parameter_schemas ALTER COLUMN default_destination_scheme DROP NOT NULL; +COMMIT; diff --git a/coderd/database/migrations/000090_sqlc_upgrade_fix_nullable_values.up.sql b/coderd/database/migrations/000090_sqlc_upgrade_fix_nullable_values.up.sql new file mode 100644 index 0000000000000..fbceb2ca3d0f9 --- /dev/null +++ b/coderd/database/migrations/000090_sqlc_upgrade_fix_nullable_values.up.sql @@ -0,0 +1,7 @@ +BEGIN; +UPDATE parameter_schemas SET default_source_scheme = 'none' WHERE default_source_scheme IS NULL; +ALTER TABLE parameter_schemas ALTER COLUMN default_source_scheme SET NOT NULL; + +UPDATE parameter_schemas SET default_destination_scheme = 'none' WHERE default_destination_scheme IS NULL; +ALTER TABLE parameter_schemas ALTER COLUMN default_destination_scheme SET NOT NULL; +COMMIT; diff --git a/coderd/database/models.go b/coderd/database/models.go index 1717ac4d1f0b8..e2a9cf2c31845 100644 --- a/coderd/database/models.go +++ b/coderd/database/models.go @@ -1236,23 +1236,23 @@ type OrganizationMember struct { } type ParameterSchema struct { - ID uuid.UUID `db:"id" json:"id"` - CreatedAt time.Time `db:"created_at" json:"created_at"` - JobID uuid.UUID `db:"job_id" json:"job_id"` - Name string `db:"name" json:"name"` - Description string `db:"description" json:"description"` - DefaultSourceScheme NullParameterSourceScheme `db:"default_source_scheme" json:"default_source_scheme"` - DefaultSourceValue string `db:"default_source_value" json:"default_source_value"` - AllowOverrideSource bool `db:"allow_override_source" json:"allow_override_source"` - DefaultDestinationScheme NullParameterDestinationScheme `db:"default_destination_scheme" json:"default_destination_scheme"` - AllowOverrideDestination bool `db:"allow_override_destination" json:"allow_override_destination"` - DefaultRefresh string `db:"default_refresh" json:"default_refresh"` - RedisplayValue bool `db:"redisplay_value" json:"redisplay_value"` - ValidationError string `db:"validation_error" json:"validation_error"` - ValidationCondition string `db:"validation_condition" json:"validation_condition"` - ValidationTypeSystem ParameterTypeSystem `db:"validation_type_system" json:"validation_type_system"` - ValidationValueType string `db:"validation_value_type" json:"validation_value_type"` - Index int32 `db:"index" json:"index"` + ID uuid.UUID `db:"id" json:"id"` + CreatedAt time.Time `db:"created_at" json:"created_at"` + JobID uuid.UUID `db:"job_id" json:"job_id"` + Name string `db:"name" json:"name"` + Description string `db:"description" json:"description"` + DefaultSourceScheme ParameterSourceScheme `db:"default_source_scheme" json:"default_source_scheme"` + DefaultSourceValue string `db:"default_source_value" json:"default_source_value"` + AllowOverrideSource bool `db:"allow_override_source" json:"allow_override_source"` + DefaultDestinationScheme ParameterDestinationScheme `db:"default_destination_scheme" json:"default_destination_scheme"` + AllowOverrideDestination bool `db:"allow_override_destination" json:"allow_override_destination"` + DefaultRefresh string `db:"default_refresh" json:"default_refresh"` + RedisplayValue bool `db:"redisplay_value" json:"redisplay_value"` + ValidationError string `db:"validation_error" json:"validation_error"` + ValidationCondition string `db:"validation_condition" json:"validation_condition"` + ValidationTypeSystem ParameterTypeSystem `db:"validation_type_system" json:"validation_type_system"` + ValidationValueType string `db:"validation_value_type" json:"validation_value_type"` + Index int32 `db:"index" json:"index"` } type ParameterValue struct { diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index 7da55c4b12fa3..198ed29bd15a6 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -1910,23 +1910,23 @@ VALUES ` type InsertParameterSchemaParams struct { - ID uuid.UUID `db:"id" json:"id"` - CreatedAt time.Time `db:"created_at" json:"created_at"` - JobID uuid.UUID `db:"job_id" json:"job_id"` - Name string `db:"name" json:"name"` - Description string `db:"description" json:"description"` - DefaultSourceScheme NullParameterSourceScheme `db:"default_source_scheme" json:"default_source_scheme"` - DefaultSourceValue string `db:"default_source_value" json:"default_source_value"` - AllowOverrideSource bool `db:"allow_override_source" json:"allow_override_source"` - DefaultDestinationScheme NullParameterDestinationScheme `db:"default_destination_scheme" json:"default_destination_scheme"` - AllowOverrideDestination bool `db:"allow_override_destination" json:"allow_override_destination"` - DefaultRefresh string `db:"default_refresh" json:"default_refresh"` - RedisplayValue bool `db:"redisplay_value" json:"redisplay_value"` - ValidationError string `db:"validation_error" json:"validation_error"` - ValidationCondition string `db:"validation_condition" json:"validation_condition"` - ValidationTypeSystem ParameterTypeSystem `db:"validation_type_system" json:"validation_type_system"` - ValidationValueType string `db:"validation_value_type" json:"validation_value_type"` - Index int32 `db:"index" json:"index"` + ID uuid.UUID `db:"id" json:"id"` + CreatedAt time.Time `db:"created_at" json:"created_at"` + JobID uuid.UUID `db:"job_id" json:"job_id"` + Name string `db:"name" json:"name"` + Description string `db:"description" json:"description"` + DefaultSourceScheme ParameterSourceScheme `db:"default_source_scheme" json:"default_source_scheme"` + DefaultSourceValue string `db:"default_source_value" json:"default_source_value"` + AllowOverrideSource bool `db:"allow_override_source" json:"allow_override_source"` + DefaultDestinationScheme ParameterDestinationScheme `db:"default_destination_scheme" json:"default_destination_scheme"` + AllowOverrideDestination bool `db:"allow_override_destination" json:"allow_override_destination"` + DefaultRefresh string `db:"default_refresh" json:"default_refresh"` + RedisplayValue bool `db:"redisplay_value" json:"redisplay_value"` + ValidationError string `db:"validation_error" json:"validation_error"` + ValidationCondition string `db:"validation_condition" json:"validation_condition"` + ValidationTypeSystem ParameterTypeSystem `db:"validation_type_system" json:"validation_type_system"` + ValidationValueType string `db:"validation_value_type" json:"validation_value_type"` + Index int32 `db:"index" json:"index"` } func (q *sqlQuerier) InsertParameterSchema(ctx context.Context, arg InsertParameterSchemaParams) (ParameterSchema, error) { diff --git a/codersdk/workspaceagents.go b/codersdk/workspaceagents.go index 50528c0b2ac00..93ac907ab445e 100644 --- a/codersdk/workspaceagents.go +++ b/codersdk/workspaceagents.go @@ -1,6 +1,5 @@ package codersdk - import ( "context" "encoding/json" From 3cbb27621d7ac2611bc599aa9587213f9b136f74 Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Fri, 20 Jan 2023 09:18:13 +0000 Subject: [PATCH 04/10] fixup! chore: Fix null issues --- coderd/database/databasefake/databasefake.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coderd/database/databasefake/databasefake.go b/coderd/database/databasefake/databasefake.go index 9a9d6557ac5a8..92c099f29c915 100644 --- a/coderd/database/databasefake/databasefake.go +++ b/coderd/database/databasefake/databasefake.go @@ -3324,7 +3324,7 @@ func (q *fakeQuerier) GetAuditLogsOffset(ctx context.Context, arg database.GetAu UserUsername: sql.NullString{String: user.Username, Valid: userValid}, UserEmail: sql.NullString{String: user.Email, Valid: userValid}, UserCreatedAt: sql.NullTime{Time: user.CreatedAt, Valid: userValid}, - UserStatus: database.NullUserStatus{UserStatus: user.Status, Valid: true}, + UserStatus: database.NullUserStatus{UserStatus: user.Status, Valid: userValid}, UserRoles: user.RBACRoles, Count: 0, }) From d8c1d682a94aa274abb721a3bff5e59c4a489211 Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Fri, 20 Jan 2023 10:28:47 +0000 Subject: [PATCH 05/10] chore: Add enum validation to database fake --- coderd/database/databasefake/databasefake.go | 425 +++++++++++++++++++ 1 file changed, 425 insertions(+) diff --git a/coderd/database/databasefake/databasefake.go b/coderd/database/databasefake/databasefake.go index 92c099f29c915..280903665faf4 100644 --- a/coderd/database/databasefake/databasefake.go +++ b/coderd/database/databasefake/databasefake.go @@ -4,6 +4,8 @@ import ( "context" "database/sql" "encoding/json" + "fmt" + "reflect" "sort" "strings" "sync" @@ -129,6 +131,66 @@ type data struct { lastLicenseID int32 } +func validateDatabaseTypeWithValid(v reflect.Value) (handled bool, err error) { + if v.CanInterface() { + if !strings.Contains(v.Type().PkgPath(), "coderd/database") { + return true, nil + } + // Note: database.Null* types don't have a Valid method, so + // let's always skip them just in case. + if strings.HasPrefix(v.Type().Name(), "Null") { + return true, nil + } + if valid, ok := v.Interface().(interface{ Valid() bool }); ok { + if !valid.Valid() { + return true, xerrors.Errorf("invalid %s: %q", v.Type().Name(), v.Interface()) + } + } + return true, nil + } + return false, nil +} + +// validateDatabaseType uses reflect to check if struct properties are types +// with a Valid() bool fuction set. If so, call it and return an error +// if false. +// +// Note that we only check immediate values and struct fields. We do not +// recurse into nested structs. +func validateDatabaseType(args interface{}) error { + v := reflect.ValueOf(args) + + // Note: database.Null* types don't have a Valid method, we skip them here + // because their embedded types may have a Valid method and we don't want + // to bother with checking both that tha Valid field is true and that the + // type it embeds validates to true. We would need to check: + // + // dbNullEnum.Valid && dbNullEnum.Enum.Valid() + if strings.HasPrefix(v.Type().Name(), "Null") { + return nil + } + + if ok, err := validateDatabaseTypeWithValid(v); ok { + return err + } + var errs []string + switch v.Kind() { + case reflect.Struct: + for i := 0; i < v.NumField(); i++ { + field := v.Field(i) + if ok, err := validateDatabaseTypeWithValid(field); ok && err != nil { + errs = append(errs, fmt.Sprintf("%s.%s: %s", v.Type().Name(), v.Type().Field(i).Name, err.Error())) + } + } + if len(errs) > 0 { + return xerrors.Errorf("invalid database type fields:\n\t%s", strings.Join(errs, "\n\t")) + } + default: + panic(fmt.Sprintf("unhandled type: %s", v.Type().Name())) + } + return nil +} + func (fakeQuerier) IsFakeDB() {} func (*fakeQuerier) Ping(_ context.Context) (time.Duration, error) { return 0, nil @@ -142,6 +204,10 @@ func (q *fakeQuerier) InTx(fn func(database.Store) error, _ *sql.TxOptions) erro } func (q *fakeQuerier) AcquireProvisionerJob(_ context.Context, arg database.AcquireProvisionerJobParams) (database.ProvisionerJob, error) { + if err := validateDatabaseType(arg); err != nil { + return database.ProvisionerJob{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -198,6 +264,10 @@ func (*fakeQuerier) DeleteOldAgentStats(_ context.Context) error { } func (q *fakeQuerier) InsertAgentStat(_ context.Context, p database.InsertAgentStatParams) (database.AgentStat, error) { + if err := validateDatabaseType(p); err != nil { + return database.AgentStat{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -282,6 +352,10 @@ func (q *fakeQuerier) GetTemplateDAUs(_ context.Context, templateID uuid.UUID) ( } func (q *fakeQuerier) GetTemplateAverageBuildTime(ctx context.Context, arg database.GetTemplateAverageBuildTimeParams) (database.GetTemplateAverageBuildTimeRow, error) { + if err := validateDatabaseType(arg); err != nil { + return database.GetTemplateAverageBuildTimeRow{}, err + } + var emptyRow database.GetTemplateAverageBuildTimeRow var ( startTimes []float64 @@ -382,6 +456,10 @@ func (q *fakeQuerier) GetAPIKeysLastUsedAfter(_ context.Context, after time.Time } func (q *fakeQuerier) GetAPIKeysByLoginType(_ context.Context, t database.LoginType) ([]database.APIKey, error) { + if err := validateDatabaseType(t); err != nil { + return nil, err + } + q.mutex.RLock() defer q.mutex.RUnlock() @@ -423,6 +501,10 @@ func (q *fakeQuerier) DeleteAPIKeysByUserID(_ context.Context, userID uuid.UUID) } func (q *fakeQuerier) GetFileByHashAndCreator(_ context.Context, arg database.GetFileByHashAndCreatorParams) (database.File, error) { + if err := validateDatabaseType(arg); err != nil { + return database.File{}, err + } + q.mutex.RLock() defer q.mutex.RUnlock() @@ -447,6 +529,10 @@ func (q *fakeQuerier) GetFileByID(_ context.Context, id uuid.UUID) (database.Fil } func (q *fakeQuerier) GetUserByEmailOrUsername(_ context.Context, arg database.GetUserByEmailOrUsernameParams) (database.User, error) { + if err := validateDatabaseType(arg); err != nil { + return database.User{}, err + } + q.mutex.RLock() defer q.mutex.RUnlock() @@ -497,11 +583,18 @@ func (q *fakeQuerier) GetActiveUserCount(_ context.Context) (int64, error) { } func (q *fakeQuerier) GetFilteredUserCount(ctx context.Context, arg database.GetFilteredUserCountParams) (int64, error) { + if err := validateDatabaseType(arg); err != nil { + return 0, err + } count, err := q.GetAuthorizedUserCount(ctx, arg, nil) return count, err } func (q *fakeQuerier) GetAuthorizedUserCount(ctx context.Context, params database.GetFilteredUserCountParams, prepared rbac.PreparedAuthorized) (int64, error) { + if err := validateDatabaseType(params); err != nil { + return 0, err + } + q.mutex.RLock() defer q.mutex.RUnlock() @@ -564,6 +657,10 @@ func (q *fakeQuerier) GetAuthorizedUserCount(ctx context.Context, params databas } func (q *fakeQuerier) UpdateUserDeletedByID(_ context.Context, params database.UpdateUserDeletedByIDParams) error { + if err := validateDatabaseType(params); err != nil { + return err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -578,6 +675,10 @@ func (q *fakeQuerier) UpdateUserDeletedByID(_ context.Context, params database.U } func (q *fakeQuerier) GetUsers(_ context.Context, params database.GetUsersParams) ([]database.GetUsersRow, error) { + if err := validateDatabaseType(params); err != nil { + return nil, err + } + q.mutex.RLock() defer q.mutex.RUnlock() @@ -757,6 +858,10 @@ func (q *fakeQuerier) GetAuthorizationUserRoles(_ context.Context, userID uuid.U } func (q *fakeQuerier) GetWorkspaces(ctx context.Context, arg database.GetWorkspacesParams) ([]database.GetWorkspacesRow, error) { + if err := validateDatabaseType(arg); err != nil { + return nil, err + } + // A nil auth filter means no auth filter. workspaceRows, err := q.GetAuthorizedWorkspaces(ctx, arg, nil) return workspaceRows, err @@ -764,6 +869,10 @@ func (q *fakeQuerier) GetWorkspaces(ctx context.Context, arg database.GetWorkspa //nolint:gocyclo func (q *fakeQuerier) GetAuthorizedWorkspaces(ctx context.Context, arg database.GetWorkspacesParams, prepared rbac.PreparedAuthorized) ([]database.GetWorkspacesRow, error) { + if err := validateDatabaseType(arg); err != nil { + return nil, err + } + q.mutex.RLock() defer q.mutex.RUnlock() @@ -1074,6 +1183,10 @@ func (q *fakeQuerier) GetWorkspaceByAgentID(_ context.Context, agentID uuid.UUID } func (q *fakeQuerier) GetWorkspaceByOwnerIDAndName(_ context.Context, arg database.GetWorkspaceByOwnerIDAndNameParams) (database.Workspace, error) { + if err := validateDatabaseType(arg); err != nil { + return database.Workspace{}, err + } + q.mutex.RLock() defer q.mutex.RUnlock() @@ -1295,6 +1408,10 @@ func (q *fakeQuerier) GetLatestWorkspaceBuildsByWorkspaceIDs(_ context.Context, func (q *fakeQuerier) GetWorkspaceBuildsByWorkspaceID(_ context.Context, params database.GetWorkspaceBuildsByWorkspaceIDParams, ) ([]database.WorkspaceBuild, error) { + if err := validateDatabaseType(params); err != nil { + return nil, err + } + q.mutex.RLock() defer q.mutex.RUnlock() @@ -1352,6 +1469,10 @@ func (q *fakeQuerier) GetWorkspaceBuildsByWorkspaceID(_ context.Context, } func (q *fakeQuerier) GetWorkspaceBuildByWorkspaceIDAndBuildNumber(_ context.Context, arg database.GetWorkspaceBuildByWorkspaceIDAndBuildNumberParams) (database.WorkspaceBuild, error) { + if err := validateDatabaseType(arg); err != nil { + return database.WorkspaceBuild{}, err + } + q.mutex.RLock() defer q.mutex.RUnlock() @@ -1451,6 +1572,10 @@ func (q *fakeQuerier) GetOrganizationsByUserID(_ context.Context, userID uuid.UU } func (q *fakeQuerier) ParameterValues(_ context.Context, arg database.ParameterValuesParams) ([]database.ParameterValue, error) { + if err := validateDatabaseType(arg); err != nil { + return nil, err + } + q.mutex.RLock() defer q.mutex.RUnlock() @@ -1493,6 +1618,10 @@ func (q *fakeQuerier) GetTemplateByID(_ context.Context, id uuid.UUID) (database } func (q *fakeQuerier) GetTemplateByOrganizationAndName(_ context.Context, arg database.GetTemplateByOrganizationAndNameParams) (database.Template, error) { + if err := validateDatabaseType(arg); err != nil { + return database.Template{}, err + } + q.mutex.RLock() defer q.mutex.RUnlock() @@ -1512,6 +1641,10 @@ func (q *fakeQuerier) GetTemplateByOrganizationAndName(_ context.Context, arg da } func (q *fakeQuerier) UpdateTemplateMetaByID(_ context.Context, arg database.UpdateTemplateMetaByIDParams) (database.Template, error) { + if err := validateDatabaseType(arg); err != nil { + return database.Template{}, err + } + q.mutex.RLock() defer q.mutex.RUnlock() @@ -1533,10 +1666,18 @@ func (q *fakeQuerier) UpdateTemplateMetaByID(_ context.Context, arg database.Upd } func (q *fakeQuerier) GetTemplatesWithFilter(ctx context.Context, arg database.GetTemplatesWithFilterParams) ([]database.Template, error) { + if err := validateDatabaseType(arg); err != nil { + return nil, err + } + return q.GetAuthorizedTemplates(ctx, arg, nil) } func (q *fakeQuerier) GetAuthorizedTemplates(ctx context.Context, arg database.GetTemplatesWithFilterParams, prepared rbac.PreparedAuthorized) ([]database.Template, error) { + if err := validateDatabaseType(arg); err != nil { + return nil, err + } + q.mutex.RLock() defer q.mutex.RUnlock() @@ -1585,6 +1726,10 @@ func (q *fakeQuerier) GetAuthorizedTemplates(ctx context.Context, arg database.G } func (q *fakeQuerier) GetTemplateVersionsByTemplateID(_ context.Context, arg database.GetTemplateVersionsByTemplateIDParams) (version []database.TemplateVersion, err error) { + if err := validateDatabaseType(arg); err != nil { + return version, err + } + q.mutex.RLock() defer q.mutex.RUnlock() @@ -1657,6 +1802,10 @@ func (q *fakeQuerier) GetTemplateVersionsCreatedAfter(_ context.Context, after t } func (q *fakeQuerier) GetTemplateVersionByTemplateIDAndName(_ context.Context, arg database.GetTemplateVersionByTemplateIDAndNameParams) (database.TemplateVersion, error) { + if err := validateDatabaseType(arg); err != nil { + return database.TemplateVersion{}, err + } + q.mutex.RLock() defer q.mutex.RUnlock() @@ -1687,6 +1836,10 @@ func (q *fakeQuerier) GetTemplateVersionParameters(_ context.Context, templateVe } func (q *fakeQuerier) GetTemplateVersionByOrganizationAndName(_ context.Context, arg database.GetTemplateVersionByOrganizationAndNameParams) (database.TemplateVersion, error) { + if err := validateDatabaseType(arg); err != nil { + return database.TemplateVersion{}, err + } + q.mutex.RLock() defer q.mutex.RUnlock() @@ -1749,6 +1902,10 @@ func (q *fakeQuerier) GetTemplateVersionByJobID(_ context.Context, jobID uuid.UU } func (q *fakeQuerier) GetPreviousTemplateVersion(_ context.Context, arg database.GetPreviousTemplateVersionParams) (database.TemplateVersion, error) { + if err := validateDatabaseType(arg); err != nil { + return database.TemplateVersion{}, err + } + q.mutex.RLock() defer q.mutex.RUnlock() @@ -1829,6 +1986,10 @@ func (q *fakeQuerier) GetParameterSchemasCreatedAfter(_ context.Context, after t } func (q *fakeQuerier) GetParameterValueByScopeAndName(_ context.Context, arg database.GetParameterValueByScopeAndNameParams) (database.ParameterValue, error) { + if err := validateDatabaseType(arg); err != nil { + return database.ParameterValue{}, err + } + q.mutex.RLock() defer q.mutex.RUnlock() @@ -1941,6 +2102,10 @@ func (q *fakeQuerier) GetTemplateGroupRoles(_ context.Context, id uuid.UUID) ([] } func (q *fakeQuerier) GetOrganizationMemberByUserID(_ context.Context, arg database.GetOrganizationMemberByUserIDParams) (database.OrganizationMember, error) { + if err := validateDatabaseType(arg); err != nil { + return database.OrganizationMember{}, err + } + q.mutex.RLock() defer q.mutex.RUnlock() @@ -1995,6 +2160,10 @@ func (q *fakeQuerier) GetOrganizationMembershipsByUserID(_ context.Context, user } func (q *fakeQuerier) UpdateMemberRoles(_ context.Context, arg database.UpdateMemberRolesParams) (database.OrganizationMember, error) { + if err := validateDatabaseType(arg); err != nil { + return database.OrganizationMember{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2102,6 +2271,10 @@ func (q *fakeQuerier) GetWorkspaceAgentsCreatedAfter(_ context.Context, after ti } func (q *fakeQuerier) GetWorkspaceAppByAgentIDAndSlug(_ context.Context, arg database.GetWorkspaceAppByAgentIDAndSlugParams) (database.WorkspaceApp, error) { + if err := validateDatabaseType(arg); err != nil { + return database.WorkspaceApp{}, err + } + q.mutex.RLock() defer q.mutex.RUnlock() @@ -2271,6 +2444,10 @@ func (q *fakeQuerier) GetProvisionerJobsCreatedAfter(_ context.Context, after ti } func (q *fakeQuerier) GetProvisionerLogsByIDBetween(_ context.Context, arg database.GetProvisionerLogsByIDBetweenParams) ([]database.ProvisionerJobLog, error) { + if err := validateDatabaseType(arg); err != nil { + return nil, err + } + q.mutex.RLock() defer q.mutex.RUnlock() @@ -2291,6 +2468,10 @@ func (q *fakeQuerier) GetProvisionerLogsByIDBetween(_ context.Context, arg datab } func (q *fakeQuerier) InsertAPIKey(_ context.Context, arg database.InsertAPIKeyParams) (database.APIKey, error) { + if err := validateDatabaseType(arg); err != nil { + return database.APIKey{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2317,6 +2498,10 @@ func (q *fakeQuerier) InsertAPIKey(_ context.Context, arg database.InsertAPIKeyP } func (q *fakeQuerier) InsertFile(_ context.Context, arg database.InsertFileParams) (database.File, error) { + if err := validateDatabaseType(arg); err != nil { + return database.File{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2334,6 +2519,10 @@ func (q *fakeQuerier) InsertFile(_ context.Context, arg database.InsertFileParam } func (q *fakeQuerier) InsertOrganization(_ context.Context, arg database.InsertOrganizationParams) (database.Organization, error) { + if err := validateDatabaseType(arg); err != nil { + return database.Organization{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2348,6 +2537,10 @@ func (q *fakeQuerier) InsertOrganization(_ context.Context, arg database.InsertO } func (q *fakeQuerier) InsertOrganizationMember(_ context.Context, arg database.InsertOrganizationMemberParams) (database.OrganizationMember, error) { + if err := validateDatabaseType(arg); err != nil { + return database.OrganizationMember{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2364,6 +2557,10 @@ func (q *fakeQuerier) InsertOrganizationMember(_ context.Context, arg database.I } func (q *fakeQuerier) InsertParameterValue(_ context.Context, arg database.InsertParameterValueParams) (database.ParameterValue, error) { + if err := validateDatabaseType(arg); err != nil { + return database.ParameterValue{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2384,6 +2581,10 @@ func (q *fakeQuerier) InsertParameterValue(_ context.Context, arg database.Inser } func (q *fakeQuerier) InsertTemplate(_ context.Context, arg database.InsertTemplateParams) (database.Template, error) { + if err := validateDatabaseType(arg); err != nil { + return database.Template{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2409,6 +2610,10 @@ func (q *fakeQuerier) InsertTemplate(_ context.Context, arg database.InsertTempl } func (q *fakeQuerier) InsertTemplateVersion(_ context.Context, arg database.InsertTemplateVersionParams) (database.TemplateVersion, error) { + if err := validateDatabaseType(arg); err != nil { + return database.TemplateVersion{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2429,6 +2634,10 @@ func (q *fakeQuerier) InsertTemplateVersion(_ context.Context, arg database.Inse } func (q *fakeQuerier) InsertTemplateVersionParameter(_ context.Context, arg database.InsertTemplateVersionParameterParams) (database.TemplateVersionParameter, error) { + if err := validateDatabaseType(arg); err != nil { + return database.TemplateVersionParameter{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2451,6 +2660,10 @@ func (q *fakeQuerier) InsertTemplateVersionParameter(_ context.Context, arg data } func (q *fakeQuerier) InsertProvisionerJobLogs(_ context.Context, arg database.InsertProvisionerJobLogsParams) ([]database.ProvisionerJobLog, error) { + if err := validateDatabaseType(arg); err != nil { + return nil, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2476,6 +2689,10 @@ func (q *fakeQuerier) InsertProvisionerJobLogs(_ context.Context, arg database.I } func (q *fakeQuerier) InsertParameterSchema(_ context.Context, arg database.InsertParameterSchemaParams) (database.ParameterSchema, error) { + if err := validateDatabaseType(arg); err != nil { + return database.ParameterSchema{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2504,6 +2721,10 @@ func (q *fakeQuerier) InsertParameterSchema(_ context.Context, arg database.Inse } func (q *fakeQuerier) InsertProvisionerDaemon(_ context.Context, arg database.InsertProvisionerDaemonParams) (database.ProvisionerDaemon, error) { + if err := validateDatabaseType(arg); err != nil { + return database.ProvisionerDaemon{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2519,6 +2740,10 @@ func (q *fakeQuerier) InsertProvisionerDaemon(_ context.Context, arg database.In } func (q *fakeQuerier) InsertProvisionerJob(_ context.Context, arg database.InsertProvisionerJobParams) (database.ProvisionerJob, error) { + if err := validateDatabaseType(arg); err != nil { + return database.ProvisionerJob{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2540,6 +2765,10 @@ func (q *fakeQuerier) InsertProvisionerJob(_ context.Context, arg database.Inser } func (q *fakeQuerier) InsertWorkspaceAgent(_ context.Context, arg database.InsertWorkspaceAgentParams) (database.WorkspaceAgent, error) { + if err := validateDatabaseType(arg); err != nil { + return database.WorkspaceAgent{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2568,6 +2797,10 @@ func (q *fakeQuerier) InsertWorkspaceAgent(_ context.Context, arg database.Inser } func (q *fakeQuerier) InsertWorkspaceResource(_ context.Context, arg database.InsertWorkspaceResourceParams) (database.WorkspaceResource, error) { + if err := validateDatabaseType(arg); err != nil { + return database.WorkspaceResource{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2588,6 +2821,10 @@ func (q *fakeQuerier) InsertWorkspaceResource(_ context.Context, arg database.In } func (q *fakeQuerier) InsertWorkspaceResourceMetadata(_ context.Context, arg database.InsertWorkspaceResourceMetadataParams) ([]database.WorkspaceResourceMetadatum, error) { + if err := validateDatabaseType(arg); err != nil { + return nil, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2615,6 +2852,10 @@ func (q *fakeQuerier) InsertWorkspaceResourceMetadata(_ context.Context, arg dat } func (q *fakeQuerier) InsertUser(_ context.Context, arg database.InsertUserParams) (database.User, error) { + if err := validateDatabaseType(arg); err != nil { + return database.User{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2640,6 +2881,10 @@ func (q *fakeQuerier) InsertUser(_ context.Context, arg database.InsertUserParam } func (q *fakeQuerier) UpdateUserRoles(_ context.Context, arg database.UpdateUserRolesParams) (database.User, error) { + if err := validateDatabaseType(arg); err != nil { + return database.User{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2670,6 +2915,10 @@ func (q *fakeQuerier) UpdateUserRoles(_ context.Context, arg database.UpdateUser } func (q *fakeQuerier) UpdateUserProfile(_ context.Context, arg database.UpdateUserProfileParams) (database.User, error) { + if err := validateDatabaseType(arg); err != nil { + return database.User{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2687,6 +2936,10 @@ func (q *fakeQuerier) UpdateUserProfile(_ context.Context, arg database.UpdateUs } func (q *fakeQuerier) UpdateUserStatus(_ context.Context, arg database.UpdateUserStatusParams) (database.User, error) { + if err := validateDatabaseType(arg); err != nil { + return database.User{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2703,6 +2956,10 @@ func (q *fakeQuerier) UpdateUserStatus(_ context.Context, arg database.UpdateUse } func (q *fakeQuerier) UpdateUserLastSeenAt(_ context.Context, arg database.UpdateUserLastSeenAtParams) (database.User, error) { + if err := validateDatabaseType(arg); err != nil { + return database.User{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2719,6 +2976,10 @@ func (q *fakeQuerier) UpdateUserLastSeenAt(_ context.Context, arg database.Updat } func (q *fakeQuerier) UpdateUserHashedPassword(_ context.Context, arg database.UpdateUserHashedPasswordParams) error { + if err := validateDatabaseType(arg); err != nil { + return err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2734,6 +2995,10 @@ func (q *fakeQuerier) UpdateUserHashedPassword(_ context.Context, arg database.U } func (q *fakeQuerier) InsertWorkspace(_ context.Context, arg database.InsertWorkspaceParams) (database.Workspace, error) { + if err := validateDatabaseType(arg); err != nil { + return database.Workspace{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2754,6 +3019,10 @@ func (q *fakeQuerier) InsertWorkspace(_ context.Context, arg database.InsertWork } func (q *fakeQuerier) InsertWorkspaceBuild(_ context.Context, arg database.InsertWorkspaceBuildParams) (database.WorkspaceBuild, error) { + if err := validateDatabaseType(arg); err != nil { + return database.WorkspaceBuild{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2776,6 +3045,10 @@ func (q *fakeQuerier) InsertWorkspaceBuild(_ context.Context, arg database.Inser } func (q *fakeQuerier) InsertWorkspaceBuildParameters(_ context.Context, arg database.InsertWorkspaceBuildParametersParams) error { + if err := validateDatabaseType(arg); err != nil { + return err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2790,6 +3063,10 @@ func (q *fakeQuerier) InsertWorkspaceBuildParameters(_ context.Context, arg data } func (q *fakeQuerier) InsertWorkspaceApp(_ context.Context, arg database.InsertWorkspaceAppParams) (database.WorkspaceApp, error) { + if err := validateDatabaseType(arg); err != nil { + return database.WorkspaceApp{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2820,6 +3097,10 @@ func (q *fakeQuerier) InsertWorkspaceApp(_ context.Context, arg database.InsertW } func (q *fakeQuerier) UpdateWorkspaceAppHealthByID(_ context.Context, arg database.UpdateWorkspaceAppHealthByIDParams) error { + if err := validateDatabaseType(arg); err != nil { + return err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2835,6 +3116,10 @@ func (q *fakeQuerier) UpdateWorkspaceAppHealthByID(_ context.Context, arg databa } func (q *fakeQuerier) UpdateAPIKeyByID(_ context.Context, arg database.UpdateAPIKeyByIDParams) error { + if err := validateDatabaseType(arg); err != nil { + return err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2852,6 +3137,10 @@ func (q *fakeQuerier) UpdateAPIKeyByID(_ context.Context, arg database.UpdateAPI } func (q *fakeQuerier) UpdateTemplateActiveVersionByID(_ context.Context, arg database.UpdateTemplateActiveVersionByIDParams) error { + if err := validateDatabaseType(arg); err != nil { + return err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2868,6 +3157,10 @@ func (q *fakeQuerier) UpdateTemplateActiveVersionByID(_ context.Context, arg dat } func (q *fakeQuerier) UpdateTemplateDeletedByID(_ context.Context, arg database.UpdateTemplateDeletedByIDParams) error { + if err := validateDatabaseType(arg); err != nil { + return err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2884,6 +3177,10 @@ func (q *fakeQuerier) UpdateTemplateDeletedByID(_ context.Context, arg database. } func (q *fakeQuerier) UpdateTemplateACLByID(_ context.Context, arg database.UpdateTemplateACLByIDParams) (database.Template, error) { + if err := validateDatabaseType(arg); err != nil { + return database.Template{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2901,6 +3198,10 @@ func (q *fakeQuerier) UpdateTemplateACLByID(_ context.Context, arg database.Upda } func (q *fakeQuerier) UpdateTemplateVersionByID(_ context.Context, arg database.UpdateTemplateVersionByIDParams) error { + if err := validateDatabaseType(arg); err != nil { + return err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2917,6 +3218,10 @@ func (q *fakeQuerier) UpdateTemplateVersionByID(_ context.Context, arg database. } func (q *fakeQuerier) UpdateTemplateVersionDescriptionByJobID(_ context.Context, arg database.UpdateTemplateVersionDescriptionByJobIDParams) error { + if err := validateDatabaseType(arg); err != nil { + return err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2933,6 +3238,10 @@ func (q *fakeQuerier) UpdateTemplateVersionDescriptionByJobID(_ context.Context, } func (q *fakeQuerier) UpdateProvisionerDaemonByID(_ context.Context, arg database.UpdateProvisionerDaemonByIDParams) error { + if err := validateDatabaseType(arg); err != nil { + return err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2949,6 +3258,10 @@ func (q *fakeQuerier) UpdateProvisionerDaemonByID(_ context.Context, arg databas } func (q *fakeQuerier) UpdateWorkspaceAgentConnectionByID(_ context.Context, arg database.UpdateWorkspaceAgentConnectionByIDParams) error { + if err := validateDatabaseType(arg); err != nil { + return err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2967,6 +3280,10 @@ func (q *fakeQuerier) UpdateWorkspaceAgentConnectionByID(_ context.Context, arg } func (q *fakeQuerier) UpdateWorkspaceAgentVersionByID(_ context.Context, arg database.UpdateWorkspaceAgentVersionByIDParams) error { + if err := validateDatabaseType(arg); err != nil { + return err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2983,6 +3300,10 @@ func (q *fakeQuerier) UpdateWorkspaceAgentVersionByID(_ context.Context, arg dat } func (q *fakeQuerier) UpdateProvisionerJobByID(_ context.Context, arg database.UpdateProvisionerJobByIDParams) error { + if err := validateDatabaseType(arg); err != nil { + return err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -2998,6 +3319,10 @@ func (q *fakeQuerier) UpdateProvisionerJobByID(_ context.Context, arg database.U } func (q *fakeQuerier) UpdateProvisionerJobWithCancelByID(_ context.Context, arg database.UpdateProvisionerJobWithCancelByIDParams) error { + if err := validateDatabaseType(arg); err != nil { + return err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -3014,6 +3339,10 @@ func (q *fakeQuerier) UpdateProvisionerJobWithCancelByID(_ context.Context, arg } func (q *fakeQuerier) UpdateProvisionerJobWithCompleteByID(_ context.Context, arg database.UpdateProvisionerJobWithCompleteByIDParams) error { + if err := validateDatabaseType(arg); err != nil { + return err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -3031,6 +3360,10 @@ func (q *fakeQuerier) UpdateProvisionerJobWithCompleteByID(_ context.Context, ar } func (q *fakeQuerier) UpdateWorkspace(_ context.Context, arg database.UpdateWorkspaceParams) (database.Workspace, error) { + if err := validateDatabaseType(arg); err != nil { + return database.Workspace{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -3057,6 +3390,10 @@ func (q *fakeQuerier) UpdateWorkspace(_ context.Context, arg database.UpdateWork } func (q *fakeQuerier) UpdateWorkspaceAutostart(_ context.Context, arg database.UpdateWorkspaceAutostartParams) error { + if err := validateDatabaseType(arg); err != nil { + return err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -3073,6 +3410,10 @@ func (q *fakeQuerier) UpdateWorkspaceAutostart(_ context.Context, arg database.U } func (q *fakeQuerier) UpdateWorkspaceTTL(_ context.Context, arg database.UpdateWorkspaceTTLParams) error { + if err := validateDatabaseType(arg); err != nil { + return err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -3089,6 +3430,10 @@ func (q *fakeQuerier) UpdateWorkspaceTTL(_ context.Context, arg database.UpdateW } func (q *fakeQuerier) UpdateWorkspaceLastUsedAt(_ context.Context, arg database.UpdateWorkspaceLastUsedAtParams) error { + if err := validateDatabaseType(arg); err != nil { + return err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -3105,6 +3450,10 @@ func (q *fakeQuerier) UpdateWorkspaceLastUsedAt(_ context.Context, arg database. } func (q *fakeQuerier) UpdateWorkspaceBuildByID(_ context.Context, arg database.UpdateWorkspaceBuildByIDParams) (database.WorkspaceBuild, error) { + if err := validateDatabaseType(arg); err != nil { + return database.WorkspaceBuild{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -3122,6 +3471,10 @@ func (q *fakeQuerier) UpdateWorkspaceBuildByID(_ context.Context, arg database.U } func (q *fakeQuerier) UpdateWorkspaceBuildCostByID(_ context.Context, arg database.UpdateWorkspaceBuildCostByIDParams) (database.WorkspaceBuild, error) { + if err := validateDatabaseType(arg); err != nil { + return database.WorkspaceBuild{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -3137,6 +3490,10 @@ func (q *fakeQuerier) UpdateWorkspaceBuildCostByID(_ context.Context, arg databa } func (q *fakeQuerier) UpdateWorkspaceDeletedByID(_ context.Context, arg database.UpdateWorkspaceDeletedByIDParams) error { + if err := validateDatabaseType(arg); err != nil { + return err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -3152,6 +3509,10 @@ func (q *fakeQuerier) UpdateWorkspaceDeletedByID(_ context.Context, arg database } func (q *fakeQuerier) InsertGitSSHKey(_ context.Context, arg database.InsertGitSSHKeyParams) (database.GitSSHKey, error) { + if err := validateDatabaseType(arg); err != nil { + return database.GitSSHKey{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -3180,6 +3541,10 @@ func (q *fakeQuerier) GetGitSSHKey(_ context.Context, userID uuid.UUID) (databas } func (q *fakeQuerier) UpdateGitSSHKey(_ context.Context, arg database.UpdateGitSSHKeyParams) (database.GitSSHKey, error) { + if err := validateDatabaseType(arg); err != nil { + return database.GitSSHKey{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -3197,6 +3562,10 @@ func (q *fakeQuerier) UpdateGitSSHKey(_ context.Context, arg database.UpdateGitS } func (q *fakeQuerier) InsertGroupMember(_ context.Context, arg database.InsertGroupMemberParams) error { + if err := validateDatabaseType(arg); err != nil { + return err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -3229,6 +3598,10 @@ func (q *fakeQuerier) DeleteGroupMember(_ context.Context, userID uuid.UUID) err } func (q *fakeQuerier) UpdateGroupByID(_ context.Context, arg database.UpdateGroupByIDParams) (database.Group, error) { + if err := validateDatabaseType(arg); err != nil { + return database.Group{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -3260,6 +3633,10 @@ func (q *fakeQuerier) DeleteGitSSHKey(_ context.Context, userID uuid.UUID) error } func (q *fakeQuerier) GetAuditLogsOffset(ctx context.Context, arg database.GetAuditLogsOffsetParams) ([]database.GetAuditLogsOffsetRow, error) { + if err := validateDatabaseType(arg); err != nil { + return nil, err + } + q.mutex.RLock() defer q.mutex.RUnlock() @@ -3343,6 +3720,10 @@ func (q *fakeQuerier) GetAuditLogsOffset(ctx context.Context, arg database.GetAu } func (q *fakeQuerier) InsertAuditLog(_ context.Context, arg database.InsertAuditLogParams) (database.AuditLog, error) { + if err := validateDatabaseType(arg); err != nil { + return database.AuditLog{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -3445,6 +3826,10 @@ func (q *fakeQuerier) GetLogoURL(_ context.Context) (string, error) { func (q *fakeQuerier) InsertLicense( _ context.Context, arg database.InsertLicenseParams, ) (database.License, error) { + if err := validateDatabaseType(arg); err != nil { + return database.License{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -3510,6 +3895,10 @@ func (q *fakeQuerier) GetUserLinkByLinkedID(_ context.Context, id string) (datab } func (q *fakeQuerier) GetUserLinkByUserIDLoginType(_ context.Context, params database.GetUserLinkByUserIDLoginTypeParams) (database.UserLink, error) { + if err := validateDatabaseType(params); err != nil { + return database.UserLink{}, err + } + q.mutex.RLock() defer q.mutex.RUnlock() @@ -3541,6 +3930,10 @@ func (q *fakeQuerier) InsertUserLink(_ context.Context, args database.InsertUser } func (q *fakeQuerier) UpdateUserLinkedID(_ context.Context, params database.UpdateUserLinkedIDParams) (database.UserLink, error) { + if err := validateDatabaseType(params); err != nil { + return database.UserLink{}, err + } + q.mutex.RLock() defer q.mutex.RUnlock() @@ -3557,6 +3950,10 @@ func (q *fakeQuerier) UpdateUserLinkedID(_ context.Context, params database.Upda } func (q *fakeQuerier) UpdateUserLink(_ context.Context, params database.UpdateUserLinkParams) (database.UserLink, error) { + if err := validateDatabaseType(params); err != nil { + return database.UserLink{}, err + } + q.mutex.RLock() defer q.mutex.RUnlock() @@ -3588,6 +3985,10 @@ func (q *fakeQuerier) GetGroupByID(_ context.Context, id uuid.UUID) (database.Gr } func (q *fakeQuerier) GetGroupByOrgAndName(_ context.Context, arg database.GetGroupByOrgAndNameParams) (database.Group, error) { + if err := validateDatabaseType(arg); err != nil { + return database.Group{}, err + } + q.mutex.RLock() defer q.mutex.RUnlock() @@ -3610,6 +4011,10 @@ func (q *fakeQuerier) InsertAllUsersGroup(ctx context.Context, orgID uuid.UUID) } func (q *fakeQuerier) InsertGroup(_ context.Context, arg database.InsertGroupParams) (database.Group, error) { + if err := validateDatabaseType(arg); err != nil { + return database.Group{}, err + } + q.mutex.RLock() defer q.mutex.RUnlock() @@ -3724,6 +4129,10 @@ func (q *fakeQuerier) DeleteReplicasUpdatedBefore(_ context.Context, before time } func (q *fakeQuerier) InsertReplica(_ context.Context, arg database.InsertReplicaParams) (database.Replica, error) { + if err := validateDatabaseType(arg); err != nil { + return database.Replica{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -3743,6 +4152,10 @@ func (q *fakeQuerier) InsertReplica(_ context.Context, arg database.InsertReplic } func (q *fakeQuerier) UpdateReplica(_ context.Context, arg database.UpdateReplicaParams) (database.Replica, error) { + if err := validateDatabaseType(arg); err != nil { + return database.Replica{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() @@ -3778,6 +4191,10 @@ func (q *fakeQuerier) GetReplicasUpdatedAfter(_ context.Context, updatedAt time. } func (q *fakeQuerier) GetGitAuthLink(_ context.Context, arg database.GetGitAuthLinkParams) (database.GitAuthLink, error) { + if err := validateDatabaseType(arg); err != nil { + return database.GitAuthLink{}, err + } + q.mutex.RLock() defer q.mutex.RUnlock() for _, gitAuthLink := range q.gitAuthLinks { @@ -3793,6 +4210,10 @@ func (q *fakeQuerier) GetGitAuthLink(_ context.Context, arg database.GetGitAuthL } func (q *fakeQuerier) InsertGitAuthLink(_ context.Context, arg database.InsertGitAuthLinkParams) (database.GitAuthLink, error) { + if err := validateDatabaseType(arg); err != nil { + return database.GitAuthLink{}, err + } + q.mutex.Lock() defer q.mutex.Unlock() // nolint:gosimple @@ -3810,6 +4231,10 @@ func (q *fakeQuerier) InsertGitAuthLink(_ context.Context, arg database.InsertGi } func (q *fakeQuerier) UpdateGitAuthLink(_ context.Context, arg database.UpdateGitAuthLinkParams) error { + if err := validateDatabaseType(arg); err != nil { + return err + } + q.mutex.Lock() defer q.mutex.Unlock() for index, gitAuthLink := range q.gitAuthLinks { From 8d143c0b55f1d4323c0c3393a3808b087eeee1a2 Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Fri, 20 Jan 2023 10:59:37 +0000 Subject: [PATCH 06/10] chore: Fix Telemetry test DB inserts --- coderd/telemetry/telemetry_test.go | 76 +++++++++++++++++++----------- 1 file changed, 48 insertions(+), 28 deletions(-) diff --git a/coderd/telemetry/telemetry_test.go b/coderd/telemetry/telemetry_test.go index 5cdc36f22df95..3df1ba9776b3e 100644 --- a/coderd/telemetry/telemetry_test.go +++ b/coderd/telemetry/telemetry_test.go @@ -11,6 +11,7 @@ import ( "github.com/go-chi/chi" "github.com/google/uuid" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.uber.org/goleak" @@ -30,64 +31,82 @@ func TestTelemetry(t *testing.T) { t.Parallel() t.Run("Snapshot", func(t *testing.T) { t.Parallel() + + var err error + db := databasefake.New() + ctx := context.Background() - _, err := db.InsertAPIKey(ctx, database.InsertAPIKeyParams{ - ID: uuid.NewString(), - LastUsed: database.Now(), - Scope: database.APIKeyScopeAll, + _, err = db.InsertAPIKey(ctx, database.InsertAPIKeyParams{ + ID: uuid.NewString(), + LastUsed: database.Now(), + Scope: database.APIKeyScopeAll, + LoginType: database.LoginTypePassword, }) - require.NoError(t, err) + assert.NoError(t, err) _, err = db.InsertParameterSchema(ctx, database.InsertParameterSchemaParams{ - ID: uuid.New(), - CreatedAt: database.Now(), + ID: uuid.New(), + CreatedAt: database.Now(), + DefaultSourceScheme: database.ParameterSourceSchemeNone, + DefaultDestinationScheme: database.ParameterDestinationSchemeNone, + ValidationTypeSystem: database.ParameterTypeSystemNone, }) - require.NoError(t, err) + assert.NoError(t, err) _, err = db.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{ - ID: uuid.New(), - CreatedAt: database.Now(), + ID: uuid.New(), + CreatedAt: database.Now(), + Provisioner: database.ProvisionerTypeTerraform, + StorageMethod: database.ProvisionerStorageMethodFile, + Type: database.ProvisionerJobTypeTemplateVersionDryRun, }) - require.NoError(t, err) + assert.NoError(t, err) _, err = db.InsertTemplate(ctx, database.InsertTemplateParams{ - ID: uuid.New(), - CreatedAt: database.Now(), + ID: uuid.New(), + CreatedAt: database.Now(), + Provisioner: database.ProvisionerTypeTerraform, }) - require.NoError(t, err) + assert.NoError(t, err) _, err = db.InsertTemplateVersion(ctx, database.InsertTemplateVersionParams{ ID: uuid.New(), CreatedAt: database.Now(), }) - require.NoError(t, err) + assert.NoError(t, err) _, err = db.InsertUser(ctx, database.InsertUserParams{ ID: uuid.New(), CreatedAt: database.Now(), + LoginType: database.LoginTypePassword, }) - require.NoError(t, err) + assert.NoError(t, err) _, err = db.InsertWorkspace(ctx, database.InsertWorkspaceParams{ ID: uuid.New(), CreatedAt: database.Now(), }) - require.NoError(t, err) + assert.NoError(t, err) _, err = db.InsertWorkspaceApp(ctx, database.InsertWorkspaceAppParams{ - ID: uuid.New(), - CreatedAt: database.Now(), + ID: uuid.New(), + CreatedAt: database.Now(), + SharingLevel: database.AppSharingLevelOwner, + Health: database.WorkspaceAppHealthDisabled, }) - require.NoError(t, err) + assert.NoError(t, err) _, err = db.InsertWorkspaceAgent(ctx, database.InsertWorkspaceAgentParams{ ID: uuid.New(), CreatedAt: database.Now(), }) - require.NoError(t, err) + assert.NoError(t, err) _, err = db.InsertWorkspaceBuild(ctx, database.InsertWorkspaceBuildParams{ - ID: uuid.New(), - CreatedAt: database.Now(), + ID: uuid.New(), + CreatedAt: database.Now(), + Transition: database.WorkspaceTransitionStart, + Reason: database.BuildReasonAutostart, }) - require.NoError(t, err) + assert.NoError(t, err) _, err = db.InsertWorkspaceResource(ctx, database.InsertWorkspaceResourceParams{ - ID: uuid.New(), - CreatedAt: database.Now(), + ID: uuid.New(), + CreatedAt: database.Now(), + Transition: database.WorkspaceTransitionStart, }) - require.NoError(t, err) + assert.NoError(t, err) _, err = db.InsertLicense(ctx, database.InsertLicenseParams{ UploadedAt: database.Now(), JWT: "", @@ -97,7 +116,7 @@ func TestTelemetry(t *testing.T) { Valid: true, }, }) - require.NoError(t, err) + assert.NoError(t, err) snapshot := collectSnapshot(t, db) require.Len(t, snapshot.ParameterSchemas, 1) require.Len(t, snapshot.ProvisionerJobs, 1) @@ -118,6 +137,7 @@ func TestTelemetry(t *testing.T) { ID: uuid.New(), Email: "kyle@coder.com", CreatedAt: database.Now(), + LoginType: database.LoginTypePassword, }) require.NoError(t, err) snapshot := collectSnapshot(t, db) From a1c4e8f75d72433cd8b75cc2d5338db38eff180c Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Fri, 20 Jan 2023 11:05:55 +0000 Subject: [PATCH 07/10] fixup! chore: Add enum validation to database fake --- coderd/database/databasefake/databasefake.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coderd/database/databasefake/databasefake.go b/coderd/database/databasefake/databasefake.go index 280903665faf4..997e262857a8b 100644 --- a/coderd/database/databasefake/databasefake.go +++ b/coderd/database/databasefake/databasefake.go @@ -152,7 +152,7 @@ func validateDatabaseTypeWithValid(v reflect.Value) (handled bool, err error) { } // validateDatabaseType uses reflect to check if struct properties are types -// with a Valid() bool fuction set. If so, call it and return an error +// with a Valid() bool function set. If so, call it and return an error // if false. // // Note that we only check immediate values and struct fields. We do not @@ -162,7 +162,7 @@ func validateDatabaseType(args interface{}) error { // Note: database.Null* types don't have a Valid method, we skip them here // because their embedded types may have a Valid method and we don't want - // to bother with checking both that tha Valid field is true and that the + // to bother with checking both that the Valid field is true and that the // type it embeds validates to true. We would need to check: // // dbNullEnum.Valid && dbNullEnum.Enum.Valid() From 8f9282b7520ff45ed9f66ced7bd7a212c40268f0 Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Fri, 20 Jan 2023 11:15:53 +0000 Subject: [PATCH 08/10] fixup! fixup! chore: Add enum validation to database fake --- coderd/database/databasefake/databasefake.go | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/coderd/database/databasefake/databasefake.go b/coderd/database/databasefake/databasefake.go index 997e262857a8b..51a7134ab1d33 100644 --- a/coderd/database/databasefake/databasefake.go +++ b/coderd/database/databasefake/databasefake.go @@ -132,15 +132,14 @@ type data struct { } func validateDatabaseTypeWithValid(v reflect.Value) (handled bool, err error) { + if v.Kind() == reflect.Struct { + return false, nil + } + if v.CanInterface() { if !strings.Contains(v.Type().PkgPath(), "coderd/database") { return true, nil } - // Note: database.Null* types don't have a Valid method, so - // let's always skip them just in case. - if strings.HasPrefix(v.Type().Name(), "Null") { - return true, nil - } if valid, ok := v.Interface().(interface{ Valid() bool }); ok { if !valid.Valid() { return true, xerrors.Errorf("invalid %s: %q", v.Type().Name(), v.Interface()) @@ -173,9 +172,9 @@ func validateDatabaseType(args interface{}) error { if ok, err := validateDatabaseTypeWithValid(v); ok { return err } - var errs []string switch v.Kind() { case reflect.Struct: + var errs []string for i := 0; i < v.NumField(); i++ { field := v.Field(i) if ok, err := validateDatabaseTypeWithValid(field); ok && err != nil { From d7dcc25a639819b1e038d5e635beba52f6593f9b Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Fri, 20 Jan 2023 12:26:19 +0000 Subject: [PATCH 09/10] chore: Fix all tests that skipping enum values --- coderd/httpmw/apikey_test.go | 2 + coderd/httpmw/organizationparam_test.go | 1 + coderd/httpmw/templateparam_test.go | 2 + coderd/httpmw/templateversionparam_test.go | 2 + coderd/httpmw/userparam_test.go | 7 +- coderd/httpmw/workspaceagentparam_test.go | 14 +- coderd/httpmw/workspacebuildparam_test.go | 3 + coderd/httpmw/workspaceparam_test.go | 17 +- coderd/httpmw/workspaceresourceparam_test.go | 17 +- coderd/metricscache/metricscache_test.go | 138 ++++++++------- coderd/parameter/compute_test.go | 11 +- .../prometheusmetrics_test.go | 68 +++++--- .../provisionerdserver_test.go | 160 +++++++++++------- coderd/workspaceapps_internal_test.go | 2 + enterprise/coderd/license/license_test.go | 6 +- 15 files changed, 277 insertions(+), 173 deletions(-) diff --git a/coderd/httpmw/apikey_test.go b/coderd/httpmw/apikey_test.go index a9467878aff78..d5b5ac382c474 100644 --- a/coderd/httpmw/apikey_test.go +++ b/coderd/httpmw/apikey_test.go @@ -165,6 +165,7 @@ func TestAPIKey(t *testing.T) { ID: id, HashedSecret: hashed[:], UserID: user.ID, + LoginType: database.LoginTypePassword, Scope: database.APIKeyScopeAll, }) require.NoError(t, err) @@ -640,6 +641,7 @@ func createUser(ctx context.Context, t *testing.T, db database.Store, opts ...fu CreatedAt: time.Now(), UpdatedAt: time.Now(), RBACRoles: []string{}, + LoginType: database.LoginTypePassword, } for _, opt := range opts { opt(&insert) diff --git a/coderd/httpmw/organizationparam_test.go b/coderd/httpmw/organizationparam_test.go index 9ad91e7d2c2ba..0a58911bda827 100644 --- a/coderd/httpmw/organizationparam_test.go +++ b/coderd/httpmw/organizationparam_test.go @@ -42,6 +42,7 @@ func TestOrganizationParam(t *testing.T) { Username: username, CreatedAt: database.Now(), UpdatedAt: database.Now(), + LoginType: database.LoginTypePassword, }) require.NoError(t, err) _, err = db.InsertAPIKey(r.Context(), database.InsertAPIKeyParams{ diff --git a/coderd/httpmw/templateparam_test.go b/coderd/httpmw/templateparam_test.go index 15d175c4a99af..1189877ded549 100644 --- a/coderd/httpmw/templateparam_test.go +++ b/coderd/httpmw/templateparam_test.go @@ -41,6 +41,7 @@ func TestTemplateParam(t *testing.T) { Username: username, CreatedAt: database.Now(), UpdatedAt: database.Now(), + LoginType: database.LoginTypePassword, }) require.NoError(t, err) @@ -149,6 +150,7 @@ func TestTemplateParam(t *testing.T) { ID: uuid.New(), OrganizationID: org.ID, Name: "moo", + Provisioner: database.ProvisionerTypeEcho, }) require.NoError(t, err) chi.RouteContext(r.Context()).URLParams.Add("template", template.ID.String()) diff --git a/coderd/httpmw/templateversionparam_test.go b/coderd/httpmw/templateversionparam_test.go index b5a5ba2b6f6ca..36a916f1507ac 100644 --- a/coderd/httpmw/templateversionparam_test.go +++ b/coderd/httpmw/templateversionparam_test.go @@ -41,6 +41,7 @@ func TestTemplateVersionParam(t *testing.T) { Username: username, CreatedAt: database.Now(), UpdatedAt: database.Now(), + LoginType: database.LoginTypePassword, }) require.NoError(t, err) @@ -77,6 +78,7 @@ func TestTemplateVersionParam(t *testing.T) { ID: uuid.New(), OrganizationID: organization.ID, Name: "moo", + Provisioner: database.ProvisionerTypeEcho, }) require.NoError(t, err) diff --git a/coderd/httpmw/userparam_test.go b/coderd/httpmw/userparam_test.go index 9d283f1ea4abd..496e3c0f2c1e1 100644 --- a/coderd/httpmw/userparam_test.go +++ b/coderd/httpmw/userparam_test.go @@ -32,9 +32,10 @@ func TestUserParam(t *testing.T) { r.Header.Set(codersdk.SessionCustomHeader, fmt.Sprintf("%s-%s", id, secret)) user, err := db.InsertUser(r.Context(), database.InsertUserParams{ - ID: uuid.New(), - Email: "admin@email.com", - Username: "admin", + ID: uuid.New(), + Email: "admin@email.com", + Username: "admin", + LoginType: database.LoginTypePassword, }) require.NoError(t, err) diff --git a/coderd/httpmw/workspaceagentparam_test.go b/coderd/httpmw/workspaceagentparam_test.go index 9c2af43b0fe1a..d6d83c6ba8daf 100644 --- a/coderd/httpmw/workspaceagentparam_test.go +++ b/coderd/httpmw/workspaceagentparam_test.go @@ -41,6 +41,7 @@ func TestWorkspaceAgentParam(t *testing.T) { Username: username, CreatedAt: database.Now(), UpdatedAt: database.Now(), + LoginType: database.LoginTypePassword, }) require.NoError(t, err) @@ -67,18 +68,23 @@ func TestWorkspaceAgentParam(t *testing.T) { ID: uuid.New(), WorkspaceID: workspace.ID, JobID: uuid.New(), + Transition: database.WorkspaceTransitionStart, + Reason: database.BuildReasonInitiator, }) require.NoError(t, err) job, err := db.InsertProvisionerJob(context.Background(), database.InsertProvisionerJobParams{ - ID: build.JobID, - Type: database.ProvisionerJobTypeWorkspaceBuild, + ID: build.JobID, + Type: database.ProvisionerJobTypeWorkspaceBuild, + Provisioner: database.ProvisionerTypeEcho, + StorageMethod: database.ProvisionerStorageMethodFile, }) require.NoError(t, err) resource, err := db.InsertWorkspaceResource(context.Background(), database.InsertWorkspaceResourceParams{ - ID: uuid.New(), - JobID: job.ID, + ID: uuid.New(), + JobID: job.ID, + Transition: database.WorkspaceTransitionStart, }) require.NoError(t, err) diff --git a/coderd/httpmw/workspacebuildparam_test.go b/coderd/httpmw/workspacebuildparam_test.go index 851109af0e82c..ef21e12788992 100644 --- a/coderd/httpmw/workspacebuildparam_test.go +++ b/coderd/httpmw/workspacebuildparam_test.go @@ -41,6 +41,7 @@ func TestWorkspaceBuildParam(t *testing.T) { Username: username, CreatedAt: database.Now(), UpdatedAt: database.Now(), + LoginType: database.LoginTypePassword, }) require.NoError(t, err) @@ -123,6 +124,8 @@ func TestWorkspaceBuildParam(t *testing.T) { workspaceBuild, err := db.InsertWorkspaceBuild(context.Background(), database.InsertWorkspaceBuildParams{ ID: uuid.New(), WorkspaceID: workspace.ID, + Transition: database.WorkspaceTransitionStart, + Reason: database.BuildReasonInitiator, }) require.NoError(t, err) chi.RouteContext(r.Context()).URLParams.Add("workspacebuild", workspaceBuild.ID.String()) diff --git a/coderd/httpmw/workspaceparam_test.go b/coderd/httpmw/workspaceparam_test.go index b44a80c391c8e..e5d617b955a67 100644 --- a/coderd/httpmw/workspaceparam_test.go +++ b/coderd/httpmw/workspaceparam_test.go @@ -44,6 +44,7 @@ func TestWorkspaceParam(t *testing.T) { Username: username, CreatedAt: database.Now(), UpdatedAt: database.Now(), + LoginType: database.LoginTypePassword, }) require.NoError(t, err) @@ -356,6 +357,7 @@ func setupWorkspaceWithAgents(t testing.TB, cfg setupConfig) (database.Store, *h Username: username, CreatedAt: database.Now(), UpdatedAt: database.Now(), + LoginType: database.LoginTypePassword, }) require.NoError(t, err) @@ -382,20 +384,25 @@ func setupWorkspaceWithAgents(t testing.TB, cfg setupConfig) (database.Store, *h ID: uuid.New(), WorkspaceID: workspace.ID, JobID: uuid.New(), + Transition: database.WorkspaceTransitionStart, + Reason: database.BuildReasonInitiator, }) require.NoError(t, err) job, err := db.InsertProvisionerJob(context.Background(), database.InsertProvisionerJobParams{ - ID: build.JobID, - Type: database.ProvisionerJobTypeWorkspaceBuild, + ID: build.JobID, + Type: database.ProvisionerJobTypeWorkspaceBuild, + Provisioner: database.ProvisionerTypeEcho, + StorageMethod: database.ProvisionerStorageMethodFile, }) require.NoError(t, err) for resourceName, agentNames := range cfg.Agents { resource, err := db.InsertWorkspaceResource(context.Background(), database.InsertWorkspaceResourceParams{ - ID: uuid.New(), - JobID: job.ID, - Name: resourceName, + ID: uuid.New(), + JobID: job.ID, + Name: resourceName, + Transition: database.WorkspaceTransitionStart, }) require.NoError(t, err) diff --git a/coderd/httpmw/workspaceresourceparam_test.go b/coderd/httpmw/workspaceresourceparam_test.go index a2a5adfb7245e..8d83160eaf20d 100644 --- a/coderd/httpmw/workspaceresourceparam_test.go +++ b/coderd/httpmw/workspaceresourceparam_test.go @@ -21,18 +21,23 @@ func TestWorkspaceResourceParam(t *testing.T) { setup := func(db database.Store, jobType database.ProvisionerJobType) (*http.Request, database.WorkspaceResource) { r := httptest.NewRequest("GET", "/", nil) job, err := db.InsertProvisionerJob(context.Background(), database.InsertProvisionerJobParams{ - ID: uuid.New(), - Type: jobType, + ID: uuid.New(), + Type: jobType, + Provisioner: database.ProvisionerTypeEcho, + StorageMethod: database.ProvisionerStorageMethodFile, }) require.NoError(t, err) workspaceBuild, err := db.InsertWorkspaceBuild(context.Background(), database.InsertWorkspaceBuildParams{ - ID: uuid.New(), - JobID: job.ID, + ID: uuid.New(), + JobID: job.ID, + Transition: database.WorkspaceTransitionStart, + Reason: database.BuildReasonInitiator, }) require.NoError(t, err) resource, err := db.InsertWorkspaceResource(context.Background(), database.InsertWorkspaceResourceParams{ - ID: uuid.New(), - JobID: job.ID, + ID: uuid.New(), + JobID: job.ID, + Transition: database.WorkspaceTransitionStart, }) require.NoError(t, err) diff --git a/coderd/metricscache/metricscache_test.go b/coderd/metricscache/metricscache_test.go index cdcd1c88b3ee4..4b570921ce260 100644 --- a/coderd/metricscache/metricscache_test.go +++ b/coderd/metricscache/metricscache_test.go @@ -42,35 +42,36 @@ func TestCache_TemplateUsers(t *testing.T) { want want }{ {"empty", args{}, want{nil, 0}}, - {"one hole", args{ - rows: []database.InsertAgentStatParams{ + { + "one hole", args{ + rows: []database.InsertAgentStatParams{ + { + CreatedAt: date(2022, 8, 27), + UserID: zebra, + }, + { + CreatedAt: date(2022, 8, 30), + UserID: zebra, + }, + }, + }, want{[]codersdk.DAUEntry{ { - CreatedAt: date(2022, 8, 27), - UserID: zebra, + Date: date(2022, 8, 27), + Amount: 1, }, { - CreatedAt: date(2022, 8, 30), - UserID: zebra, + Date: date(2022, 8, 28), + Amount: 0, }, - }, - }, want{[]codersdk.DAUEntry{ - { - Date: date(2022, 8, 27), - Amount: 1, - }, - { - Date: date(2022, 8, 28), - Amount: 0, - }, - { - Date: date(2022, 8, 29), - Amount: 0, - }, - { - Date: date(2022, 8, 30), - Amount: 1, - }, - }, 1}, + { + Date: date(2022, 8, 29), + Amount: 0, + }, + { + Date: date(2022, 8, 30), + Amount: 1, + }, + }, 1}, }, {"no holes", args{ rows: []database.InsertAgentStatParams{ @@ -169,7 +170,8 @@ func TestCache_TemplateUsers(t *testing.T) { templateID := uuid.New() db.InsertTemplate(context.Background(), database.InsertTemplateParams{ - ID: templateID, + ID: templateID, + Provisioner: database.ProvisionerTypeEcho, }) gotUniqueUsers, ok := cache.TemplateUniqueUsers(templateID) @@ -233,46 +235,50 @@ func TestCache_BuildTime(t *testing.T) { want want }{ {"empty", args{}, want{-1, false}}, - {"one/start", args{ - rows: []jobParams{ - { - startedAt: clockTime(someDay, 10, 1, 0), - completedAt: clockTime(someDay, 10, 1, 10), + { + "one/start", args{ + rows: []jobParams{ + { + startedAt: clockTime(someDay, 10, 1, 0), + completedAt: clockTime(someDay, 10, 1, 10), + }, }, - }, - transition: database.WorkspaceTransitionStart, - }, want{10 * 1000, true}, + transition: database.WorkspaceTransitionStart, + }, want{10 * 1000, true}, }, - {"two/stop", args{ - rows: []jobParams{ - { - startedAt: clockTime(someDay, 10, 1, 0), - completedAt: clockTime(someDay, 10, 1, 10), - }, - { - startedAt: clockTime(someDay, 10, 1, 0), - completedAt: clockTime(someDay, 10, 1, 50), + { + "two/stop", args{ + rows: []jobParams{ + { + startedAt: clockTime(someDay, 10, 1, 0), + completedAt: clockTime(someDay, 10, 1, 10), + }, + { + startedAt: clockTime(someDay, 10, 1, 0), + completedAt: clockTime(someDay, 10, 1, 50), + }, }, - }, - transition: database.WorkspaceTransitionStop, - }, want{50 * 1000, true}, + transition: database.WorkspaceTransitionStop, + }, want{50 * 1000, true}, }, - {"three/delete", args{ - rows: []jobParams{ - { - startedAt: clockTime(someDay, 10, 1, 0), - completedAt: clockTime(someDay, 10, 1, 10), - }, - { - startedAt: clockTime(someDay, 10, 1, 0), - completedAt: clockTime(someDay, 10, 1, 50), - }, { - startedAt: clockTime(someDay, 10, 1, 0), - completedAt: clockTime(someDay, 10, 1, 20), + { + "three/delete", args{ + rows: []jobParams{ + { + startedAt: clockTime(someDay, 10, 1, 0), + completedAt: clockTime(someDay, 10, 1, 10), + }, + { + startedAt: clockTime(someDay, 10, 1, 0), + completedAt: clockTime(someDay, 10, 1, 50), + }, + { + startedAt: clockTime(someDay, 10, 1, 0), + completedAt: clockTime(someDay, 10, 1, 20), + }, }, - }, - transition: database.WorkspaceTransitionDelete, - }, want{20 * 1000, true}, + transition: database.WorkspaceTransitionDelete, + }, want{20 * 1000, true}, }, } @@ -290,7 +296,8 @@ func TestCache_BuildTime(t *testing.T) { defer cache.Close() template, err := db.InsertTemplate(ctx, database.InsertTemplateParams{ - ID: uuid.New(), + ID: uuid.New(), + Provisioner: database.ProvisionerTypeEcho, }) require.NoError(t, err) @@ -305,8 +312,10 @@ func TestCache_BuildTime(t *testing.T) { for _, row := range tt.args.rows { _, err := db.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{ - ID: uuid.New(), - Provisioner: database.ProvisionerTypeEcho, + ID: uuid.New(), + Provisioner: database.ProvisionerTypeEcho, + StorageMethod: database.ProvisionerStorageMethodFile, + Type: database.ProvisionerJobTypeWorkspaceBuild, }) require.NoError(t, err) @@ -322,6 +331,7 @@ func TestCache_BuildTime(t *testing.T) { TemplateVersionID: templateVersion.ID, JobID: job.ID, Transition: tt.args.transition, + Reason: database.BuildReasonInitiator, }) require.NoError(t, err) diff --git a/coderd/parameter/compute_test.go b/coderd/parameter/compute_test.go index f68008b3f48b8..0b60514fc2339 100644 --- a/coderd/parameter/compute_test.go +++ b/coderd/parameter/compute_test.go @@ -51,6 +51,7 @@ func TestCompute(t *testing.T) { AllowOverrideSource: opts.AllowOverrideSource, AllowOverrideDestination: opts.AllowOverrideDestination, DefaultDestinationScheme: opts.DefaultDestinationScheme, + ValidationTypeSystem: database.ParameterTypeSystemNone, }) require.NoError(t, err) return param @@ -61,10 +62,12 @@ func TestCompute(t *testing.T) { db := databasefake.New() scope := generateScope() _, err := db.InsertParameterSchema(context.Background(), database.InsertParameterSchemaParams{ - ID: uuid.New(), - JobID: scope.TemplateImportJobID, - Name: "hey", - DefaultSourceScheme: database.ParameterSourceSchemeNone, + ID: uuid.New(), + JobID: scope.TemplateImportJobID, + Name: "hey", + DefaultSourceScheme: database.ParameterSourceSchemeNone, + DefaultDestinationScheme: database.ParameterDestinationSchemeNone, + ValidationTypeSystem: database.ParameterTypeSystemNone, }) require.NoError(t, err) computed, err := parameter.Compute(context.Background(), db, scope, nil) diff --git a/coderd/prometheusmetrics/prometheusmetrics_test.go b/coderd/prometheusmetrics/prometheusmetrics_test.go index df5bca75eaa9e..0ebf7fa09228c 100644 --- a/coderd/prometheusmetrics/prometheusmetrics_test.go +++ b/coderd/prometheusmetrics/prometheusmetrics_test.go @@ -36,9 +36,10 @@ func TestActiveUsers(t *testing.T) { Database: func() database.Store { db := databasefake.New() _, _ = db.InsertAPIKey(context.Background(), database.InsertAPIKeyParams{ - UserID: uuid.New(), - LastUsed: database.Now(), - Scope: database.APIKeyScopeAll, + UserID: uuid.New(), + LastUsed: database.Now(), + LoginType: database.LoginTypePassword, + Scope: database.APIKeyScopeAll, }) return db }, @@ -48,16 +49,18 @@ func TestActiveUsers(t *testing.T) { Database: func() database.Store { db := databasefake.New() _, _ = db.InsertAPIKey(context.Background(), database.InsertAPIKeyParams{ - UserID: uuid.New(), - LastUsed: database.Now(), - Scope: database.APIKeyScopeAll, + UserID: uuid.New(), + LastUsed: database.Now(), + LoginType: database.LoginTypePassword, + Scope: database.APIKeyScopeAll, }) // Because this API key hasn't been used in the past hour, this shouldn't // add to the user count. _, _ = db.InsertAPIKey(context.Background(), database.InsertAPIKeyParams{ - UserID: uuid.New(), - LastUsed: database.Now().Add(-2 * time.Hour), - Scope: database.APIKeyScopeAll, + UserID: uuid.New(), + LastUsed: database.Now().Add(-2 * time.Hour), + LoginType: database.LoginTypePassword, + Scope: database.APIKeyScopeAll, }) return db }, @@ -67,14 +70,16 @@ func TestActiveUsers(t *testing.T) { Database: func() database.Store { db := databasefake.New() _, _ = db.InsertAPIKey(context.Background(), database.InsertAPIKeyParams{ - UserID: uuid.New(), - LastUsed: database.Now(), - Scope: database.APIKeyScopeAll, + UserID: uuid.New(), + LastUsed: database.Now(), + LoginType: database.LoginTypePassword, + Scope: database.APIKeyScopeAll, }) _, _ = db.InsertAPIKey(context.Background(), database.InsertAPIKeyParams{ - UserID: uuid.New(), - LastUsed: database.Now(), - Scope: database.APIKeyScopeAll, + UserID: uuid.New(), + LastUsed: database.Now(), + LoginType: database.LoginTypePassword, + Scope: database.APIKeyScopeAll, }) return db }, @@ -102,50 +107,59 @@ func TestWorkspaces(t *testing.T) { t.Parallel() insertRunning := func(db database.Store) database.ProvisionerJob { - job, _ := db.InsertProvisionerJob(context.Background(), database.InsertProvisionerJobParams{ - ID: uuid.New(), - CreatedAt: database.Now(), - UpdatedAt: database.Now(), - Provisioner: database.ProvisionerTypeEcho, + job, err := db.InsertProvisionerJob(context.Background(), database.InsertProvisionerJobParams{ + ID: uuid.New(), + CreatedAt: database.Now(), + UpdatedAt: database.Now(), + Provisioner: database.ProvisionerTypeEcho, + StorageMethod: database.ProvisionerStorageMethodFile, + Type: database.ProvisionerJobTypeWorkspaceBuild, }) - _, _ = db.InsertWorkspaceBuild(context.Background(), database.InsertWorkspaceBuildParams{ + require.NoError(t, err) + _, err = db.InsertWorkspaceBuild(context.Background(), database.InsertWorkspaceBuildParams{ ID: uuid.New(), WorkspaceID: uuid.New(), JobID: job.ID, BuildNumber: 1, + Transition: database.WorkspaceTransitionStart, + Reason: database.BuildReasonInitiator, }) + require.NoError(t, err) // This marks the job as started. - _, _ = db.AcquireProvisionerJob(context.Background(), database.AcquireProvisionerJobParams{ + _, err = db.AcquireProvisionerJob(context.Background(), database.AcquireProvisionerJobParams{ StartedAt: sql.NullTime{ Time: database.Now(), Valid: true, }, Types: []database.ProvisionerType{database.ProvisionerTypeEcho}, }) + require.NoError(t, err) return job } insertCanceled := func(db database.Store) { job := insertRunning(db) - _ = db.UpdateProvisionerJobWithCancelByID(context.Background(), database.UpdateProvisionerJobWithCancelByIDParams{ + err := db.UpdateProvisionerJobWithCancelByID(context.Background(), database.UpdateProvisionerJobWithCancelByIDParams{ ID: job.ID, CanceledAt: sql.NullTime{ Time: database.Now(), Valid: true, }, }) - _ = db.UpdateProvisionerJobWithCompleteByID(context.Background(), database.UpdateProvisionerJobWithCompleteByIDParams{ + require.NoError(t, err) + err = db.UpdateProvisionerJobWithCompleteByID(context.Background(), database.UpdateProvisionerJobWithCompleteByIDParams{ ID: job.ID, CompletedAt: sql.NullTime{ Time: database.Now(), Valid: true, }, }) + require.NoError(t, err) } insertFailed := func(db database.Store) { job := insertRunning(db) - _ = db.UpdateProvisionerJobWithCompleteByID(context.Background(), database.UpdateProvisionerJobWithCompleteByIDParams{ + err := db.UpdateProvisionerJobWithCompleteByID(context.Background(), database.UpdateProvisionerJobWithCompleteByIDParams{ ID: job.ID, CompletedAt: sql.NullTime{ Time: database.Now(), @@ -156,17 +170,19 @@ func TestWorkspaces(t *testing.T) { Valid: true, }, }) + require.NoError(t, err) } insertSuccess := func(db database.Store) { job := insertRunning(db) - _ = db.UpdateProvisionerJobWithCompleteByID(context.Background(), database.UpdateProvisionerJobWithCompleteByIDParams{ + err := db.UpdateProvisionerJobWithCompleteByID(context.Background(), database.UpdateProvisionerJobWithCompleteByIDParams{ ID: job.ID, CompletedAt: sql.NullTime{ Time: database.Now(), Valid: true, }, }) + require.NoError(t, err) } for _, tc := range []struct { diff --git a/coderd/provisionerdserver/provisionerdserver_test.go b/coderd/provisionerdserver/provisionerdserver_test.go index c616f57d5f6dd..f9a4d74782647 100644 --- a/coderd/provisionerdserver/provisionerdserver_test.go +++ b/coderd/provisionerdserver/provisionerdserver_test.go @@ -51,9 +51,11 @@ func TestAcquireJob(t *testing.T) { require.NoError(t, err) require.Equal(t, &proto.AcquiredJob{}, job) _, err = srv.Database.InsertProvisionerJob(context.Background(), database.InsertProvisionerJobParams{ - ID: uuid.New(), - InitiatorID: uuid.New(), - Provisioner: database.ProvisionerTypeEcho, + ID: uuid.New(), + InitiatorID: uuid.New(), + Provisioner: database.ProvisionerTypeEcho, + StorageMethod: database.ProvisionerStorageMethodFile, + Type: database.ProvisionerJobTypeTemplateVersionDryRun, }) require.NoError(t, err) job, err = srv.AcquireJob(context.Background(), nil) @@ -62,18 +64,20 @@ func TestAcquireJob(t *testing.T) { }) t.Run("NoJobs", func(t *testing.T) { t.Parallel() - srv := setup(t) + srv := setup(t, false) job, err := srv.AcquireJob(context.Background(), nil) require.NoError(t, err) require.Equal(t, &proto.AcquiredJob{}, job) }) t.Run("InitiatorNotFound", func(t *testing.T) { t.Parallel() - srv := setup(t) + srv := setup(t, false) _, err := srv.Database.InsertProvisionerJob(context.Background(), database.InsertProvisionerJobParams{ - ID: uuid.New(), - InitiatorID: uuid.New(), - Provisioner: database.ProvisionerTypeEcho, + ID: uuid.New(), + InitiatorID: uuid.New(), + Provisioner: database.ProvisionerTypeEcho, + StorageMethod: database.ProvisionerStorageMethodFile, + Type: database.ProvisionerJobTypeTemplateVersionDryRun, }) require.NoError(t, err) _, err = srv.AcquireJob(context.Background(), nil) @@ -81,16 +85,18 @@ func TestAcquireJob(t *testing.T) { }) t.Run("WorkspaceBuildJob", func(t *testing.T) { t.Parallel() - srv := setup(t) + srv := setup(t, false) ctx := context.Background() user, err := srv.Database.InsertUser(context.Background(), database.InsertUserParams{ - ID: uuid.New(), - Username: "testing", + ID: uuid.New(), + Username: "testing", + LoginType: database.LoginTypePassword, }) require.NoError(t, err) template, err := srv.Database.InsertTemplate(ctx, database.InsertTemplateParams{ - ID: uuid.New(), - Name: "template", + ID: uuid.New(), + Name: "template", + Provisioner: database.ProvisionerTypeEcho, }) require.NoError(t, err) version, err := srv.Database.InsertTemplateVersion(ctx, database.InsertTemplateVersionParams{ @@ -116,6 +122,7 @@ func TestAcquireJob(t *testing.T) { JobID: uuid.New(), TemplateVersionID: version.ID, Transition: database.WorkspaceTransitionStart, + Reason: database.BuildReasonInitiator, }) require.NoError(t, err) @@ -182,11 +189,12 @@ func TestAcquireJob(t *testing.T) { }) t.Run("TemplateVersionDryRun", func(t *testing.T) { t.Parallel() - srv := setup(t) + srv := setup(t, false) ctx := context.Background() user, err := srv.Database.InsertUser(ctx, database.InsertUserParams{ - ID: uuid.New(), - Username: "testing", + ID: uuid.New(), + Username: "testing", + LoginType: database.LoginTypePassword, }) require.NoError(t, err) version, err := srv.Database.InsertTemplateVersion(ctx, database.InsertTemplateVersionParams{ @@ -242,11 +250,12 @@ func TestAcquireJob(t *testing.T) { }) t.Run("TemplateVersionImport", func(t *testing.T) { t.Parallel() - srv := setup(t) + srv := setup(t, false) ctx := context.Background() user, err := srv.Database.InsertUser(ctx, database.InsertUserParams{ - ID: uuid.New(), - Username: "testing", + ID: uuid.New(), + Username: "testing", + LoginType: database.LoginTypePassword, }) require.NoError(t, err) @@ -294,7 +303,7 @@ func TestUpdateJob(t *testing.T) { ctx := context.Background() t.Run("NotFound", func(t *testing.T) { t.Parallel() - srv := setup(t) + srv := setup(t, false) _, err := srv.UpdateJob(ctx, &proto.UpdateJobRequest{ JobId: "hello", }) @@ -307,9 +316,12 @@ func TestUpdateJob(t *testing.T) { }) t.Run("NotRunning", func(t *testing.T) { t.Parallel() - srv := setup(t) + srv := setup(t, false) job, err := srv.Database.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{ - ID: uuid.New(), + ID: uuid.New(), + Provisioner: database.ProvisionerTypeEcho, + StorageMethod: database.ProvisionerStorageMethodFile, + Type: database.ProvisionerJobTypeTemplateVersionDryRun, }) require.NoError(t, err) _, err = srv.UpdateJob(ctx, &proto.UpdateJobRequest{ @@ -320,10 +332,12 @@ func TestUpdateJob(t *testing.T) { // This test prevents runners from updating jobs they don't own! t.Run("NotOwner", func(t *testing.T) { t.Parallel() - srv := setup(t) + srv := setup(t, false) job, err := srv.Database.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{ - ID: uuid.New(), - Provisioner: database.ProvisionerTypeEcho, + ID: uuid.New(), + Provisioner: database.ProvisionerTypeEcho, + StorageMethod: database.ProvisionerStorageMethodFile, + Type: database.ProvisionerJobTypeTemplateVersionDryRun, }) require.NoError(t, err) _, err = srv.Database.AcquireProvisionerJob(ctx, database.AcquireProvisionerJobParams{ @@ -342,8 +356,10 @@ func TestUpdateJob(t *testing.T) { setupJob := func(t *testing.T, srv *provisionerdserver.Server) uuid.UUID { job, err := srv.Database.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{ - ID: uuid.New(), - Provisioner: database.ProvisionerTypeEcho, + ID: uuid.New(), + Provisioner: database.ProvisionerTypeEcho, + Type: database.ProvisionerJobTypeTemplateVersionImport, + StorageMethod: database.ProvisionerStorageMethodFile, }) require.NoError(t, err) _, err = srv.Database.AcquireProvisionerJob(ctx, database.AcquireProvisionerJobParams{ @@ -359,7 +375,7 @@ func TestUpdateJob(t *testing.T) { t.Run("Success", func(t *testing.T) { t.Parallel() - srv := setup(t) + srv := setup(t, false) job := setupJob(t, srv) _, err := srv.UpdateJob(ctx, &proto.UpdateJobRequest{ JobId: job.String(), @@ -369,7 +385,7 @@ func TestUpdateJob(t *testing.T) { t.Run("Logs", func(t *testing.T) { t.Parallel() - srv := setup(t) + srv := setup(t, false) job := setupJob(t, srv) published := make(chan struct{}) @@ -394,7 +410,7 @@ func TestUpdateJob(t *testing.T) { }) t.Run("Readme", func(t *testing.T) { t.Parallel() - srv := setup(t) + srv := setup(t, false) job := setupJob(t, srv) version, err := srv.Database.InsertTemplateVersion(ctx, database.InsertTemplateVersionParams{ ID: uuid.New(), @@ -418,7 +434,7 @@ func TestFailJob(t *testing.T) { ctx := context.Background() t.Run("NotFound", func(t *testing.T) { t.Parallel() - srv := setup(t) + srv := setup(t, false) _, err := srv.FailJob(ctx, &proto.FailedJob{ JobId: "hello", }) @@ -432,10 +448,12 @@ func TestFailJob(t *testing.T) { // This test prevents runners from updating jobs they don't own! t.Run("NotOwner", func(t *testing.T) { t.Parallel() - srv := setup(t) + srv := setup(t, false) job, err := srv.Database.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{ - ID: uuid.New(), - Provisioner: database.ProvisionerTypeEcho, + ID: uuid.New(), + Provisioner: database.ProvisionerTypeEcho, + StorageMethod: database.ProvisionerStorageMethodFile, + Type: database.ProvisionerJobTypeTemplateVersionImport, }) require.NoError(t, err) _, err = srv.Database.AcquireProvisionerJob(ctx, database.AcquireProvisionerJobParams{ @@ -453,10 +471,12 @@ func TestFailJob(t *testing.T) { }) t.Run("AlreadyCompleted", func(t *testing.T) { t.Parallel() - srv := setup(t) + srv := setup(t, false) job, err := srv.Database.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{ - ID: uuid.New(), - Provisioner: database.ProvisionerTypeEcho, + ID: uuid.New(), + Provisioner: database.ProvisionerTypeEcho, + Type: database.ProvisionerJobTypeTemplateVersionImport, + StorageMethod: database.ProvisionerStorageMethodFile, }) require.NoError(t, err) _, err = srv.Database.AcquireProvisionerJob(ctx, database.AcquireProvisionerJobParams{ @@ -482,19 +502,32 @@ func TestFailJob(t *testing.T) { }) t.Run("WorkspaceBuild", func(t *testing.T) { t.Parallel() - srv := setup(t) - build, err := srv.Database.InsertWorkspaceBuild(ctx, database.InsertWorkspaceBuildParams{ + // Ignore log errors because we get: + // + // (*Server).FailJob audit log - get build {"error": "sql: no rows in result set"} + ignoreLogErrors := true + srv := setup(t, ignoreLogErrors) + workspace, err := srv.Database.InsertWorkspace(ctx, database.InsertWorkspaceParams{ ID: uuid.New(), }) require.NoError(t, err) + build, err := srv.Database.InsertWorkspaceBuild(ctx, database.InsertWorkspaceBuildParams{ + ID: uuid.New(), + WorkspaceID: workspace.ID, + Transition: database.WorkspaceTransitionStart, + Reason: database.BuildReasonInitiator, + }) + require.NoError(t, err) input, err := json.Marshal(provisionerdserver.WorkspaceProvisionJob{ WorkspaceBuildID: build.ID, }) require.NoError(t, err) job, err := srv.Database.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{ - ID: uuid.New(), - Provisioner: database.ProvisionerTypeEcho, - Input: input, + ID: uuid.New(), + Input: input, + Provisioner: database.ProvisionerTypeEcho, + Type: database.ProvisionerJobTypeWorkspaceBuild, + StorageMethod: database.ProvisionerStorageMethodFile, }) require.NoError(t, err) _, err = srv.Database.AcquireProvisionerJob(ctx, database.AcquireProvisionerJobParams{ @@ -541,7 +574,7 @@ func TestCompleteJob(t *testing.T) { ctx := context.Background() t.Run("NotFound", func(t *testing.T) { t.Parallel() - srv := setup(t) + srv := setup(t, false) _, err := srv.CompleteJob(ctx, &proto.CompletedJob{ JobId: "hello", }) @@ -555,10 +588,12 @@ func TestCompleteJob(t *testing.T) { // This test prevents runners from updating jobs they don't own! t.Run("NotOwner", func(t *testing.T) { t.Parallel() - srv := setup(t) + srv := setup(t, false) job, err := srv.Database.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{ - ID: uuid.New(), - Provisioner: database.ProvisionerTypeEcho, + ID: uuid.New(), + Provisioner: database.ProvisionerTypeEcho, + StorageMethod: database.ProvisionerStorageMethodFile, + Type: database.ProvisionerJobTypeWorkspaceBuild, }) require.NoError(t, err) _, err = srv.Database.AcquireProvisionerJob(ctx, database.AcquireProvisionerJobParams{ @@ -576,11 +611,13 @@ func TestCompleteJob(t *testing.T) { }) t.Run("TemplateImport", func(t *testing.T) { t.Parallel() - srv := setup(t) + srv := setup(t, false) job, err := srv.Database.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{ - ID: uuid.New(), - Provisioner: database.ProvisionerTypeEcho, - Input: []byte(`{"template_version_id": "` + uuid.NewString() + `"}`), + ID: uuid.New(), + Provisioner: database.ProvisionerTypeEcho, + Input: []byte(`{"template_version_id": "` + uuid.NewString() + `"}`), + StorageMethod: database.ProvisionerStorageMethodFile, + Type: database.ProvisionerJobTypeWorkspaceBuild, }) require.NoError(t, err) _, err = srv.Database.AcquireProvisionerJob(ctx, database.AcquireProvisionerJobParams{ @@ -607,7 +644,7 @@ func TestCompleteJob(t *testing.T) { }) t.Run("WorkspaceBuild", func(t *testing.T) { t.Parallel() - srv := setup(t) + srv := setup(t, false) workspace, err := srv.Database.InsertWorkspace(ctx, database.InsertWorkspaceParams{ ID: uuid.New(), }) @@ -616,6 +653,7 @@ func TestCompleteJob(t *testing.T) { ID: uuid.New(), WorkspaceID: workspace.ID, Transition: database.WorkspaceTransitionDelete, + Reason: database.BuildReasonInitiator, }) require.NoError(t, err) input, err := json.Marshal(provisionerdserver.WorkspaceProvisionJob{ @@ -623,9 +661,11 @@ func TestCompleteJob(t *testing.T) { }) require.NoError(t, err) job, err := srv.Database.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{ - ID: uuid.New(), - Provisioner: database.ProvisionerTypeEcho, - Input: input, + ID: uuid.New(), + Provisioner: database.ProvisionerTypeEcho, + Input: input, + Type: database.ProvisionerJobTypeWorkspaceBuild, + StorageMethod: database.ProvisionerStorageMethodFile, }) require.NoError(t, err) _, err = srv.Database.AcquireProvisionerJob(ctx, database.AcquireProvisionerJobParams{ @@ -674,10 +714,12 @@ func TestCompleteJob(t *testing.T) { t.Run("TemplateDryRun", func(t *testing.T) { t.Parallel() - srv := setup(t) + srv := setup(t, false) job, err := srv.Database.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{ - ID: uuid.New(), - Provisioner: database.ProvisionerTypeEcho, + ID: uuid.New(), + Provisioner: database.ProvisionerTypeEcho, + Type: database.ProvisionerJobTypeTemplateVersionDryRun, + StorageMethod: database.ProvisionerStorageMethodFile, }) require.NoError(t, err) _, err = srv.Database.AcquireProvisionerJob(ctx, database.AcquireProvisionerJobParams{ @@ -797,14 +839,14 @@ func TestInsertWorkspaceResource(t *testing.T) { }) } -func setup(t *testing.T) *provisionerdserver.Server { +func setup(t *testing.T, ignoreLogErrors bool) *provisionerdserver.Server { t.Helper() db := databasefake.New() pubsub := database.NewPubsubInMemory() return &provisionerdserver.Server{ ID: uuid.New(), - Logger: slogtest.Make(t, nil), + Logger: slogtest.Make(t, &slogtest.Options{IgnoreErrors: ignoreLogErrors}), AccessURL: &url.URL{}, Provisioners: []database.ProvisionerType{database.ProvisionerTypeEcho}, Database: db, diff --git a/coderd/workspaceapps_internal_test.go b/coderd/workspaceapps_internal_test.go index b5eaf974573c5..1e298000d9dd5 100644 --- a/coderd/workspaceapps_internal_test.go +++ b/coderd/workspaceapps_internal_test.go @@ -35,6 +35,8 @@ func TestAPIKeyEncryption(t *testing.T) { _, err := db.InsertAPIKey(ctx, database.InsertAPIKeyParams{ ID: keyID, HashedSecret: hashedSecret, + LoginType: database.LoginTypePassword, + Scope: database.APIKeyScopeAll, }) require.NoError(t, err) } diff --git a/enterprise/coderd/license/license_test.go b/enterprise/coderd/license/license_test.go index 1befc39d371cc..2d0244fd52925 100644 --- a/enterprise/coderd/license/license_test.go +++ b/enterprise/coderd/license/license_test.go @@ -134,10 +134,12 @@ func TestEntitlements(t *testing.T) { t.Parallel() db := databasefake.New() db.InsertUser(context.Background(), database.InsertUserParams{ - Username: "test1", + Username: "test1", + LoginType: database.LoginTypePassword, }) db.InsertUser(context.Background(), database.InsertUserParams{ - Username: "test2", + Username: "test2", + LoginType: database.LoginTypePassword, }) db.InsertLicense(context.Background(), database.InsertLicenseParams{ JWT: coderdenttest.GenerateLicense(t, coderdenttest.LicenseOptions{ From bf43352c8376c9ed589aa1181614bd9b3e85b2a3 Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Fri, 20 Jan 2023 12:26:53 +0000 Subject: [PATCH 10/10] fix: Use correct err in providionerdserver audit log failure log --- coderd/provisionerdserver/provisionerdserver.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/coderd/provisionerdserver/provisionerdserver.go b/coderd/provisionerdserver/provisionerdserver.go index ebed06dd1b5bc..30a73fd7aa4cd 100644 --- a/coderd/provisionerdserver/provisionerdserver.go +++ b/coderd/provisionerdserver/provisionerdserver.go @@ -535,13 +535,13 @@ func (server *Server) FailJob(ctx context.Context, failJob *proto.FailedJob) (*p // if failed job is a workspace build, audit the outcome if job.Type == database.ProvisionerJobTypeWorkspaceBuild { auditor := server.Auditor.Load() - build, getBuildErr := server.Database.GetWorkspaceBuildByJobID(ctx, job.ID) - if getBuildErr != nil { + build, err := server.Database.GetWorkspaceBuildByJobID(ctx, job.ID) + if err != nil { server.Logger.Error(ctx, "audit log - get build", slog.Error(err)) } else { auditAction := auditActionFromTransition(build.Transition) - workspace, getWorkspaceErr := server.Database.GetWorkspaceByID(ctx, build.WorkspaceID) - if getWorkspaceErr != nil { + workspace, err := server.Database.GetWorkspaceByID(ctx, build.WorkspaceID) + if err != nil { server.Logger.Error(ctx, "audit log - get workspace", slog.Error(err)) } else { // We pass the below information to the Auditor so that it