diff --git a/coderd/coderd.go b/coderd/coderd.go index 0aedb1d0c6..cd60b044e9 100644 --- a/coderd/coderd.go +++ b/coderd/coderd.go @@ -66,13 +66,13 @@ func New(options *Options) http.Handler { r.Get("/", api.parametersByProject) r.Post("/", api.postParametersByProject) }) - r.Route("/history", func(r chi.Router) { - r.Get("/", api.projectHistoryByOrganization) - r.Post("/", api.postProjectHistoryByOrganization) - r.Route("/{projecthistory}", func(r chi.Router) { - r.Use(httpmw.ExtractProjectHistoryParam(api.Database)) - r.Get("/", api.projectHistoryByOrganizationAndName) - r.Get("/parameters", api.projectHistoryParametersByOrganizationAndName) + r.Route("/versions", func(r chi.Router) { + r.Get("/", api.projectVersionsByOrganization) + r.Post("/", api.postProjectVersionByOrganization) + r.Route("/{projectversion}", func(r chi.Router) { + r.Use(httpmw.ExtractProjectVersionParam(api.Database)) + r.Get("/", api.projectVersionByOrganizationAndName) + r.Get("/parameters", api.projectVersionParametersByOrganizationAndName) }) }) }) @@ -91,7 +91,7 @@ func New(options *Options) http.Handler { r.Route("/{workspace}", func(r chi.Router) { r.Use(httpmw.ExtractWorkspaceParam(options.Database)) r.Get("/", api.workspaceByUser) - r.Route("/history", func(r chi.Router) { + r.Route("/version", func(r chi.Router) { r.Post("/", api.postWorkspaceHistoryByUser) r.Get("/", api.workspaceHistoryByUser) r.Route("/{workspacehistory}", func(r chi.Router) { diff --git a/coderd/projectparameter/projectparameter.go b/coderd/projectparameter/projectparameter.go index 95975849e0..0ba65eae8f 100644 --- a/coderd/projectparameter/projectparameter.go +++ b/coderd/projectparameter/projectparameter.go @@ -17,7 +17,7 @@ import ( type Scope struct { OrganizationID string ProjectID uuid.UUID - ProjectHistoryID uuid.UUID + ProjectVersionID uuid.UUID UserID string WorkspaceID uuid.UUID WorkspaceHistoryID uuid.UUID @@ -40,21 +40,21 @@ func Compute(ctx context.Context, db database.Store, scope Scope) ([]Value, erro compute := &compute{ db: db, computedParameterByName: map[string]Value{}, - projectHistoryParametersByName: map[string]database.ProjectParameter{}, + projectVersionParametersByName: map[string]database.ProjectParameter{}, } // All parameters for the project version! - projectHistoryParameters, err := db.GetProjectParametersByHistoryID(ctx, scope.ProjectHistoryID) + projectVersionParameters, err := db.GetProjectParametersByVersionID(ctx, scope.ProjectVersionID) if errors.Is(err, sql.ErrNoRows) { - // This occurs when the project history has defined + // This occurs when the project version has defined // no parameters, so we have nothing to compute! return []Value{}, nil } if err != nil { return nil, xerrors.Errorf("get project parameters: %w", err) } - for _, projectHistoryParameter := range projectHistoryParameters { - compute.projectHistoryParametersByName[projectHistoryParameter.Name] = projectHistoryParameter + for _, projectVersionParameter := range projectVersionParameters { + compute.projectVersionParametersByName[projectVersionParameter.Name] = projectVersionParameter } // Organization parameters come first! @@ -67,33 +67,33 @@ func Compute(ctx context.Context, db database.Store, scope Scope) ([]Value, erro } // Default project parameter values come second! - for _, projectHistoryParameter := range projectHistoryParameters { - if !projectHistoryParameter.DefaultSourceValue.Valid { + for _, projectVersionParameter := range projectVersionParameters { + if !projectVersionParameter.DefaultSourceValue.Valid { continue } - if !projectHistoryParameter.DefaultDestinationValue.Valid { + if !projectVersionParameter.DefaultDestinationValue.Valid { continue } - destinationScheme, err := convertDestinationScheme(projectHistoryParameter.DefaultDestinationScheme) + destinationScheme, err := convertDestinationScheme(projectVersionParameter.DefaultDestinationScheme) if err != nil { - return nil, xerrors.Errorf("convert default destination scheme for project history parameter %q: %w", projectHistoryParameter.Name, err) + return nil, xerrors.Errorf("convert default destination scheme for project version parameter %q: %w", projectVersionParameter.Name, err) } - switch projectHistoryParameter.DefaultSourceScheme { + switch projectVersionParameter.DefaultSourceScheme { case database.ParameterSourceSchemeData: - compute.computedParameterByName[projectHistoryParameter.Name] = Value{ + compute.computedParameterByName[projectVersionParameter.Name] = Value{ Proto: &proto.ParameterValue{ DestinationScheme: destinationScheme, - Name: projectHistoryParameter.DefaultDestinationValue.String, - Value: projectHistoryParameter.DefaultSourceValue.String, + Name: projectVersionParameter.DefaultDestinationValue.String, + Value: projectVersionParameter.DefaultSourceValue.String, }, DefaultValue: true, Scope: database.ParameterScopeProject, ScopeID: scope.ProjectID.String(), } default: - return nil, xerrors.Errorf("unsupported source scheme for project history parameter %q: %q", projectHistoryParameter.Name, string(projectHistoryParameter.DefaultSourceScheme)) + return nil, xerrors.Errorf("unsupported source scheme for project version parameter %q: %q", projectVersionParameter.Name, string(projectVersionParameter.DefaultSourceScheme)) } } @@ -124,13 +124,13 @@ func Compute(ctx context.Context, db database.Store, scope Scope) ([]Value, erro return nil, err } - for _, projectHistoryParameter := range compute.projectHistoryParametersByName { - if _, ok := compute.computedParameterByName[projectHistoryParameter.Name]; ok { + for _, projectVersionParameter := range compute.projectVersionParametersByName { + if _, ok := compute.computedParameterByName[projectVersionParameter.Name]; ok { continue } return nil, NoValueError{ - ParameterID: projectHistoryParameter.ID, - ParameterName: projectHistoryParameter.Name, + ParameterID: projectVersionParameter.ID, + ParameterName: projectVersionParameter.Name, } } @@ -144,7 +144,7 @@ func Compute(ctx context.Context, db database.Store, scope Scope) ([]Value, erro type compute struct { db database.Store computedParameterByName map[string]Value - projectHistoryParametersByName map[string]database.ProjectParameter + projectVersionParametersByName map[string]database.ProjectParameter } // Validates and computes the value for parameters; setting the value on "parameterByName". @@ -158,8 +158,8 @@ func (c *compute) inject(ctx context.Context, scopeParams database.GetParameterV } for _, scopedParameter := range scopedParameters { - projectHistoryParameter, hasProjectHistoryParameter := c.projectHistoryParametersByName[scopedParameter.Name] - if !hasProjectHistoryParameter { + projectVersionParameter, hasProjectVersionParameter := c.projectVersionParametersByName[scopedParameter.Name] + if !hasProjectVersionParameter { // Don't inject parameters that aren't defined by the project. continue } @@ -169,7 +169,7 @@ func (c *compute) inject(ctx context.Context, scopeParams database.GetParameterV // If a parameter already exists, check if this variable can override it. // Injection hierarchy is the responsibility of the caller. This check ensures // project parameters cannot be overridden if already set. - if !projectHistoryParameter.AllowOverrideSource && scopedParameter.Scope != database.ParameterScopeProject { + if !projectVersionParameter.AllowOverrideSource && scopedParameter.Scope != database.ParameterScopeProject { continue } } @@ -181,7 +181,7 @@ func (c *compute) inject(ctx context.Context, scopeParams database.GetParameterV switch scopedParameter.SourceScheme { case database.ParameterSourceSchemeData: - c.computedParameterByName[projectHistoryParameter.Name] = Value{ + c.computedParameterByName[projectVersionParameter.Name] = Value{ Proto: &proto.ParameterValue{ DestinationScheme: destinationScheme, Name: scopedParameter.SourceValue, @@ -189,7 +189,7 @@ func (c *compute) inject(ctx context.Context, scopeParams database.GetParameterV }, } default: - return xerrors.Errorf("unsupported source scheme: %q", string(projectHistoryParameter.DefaultSourceScheme)) + return xerrors.Errorf("unsupported source scheme: %q", string(projectVersionParameter.DefaultSourceScheme)) } } return nil diff --git a/coderd/projectparameter/projectparameter_test.go b/coderd/projectparameter/projectparameter_test.go index 5b56217549..1cc2cd80f9 100644 --- a/coderd/projectparameter/projectparameter_test.go +++ b/coderd/projectparameter/projectparameter_test.go @@ -21,7 +21,7 @@ func TestCompute(t *testing.T) { return projectparameter.Scope{ OrganizationID: uuid.New().String(), ProjectID: uuid.New(), - ProjectHistoryID: uuid.New(), + ProjectVersionID: uuid.New(), UserID: uuid.NewString(), } } @@ -29,7 +29,7 @@ func TestCompute(t *testing.T) { AllowOverrideSource bool AllowOverrideDestination bool DefaultDestinationScheme database.ParameterDestinationScheme - ProjectHistoryID uuid.UUID + ProjectVersionID uuid.UUID } generateProjectParameter := func(t *testing.T, db database.Store, opts projectParameterOptions) database.ProjectParameter { if opts.DefaultDestinationScheme == "" { @@ -44,7 +44,7 @@ func TestCompute(t *testing.T) { param, err := db.InsertProjectParameter(context.Background(), database.InsertProjectParameterParams{ ID: uuid.New(), Name: name, - ProjectHistoryID: opts.ProjectHistoryID, + ProjectVersionID: opts.ProjectVersionID, DefaultSourceScheme: database.ParameterSourceSchemeData, DefaultSourceValue: sql.NullString{ String: sourceValue, @@ -68,7 +68,7 @@ func TestCompute(t *testing.T) { scope := generateScope() parameter, err := db.InsertProjectParameter(context.Background(), database.InsertProjectParameterParams{ ID: uuid.New(), - ProjectHistoryID: scope.ProjectHistoryID, + ProjectVersionID: scope.ProjectVersionID, Name: "hey", }) require.NoError(t, err) @@ -85,7 +85,7 @@ func TestCompute(t *testing.T) { db := databasefake.New() scope := generateScope() parameter := generateProjectParameter(t, db, projectParameterOptions{ - ProjectHistoryID: scope.ProjectHistoryID, + ProjectVersionID: scope.ProjectVersionID, DefaultDestinationScheme: database.ParameterDestinationSchemeProvisionerVariable, }) values, err := projectparameter.Compute(context.Background(), db, scope) @@ -105,7 +105,7 @@ func TestCompute(t *testing.T) { db := databasefake.New() scope := generateScope() parameter := generateProjectParameter(t, db, projectParameterOptions{ - ProjectHistoryID: scope.ProjectHistoryID, + ProjectVersionID: scope.ProjectVersionID, }) _, err := db.InsertParameterValue(context.Background(), database.InsertParameterValueParams{ ID: uuid.New(), @@ -131,7 +131,7 @@ func TestCompute(t *testing.T) { db := databasefake.New() scope := generateScope() parameter := generateProjectParameter(t, db, projectParameterOptions{ - ProjectHistoryID: scope.ProjectHistoryID, + ProjectVersionID: scope.ProjectVersionID, }) value, err := db.InsertParameterValue(context.Background(), database.InsertParameterValueParams{ ID: uuid.New(), @@ -157,7 +157,7 @@ func TestCompute(t *testing.T) { db := databasefake.New() scope := generateScope() parameter := generateProjectParameter(t, db, projectParameterOptions{ - ProjectHistoryID: scope.ProjectHistoryID, + ProjectVersionID: scope.ProjectVersionID, }) _, err := db.InsertParameterValue(context.Background(), database.InsertParameterValueParams{ ID: uuid.New(), @@ -183,7 +183,7 @@ func TestCompute(t *testing.T) { scope := generateScope() parameter := generateProjectParameter(t, db, projectParameterOptions{ AllowOverrideSource: true, - ProjectHistoryID: scope.ProjectHistoryID, + ProjectVersionID: scope.ProjectVersionID, }) _, err := db.InsertParameterValue(context.Background(), database.InsertParameterValueParams{ ID: uuid.New(), diff --git a/coderd/projects_test.go b/coderd/projects_test.go index 14ed1af4f0..b5bbc03766 100644 --- a/coderd/projects_test.go +++ b/coderd/projects_test.go @@ -148,17 +148,17 @@ func TestProjects(t *testing.T) { }, }}, nil) require.NoError(t, err) - history, err := server.Client.CreateProjectHistory(context.Background(), user.Organization, project.Name, coderd.CreateProjectHistoryRequest{ + version, err := server.Client.CreateProjectVersion(context.Background(), user.Organization, project.Name, coderd.CreateProjectVersionRequest{ StorageMethod: database.ProjectStorageMethodInlineArchive, StorageSource: data, }) require.NoError(t, err) require.Eventually(t, func() bool { - projectHistory, err := server.Client.ProjectHistory(context.Background(), user.Organization, project.Name, history.Name) + projectVersion, err := server.Client.ProjectVersion(context.Background(), user.Organization, project.Name, version.Name) require.NoError(t, err) - return projectHistory.Import.Status.Completed() + return projectVersion.Import.Status.Completed() }, 15*time.Second, 10*time.Millisecond) - params, err := server.Client.ProjectHistoryParameters(context.Background(), user.Organization, project.Name, history.Name) + params, err := server.Client.ProjectVersionParameters(context.Background(), user.Organization, project.Name, version.Name) require.NoError(t, err) require.Len(t, params, 1) require.Equal(t, "example", params[0].Name) diff --git a/coderd/projecthistory.go b/coderd/projectversion.go similarity index 76% rename from coderd/projecthistory.go rename to coderd/projectversion.go index 36d4a38f95..ac1906f2be 100644 --- a/coderd/projecthistory.go +++ b/coderd/projectversion.go @@ -20,8 +20,8 @@ import ( "github.com/coder/coder/httpmw" ) -// ProjectHistory is the JSON representation of Coder project version history. -type ProjectHistory struct { +// ProjectVersion represents a single version of a project. +type ProjectVersion struct { ID uuid.UUID `json:"id"` ProjectID uuid.UUID `json:"project_id"` CreatedAt time.Time `json:"created_at"` @@ -31,11 +31,11 @@ type ProjectHistory struct { Import ProvisionerJob `json:"import"` } -// ProjectParameter represents a parameter parsed from project history source on creation. +// ProjectParameter represents a parameter parsed from project version source on creation. type ProjectParameter struct { ID uuid.UUID `json:"id"` CreatedAt time.Time `json:"created_at"` - ProjectHistoryID uuid.UUID `json:"project_history_id"` + ProjectVersionID uuid.UUID `json:"project_version_id"` Name string `json:"name"` Description string `json:"description,omitempty"` DefaultSourceScheme database.ParameterSourceScheme `json:"default_source_scheme,omitempty"` @@ -52,28 +52,28 @@ type ProjectParameter struct { ValidationValueType string `json:"validation_value_type,omitempty"` } -// CreateProjectHistoryRequest enables callers to create a new Project Version. -type CreateProjectHistoryRequest struct { +// CreateProjectVersionRequest enables callers to create a new Project Version. +type CreateProjectVersionRequest struct { StorageMethod database.ProjectStorageMethod `json:"storage_method" validate:"oneof=inline-archive,required"` StorageSource []byte `json:"storage_source" validate:"max=1048576,required"` } -// Lists history for a single project. -func (api *api) projectHistoryByOrganization(rw http.ResponseWriter, r *http.Request) { +// Lists versions for a single project. +func (api *api) projectVersionsByOrganization(rw http.ResponseWriter, r *http.Request) { project := httpmw.ProjectParam(r) - history, err := api.Database.GetProjectHistoryByProjectID(r.Context(), project.ID) + version, err := api.Database.GetProjectVersionByProjectID(r.Context(), project.ID) if errors.Is(err, sql.ErrNoRows) { err = nil } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get project history: %s", err), + Message: fmt.Sprintf("get project version: %s", err), }) return } - apiHistory := make([]ProjectHistory, 0) - for _, version := range history { + apiVersion := make([]ProjectVersion, 0) + for _, version := range version { job, err := api.Database.GetProvisionerJobByID(r.Context(), version.ImportJobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ @@ -81,16 +81,16 @@ func (api *api) projectHistoryByOrganization(rw http.ResponseWriter, r *http.Req }) return } - apiHistory = append(apiHistory, convertProjectHistory(version, job)) + apiVersion = append(apiVersion, convertProjectVersion(version, job)) } render.Status(r, http.StatusOK) - render.JSON(rw, r, apiHistory) + render.JSON(rw, r, apiVersion) } -// Return a single project history by organization and name. -func (api *api) projectHistoryByOrganizationAndName(rw http.ResponseWriter, r *http.Request) { - projectHistory := httpmw.ProjectHistoryParam(r) - job, err := api.Database.GetProvisionerJobByID(r.Context(), projectHistory.ImportJobID) +// Return a single project version by organization and name. +func (api *api) projectVersionByOrganizationAndName(rw http.ResponseWriter, r *http.Request) { + projectVersion := httpmw.ProjectVersionParam(r) + job, err := api.Database.GetProvisionerJobByID(r.Context(), projectVersion.ImportJobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ Message: fmt.Sprintf("get provisioner job: %s", err), @@ -98,14 +98,14 @@ func (api *api) projectHistoryByOrganizationAndName(rw http.ResponseWriter, r *h return } render.Status(r, http.StatusOK) - render.JSON(rw, r, convertProjectHistory(projectHistory, job)) + render.JSON(rw, r, convertProjectVersion(projectVersion, job)) } // Creates a new version of the project. An import job is queued to parse // the storage method provided. Once completed, the import job will specify // the version as latest. -func (api *api) postProjectHistoryByOrganization(rw http.ResponseWriter, r *http.Request) { - var createProjectVersion CreateProjectHistoryRequest +func (api *api) postProjectVersionByOrganization(rw http.ResponseWriter, r *http.Request) { + var createProjectVersion CreateProjectVersionRequest if !httpapi.Read(rw, r, &createProjectVersion) { return } @@ -131,11 +131,11 @@ func (api *api) postProjectHistoryByOrganization(rw http.ResponseWriter, r *http project := httpmw.ProjectParam(r) var provisionerJob database.ProvisionerJob - var projectHistory database.ProjectHistory + var projectVersion database.ProjectVersion err := api.Database.InTx(func(db database.Store) error { - projectHistoryID := uuid.New() + projectVersionID := uuid.New() input, err := json.Marshal(projectImportJob{ - ProjectHistoryID: projectHistoryID, + ProjectVersionID: projectVersionID, }) if err != nil { return xerrors.Errorf("marshal import job: %w", err) @@ -155,8 +155,8 @@ func (api *api) postProjectHistoryByOrganization(rw http.ResponseWriter, r *http return xerrors.Errorf("insert provisioner job: %w", err) } - projectHistory, err = api.Database.InsertProjectHistory(r.Context(), database.InsertProjectHistoryParams{ - ID: projectHistoryID, + projectVersion, err = api.Database.InsertProjectVersion(r.Context(), database.InsertProjectVersionParams{ + ID: projectVersionID, ProjectID: project.ID, CreatedAt: database.Now(), UpdatedAt: database.Now(), @@ -166,7 +166,7 @@ func (api *api) postProjectHistoryByOrganization(rw http.ResponseWriter, r *http ImportJobID: provisionerJob.ID, }) if err != nil { - return xerrors.Errorf("insert project history: %s", err) + return xerrors.Errorf("insert project version: %s", err) } return nil }) @@ -178,12 +178,12 @@ func (api *api) postProjectHistoryByOrganization(rw http.ResponseWriter, r *http } render.Status(r, http.StatusCreated) - render.JSON(rw, r, convertProjectHistory(projectHistory, provisionerJob)) + render.JSON(rw, r, convertProjectVersion(projectVersion, provisionerJob)) } -func (api *api) projectHistoryParametersByOrganizationAndName(rw http.ResponseWriter, r *http.Request) { - projectHistory := httpmw.ProjectHistoryParam(r) - job, err := api.Database.GetProvisionerJobByID(r.Context(), projectHistory.ImportJobID) +func (api *api) projectVersionParametersByOrganizationAndName(rw http.ResponseWriter, r *http.Request) { + projectVersion := httpmw.ProjectVersionParam(r) + job, err := api.Database.GetProvisionerJobByID(r.Context(), projectVersion.ImportJobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ Message: fmt.Sprintf("get provisioner job: %s", err), @@ -204,7 +204,7 @@ func (api *api) projectHistoryParametersByOrganizationAndName(rw http.ResponseWr return } - parameters, err := api.Database.GetProjectParametersByHistoryID(r.Context(), projectHistory.ID) + parameters, err := api.Database.GetProjectParametersByVersionID(r.Context(), projectVersion.ID) if errors.Is(err, sql.ErrNoRows) { err = nil parameters = []database.ProjectParameter{} @@ -225,14 +225,14 @@ func (api *api) projectHistoryParametersByOrganizationAndName(rw http.ResponseWr render.JSON(rw, r, apiParameters) } -func convertProjectHistory(history database.ProjectHistory, job database.ProvisionerJob) ProjectHistory { - return ProjectHistory{ - ID: history.ID, - ProjectID: history.ProjectID, - CreatedAt: history.CreatedAt, - UpdatedAt: history.UpdatedAt, - Name: history.Name, - StorageMethod: history.StorageMethod, +func convertProjectVersion(version database.ProjectVersion, job database.ProvisionerJob) ProjectVersion { + return ProjectVersion{ + ID: version.ID, + ProjectID: version.ProjectID, + CreatedAt: version.CreatedAt, + UpdatedAt: version.UpdatedAt, + Name: version.Name, + StorageMethod: version.StorageMethod, Import: convertProvisionerJob(job), } } @@ -241,7 +241,7 @@ func convertProjectParameter(parameter database.ProjectParameter) ProjectParamet return ProjectParameter{ ID: parameter.ID, CreatedAt: parameter.CreatedAt, - ProjectHistoryID: parameter.ProjectHistoryID, + ProjectVersionID: parameter.ProjectVersionID, Name: parameter.Name, Description: parameter.Description, DefaultSourceScheme: parameter.DefaultSourceScheme, @@ -259,6 +259,6 @@ func convertProjectParameter(parameter database.ProjectParameter) ProjectParamet } } -func projectHistoryLogsChannel(projectHistoryID uuid.UUID) string { - return fmt.Sprintf("project-history-logs:%s", projectHistoryID) +func projectVersionLogsChannel(projectVersionID uuid.UUID) string { + return fmt.Sprintf("project-version-logs:%s", projectVersionID) } diff --git a/coderd/projecthistory_test.go b/coderd/projectversion_test.go similarity index 78% rename from coderd/projecthistory_test.go rename to coderd/projectversion_test.go index a0cf932886..69d8d011b4 100644 --- a/coderd/projecthistory_test.go +++ b/coderd/projectversion_test.go @@ -15,7 +15,7 @@ import ( "github.com/coder/coder/provisionersdk/proto" ) -func TestProjectHistory(t *testing.T) { +func TestProjectVersion(t *testing.T) { t.Parallel() t.Run("NoHistory", func(t *testing.T) { @@ -27,12 +27,12 @@ func TestProjectHistory(t *testing.T) { Provisioner: database.ProvisionerTypeEcho, }) require.NoError(t, err) - versions, err := server.Client.ListProjectHistory(context.Background(), user.Organization, project.Name) + versions, err := server.Client.ProjectVersions(context.Background(), user.Organization, project.Name) require.NoError(t, err) require.Len(t, versions, 0) }) - t.Run("CreateHistory", func(t *testing.T) { + t.Run("CreateVersion", func(t *testing.T) { t.Parallel() server := coderdtest.New(t) user := server.RandomInitialUser(t) @@ -47,16 +47,16 @@ func TestProjectHistory(t *testing.T) { }, }}, nil) require.NoError(t, err) - history, err := server.Client.CreateProjectHistory(context.Background(), user.Organization, project.Name, coderd.CreateProjectHistoryRequest{ + version, err := server.Client.CreateProjectVersion(context.Background(), user.Organization, project.Name, coderd.CreateProjectVersionRequest{ StorageMethod: database.ProjectStorageMethodInlineArchive, StorageSource: data, }) require.NoError(t, err) - versions, err := server.Client.ListProjectHistory(context.Background(), user.Organization, project.Name) + versions, err := server.Client.ProjectVersions(context.Background(), user.Organization, project.Name) require.NoError(t, err) require.Len(t, versions, 1) - _, err = server.Client.ProjectHistory(context.Background(), user.Organization, project.Name, history.Name) + _, err = server.Client.ProjectVersion(context.Background(), user.Organization, project.Name, version.Name) require.NoError(t, err) }) @@ -78,7 +78,7 @@ func TestProjectHistory(t *testing.T) { require.NoError(t, err) _, err = writer.Write(make([]byte, 1<<21)) require.NoError(t, err) - _, err = server.Client.CreateProjectHistory(context.Background(), user.Organization, project.Name, coderd.CreateProjectHistoryRequest{ + _, err = server.Client.CreateProjectVersion(context.Background(), user.Organization, project.Name, coderd.CreateProjectVersionRequest{ StorageMethod: database.ProjectStorageMethodInlineArchive, StorageSource: buffer.Bytes(), }) @@ -94,7 +94,7 @@ func TestProjectHistory(t *testing.T) { Provisioner: database.ProvisionerTypeEcho, }) require.NoError(t, err) - _, err = server.Client.CreateProjectHistory(context.Background(), user.Organization, project.Name, coderd.CreateProjectHistoryRequest{ + _, err = server.Client.CreateProjectVersion(context.Background(), user.Organization, project.Name, coderd.CreateProjectVersionRequest{ StorageMethod: database.ProjectStorageMethodInlineArchive, StorageSource: []byte{}, }) diff --git a/coderd/provisionerdaemons.go b/coderd/provisionerdaemons.go index 445f9ed171..69886a6848 100644 --- a/coderd/provisionerdaemons.go +++ b/coderd/provisionerdaemons.go @@ -106,7 +106,7 @@ type workspaceProvisionJob struct { // The input for a "project_import" job. type projectImportJob struct { - ProjectHistoryID uuid.UUID `json:"project_history_id"` + ProjectVersionID uuid.UUID `json:"project_version_id"` } // Implementation of the provisioner daemon protobuf server. @@ -182,7 +182,7 @@ func (server *provisionerdServer) AcquireJob(ctx context.Context, _ *proto.Empty ProjectName: project.Name, UserName: user.Username, } - var projectHistory database.ProjectHistory + var projectVersion database.ProjectVersion switch job.Type { case database.ProvisionerJobTypeWorkspaceProvision: var input workspaceProvisionJob @@ -198,16 +198,16 @@ func (server *provisionerdServer) AcquireJob(ctx context.Context, _ *proto.Empty if err != nil { return nil, failJob(fmt.Sprintf("get workspace: %s", err)) } - projectHistory, err = server.Database.GetProjectHistoryByID(ctx, workspaceHistory.ProjectHistoryID) + projectVersion, err = server.Database.GetProjectVersionByID(ctx, workspaceHistory.ProjectVersionID) if err != nil { - return nil, failJob(fmt.Sprintf("get project history: %s", err)) + return nil, failJob(fmt.Sprintf("get project version: %s", err)) } // Compute parameters for the workspace to consume. parameters, err := projectparameter.Compute(ctx, server.Database, projectparameter.Scope{ OrganizationID: organization.ID, ProjectID: project.ID, - ProjectHistoryID: projectHistory.ID, + ProjectVersionID: projectVersion.ID, UserID: user.ID, WorkspaceID: workspace.ID, WorkspaceHistoryID: workspaceHistory.ID, @@ -249,23 +249,23 @@ func (server *provisionerdServer) AcquireJob(ctx context.Context, _ *proto.Empty if err != nil { return nil, failJob(fmt.Sprintf("unmarshal job input %q: %s", job.Input, err)) } - projectHistory, err = server.Database.GetProjectHistoryByID(ctx, input.ProjectHistoryID) + projectVersion, err = server.Database.GetProjectVersionByID(ctx, input.ProjectVersionID) if err != nil { - return nil, failJob(fmt.Sprintf("get project history: %s", err)) + return nil, failJob(fmt.Sprintf("get project version: %s", err)) } protoJob.Type = &proto.AcquiredJob_ProjectImport_{ ProjectImport: &proto.AcquiredJob_ProjectImport{ - ProjectHistoryId: projectHistory.ID.String(), - ProjectHistoryName: projectHistory.Name, + ProjectVersionId: projectVersion.ID.String(), + ProjectVersionName: projectVersion.Name, }, } } - switch projectHistory.StorageMethod { + switch projectVersion.StorageMethod { case database.ProjectStorageMethodInlineArchive: - protoJob.ProjectSourceArchive = projectHistory.StorageSource + protoJob.ProjectSourceArchive = projectVersion.StorageSource default: - return nil, failJob(fmt.Sprintf("unsupported storage source: %q", projectHistory.StorageMethod)) + return nil, failJob(fmt.Sprintf("unsupported storage source: %q", projectVersion.StorageMethod)) } return protoJob, err @@ -309,8 +309,8 @@ func (server *provisionerdServer) UpdateJob(stream proto.DRPCProvisionerDaemon_U if err != nil { return xerrors.Errorf("unmarshal job input %q: %s", job.Input, err) } - insertParams := database.InsertProjectHistoryLogsParams{ - ProjectHistoryID: input.ProjectHistoryID, + insertParams := database.InsertProjectVersionLogsParams{ + ProjectVersionID: input.ProjectVersionID, } for _, log := range update.ProjectImportLogs { logLevel, err := convertLogLevel(log.Level) @@ -327,7 +327,7 @@ func (server *provisionerdServer) UpdateJob(stream proto.DRPCProvisionerDaemon_U insertParams.Source = append(insertParams.Source, logSource) insertParams.Output = append(insertParams.Output, log.Output) } - logs, err := server.Database.InsertProjectHistoryLogs(stream.Context(), insertParams) + logs, err := server.Database.InsertProjectVersionLogs(stream.Context(), insertParams) if err != nil { return xerrors.Errorf("insert project logs: %w", err) } @@ -335,7 +335,7 @@ func (server *provisionerdServer) UpdateJob(stream proto.DRPCProvisionerDaemon_U if err != nil { return xerrors.Errorf("marshal project log: %w", err) } - err = server.Pubsub.Publish(projectHistoryLogsChannel(input.ProjectHistoryID), data) + err = server.Pubsub.Publish(projectVersionLogsChannel(input.ProjectVersionID), data) if err != nil { return xerrors.Errorf("publish history log: %w", err) } @@ -442,7 +442,7 @@ func (server *provisionerdServer) CompleteJob(ctx context.Context, completed *pr projectParameter := database.InsertProjectParameterParams{ ID: uuid.New(), CreatedAt: database.Now(), - ProjectHistoryID: input.ProjectHistoryID, + ProjectVersionID: input.ProjectVersionID, Name: protoParameter.Name, Description: protoParameter.Description, RedisplayValue: protoParameter.RedisplayValue, diff --git a/coderd/workspacehistory.go b/coderd/workspacehistory.go index 59ba0ed9e7..8ebdee7df1 100644 --- a/coderd/workspacehistory.go +++ b/coderd/workspacehistory.go @@ -25,7 +25,7 @@ type WorkspaceHistory struct { CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` WorkspaceID uuid.UUID `json:"workspace_id"` - ProjectHistoryID uuid.UUID `json:"project_history_id"` + ProjectVersionID uuid.UUID `json:"project_version_id"` BeforeID uuid.UUID `json:"before_id"` AfterID uuid.UUID `json:"after_id"` Name string `json:"name"` @@ -36,7 +36,7 @@ type WorkspaceHistory struct { // CreateWorkspaceHistoryRequest provides options to update the latest workspace history. type CreateWorkspaceHistoryRequest struct { - ProjectHistoryID uuid.UUID `json:"project_history_id" validate:"required"` + ProjectVersionID uuid.UUID `json:"project_version_id" validate:"required"` Transition database.WorkspaceTransition `json:"transition" validate:"oneof=create start stop delete,required"` } @@ -47,12 +47,12 @@ func (api *api) postWorkspaceHistoryByUser(rw http.ResponseWriter, r *http.Reque } user := httpmw.UserParam(r) workspace := httpmw.WorkspaceParam(r) - projectHistory, err := api.Database.GetProjectHistoryByID(r.Context(), createBuild.ProjectHistoryID) + projectVersion, err := api.Database.GetProjectVersionByID(r.Context(), createBuild.ProjectVersionID) if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "project history not found", + Message: "project version not found", Errors: []httpapi.Error{{ - Field: "project_history_id", + Field: "project_version_id", Code: "exists", }}, }) @@ -60,36 +60,36 @@ func (api *api) postWorkspaceHistoryByUser(rw http.ResponseWriter, r *http.Reque } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get project history: %s", err), + Message: fmt.Sprintf("get project version: %s", err), }) return } - projectHistoryJob, err := api.Database.GetProvisionerJobByID(r.Context(), projectHistory.ImportJobID) + projectVersionJob, err := api.Database.GetProvisionerJobByID(r.Context(), projectVersion.ImportJobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ Message: fmt.Sprintf("get provisioner job: %s", err), }) return } - projectHistoryJobStatus := convertProvisionerJob(projectHistoryJob).Status - switch projectHistoryJobStatus { + projectVersionJobStatus := convertProvisionerJob(projectVersionJob).Status + switch projectVersionJobStatus { case ProvisionerJobStatusPending, ProvisionerJobStatusRunning: httpapi.Write(rw, http.StatusPreconditionFailed, httpapi.Response{ - Message: fmt.Sprintf("The provided project history is %s. Wait for it to complete importing!", projectHistoryJobStatus), + Message: fmt.Sprintf("The provided project version is %s. Wait for it to complete importing!", projectVersionJobStatus), }) return case ProvisionerJobStatusFailed: httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("The provided project history %q has failed to import. You cannot create workspaces using it!", projectHistory.Name), + Message: fmt.Sprintf("The provided project version %q has failed to import. You cannot create workspaces using it!", projectVersion.Name), }) return case ProvisionerJobStatusCancelled: httpapi.Write(rw, http.StatusPreconditionFailed, httpapi.Response{ - Message: "The provided project history was canceled during import. You cannot create workspaces using it!", + Message: "The provided project version was canceled during import. You cannot create workspaces using it!", }) } - project, err := api.Database.GetProjectByID(r.Context(), projectHistory.ProjectID) + project, err := api.Database.GetProjectByID(r.Context(), projectVersion.ProjectID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ Message: fmt.Sprintf("get project: %s", err), @@ -154,7 +154,7 @@ func (api *api) postWorkspaceHistoryByUser(rw http.ResponseWriter, r *http.Reque CreatedAt: database.Now(), UpdatedAt: database.Now(), WorkspaceID: workspace.ID, - ProjectHistoryID: projectHistory.ID, + ProjectVersionID: projectVersion.ID, BeforeID: priorHistoryID, Name: namesgenerator.GetRandomName(1), Initiator: user.ID, @@ -246,7 +246,7 @@ func convertWorkspaceHistory(workspaceHistory database.WorkspaceHistory, provisi CreatedAt: workspaceHistory.CreatedAt, UpdatedAt: workspaceHistory.UpdatedAt, WorkspaceID: workspaceHistory.WorkspaceID, - ProjectHistoryID: workspaceHistory.ProjectHistoryID, + ProjectVersionID: workspaceHistory.ProjectVersionID, BeforeID: workspaceHistory.BeforeID.UUID, AfterID: workspaceHistory.AfterID.UUID, Name: workspaceHistory.Name, diff --git a/coderd/workspacehistory_test.go b/coderd/workspacehistory_test.go index d65e82fd10..484269892a 100644 --- a/coderd/workspacehistory_test.go +++ b/coderd/workspacehistory_test.go @@ -32,19 +32,19 @@ func TestWorkspaceHistory(t *testing.T) { return project, workspace } - setupProjectHistory := func(t *testing.T, client *codersdk.Client, user coderd.CreateInitialUserRequest, project coderd.Project, data []byte) coderd.ProjectHistory { - projectHistory, err := client.CreateProjectHistory(context.Background(), user.Organization, project.Name, coderd.CreateProjectHistoryRequest{ + setupProjectVersion := func(t *testing.T, client *codersdk.Client, user coderd.CreateInitialUserRequest, project coderd.Project, data []byte) coderd.ProjectVersion { + projectVersion, err := client.CreateProjectVersion(context.Background(), user.Organization, project.Name, coderd.CreateProjectVersionRequest{ StorageMethod: database.ProjectStorageMethodInlineArchive, StorageSource: data, }) require.NoError(t, err) require.Eventually(t, func() bool { - hist, err := client.ProjectHistory(context.Background(), user.Organization, project.Name, projectHistory.Name) + version, err := client.ProjectVersion(context.Background(), user.Organization, project.Name, projectVersion.Name) require.NoError(t, err) - t.Logf("Import status: %s\n", hist.Import.Status) - return hist.Import.Status.Completed() + t.Logf("Import status: %s\n", version.Import.Status) + return version.Import.Status.Completed() }, 15*time.Second, 50*time.Millisecond) - return projectHistory + return projectVersion } t.Run("AllHistory", func(t *testing.T) { @@ -58,9 +58,9 @@ func TestWorkspaceHistory(t *testing.T) { require.Len(t, history, 0) data, err := echo.Tar(echo.ParseComplete, echo.ProvisionComplete) require.NoError(t, err) - projectVersion := setupProjectHistory(t, server.Client, user, project, data) + projectVersion := setupProjectVersion(t, server.Client, user, project, data) _, err = server.Client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{ - ProjectHistoryID: projectVersion.ID, + ProjectVersionID: projectVersion.ID, Transition: database.WorkspaceTransitionCreate, }) require.NoError(t, err) @@ -79,9 +79,9 @@ func TestWorkspaceHistory(t *testing.T) { require.Error(t, err) data, err := echo.Tar(echo.ParseComplete, echo.ProvisionComplete) require.NoError(t, err) - projectHistory := setupProjectHistory(t, server.Client, user, project, data) + projectVersion := setupProjectVersion(t, server.Client, user, project, data) _, err = server.Client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{ - ProjectHistoryID: projectHistory.ID, + ProjectVersionID: projectVersion.ID, Transition: database.WorkspaceTransitionCreate, }) require.NoError(t, err) @@ -97,9 +97,9 @@ func TestWorkspaceHistory(t *testing.T) { project, workspace := setupProjectAndWorkspace(t, server.Client, user) data, err := echo.Tar(echo.ParseComplete, echo.ProvisionComplete) require.NoError(t, err) - projectHistory := setupProjectHistory(t, server.Client, user, project, data) + projectVersion := setupProjectVersion(t, server.Client, user, project, data) _, err = server.Client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{ - ProjectHistoryID: projectHistory.ID, + ProjectVersionID: projectVersion.ID, Transition: database.WorkspaceTransitionCreate, }) require.NoError(t, err) @@ -122,16 +122,16 @@ func TestWorkspaceHistory(t *testing.T) { project, workspace := setupProjectAndWorkspace(t, server.Client, user) data, err := echo.Tar(echo.ParseComplete, echo.ProvisionComplete) require.NoError(t, err) - projectHistory := setupProjectHistory(t, server.Client, user, project, data) + projectVersion := setupProjectVersion(t, server.Client, user, project, data) _, err = server.Client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{ - ProjectHistoryID: projectHistory.ID, + ProjectVersionID: projectVersion.ID, Transition: database.WorkspaceTransitionCreate, }) require.NoError(t, err) _, err = server.Client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{ - ProjectHistoryID: projectHistory.ID, + ProjectVersionID: projectVersion.ID, Transition: database.WorkspaceTransitionCreate, }) require.Error(t, err) @@ -145,7 +145,7 @@ func TestWorkspaceHistory(t *testing.T) { _, workspace := setupProjectAndWorkspace(t, server.Client, user) _, err := server.Client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{ - ProjectHistoryID: uuid.New(), + ProjectVersionID: uuid.New(), Transition: database.WorkspaceTransitionCreate, }) require.Error(t, err) diff --git a/coderd/workspacehistorylogs_test.go b/coderd/workspacehistorylogs_test.go index 9e9dd06fbd..f507001beb 100644 --- a/coderd/workspacehistorylogs_test.go +++ b/coderd/workspacehistorylogs_test.go @@ -32,18 +32,18 @@ func TestWorkspaceHistoryLogs(t *testing.T) { return project, workspace } - setupProjectHistory := func(t *testing.T, client *codersdk.Client, user coderd.CreateInitialUserRequest, project coderd.Project, data []byte) coderd.ProjectHistory { - projectHistory, err := client.CreateProjectHistory(context.Background(), user.Organization, project.Name, coderd.CreateProjectHistoryRequest{ + setupProjectVersion := func(t *testing.T, client *codersdk.Client, user coderd.CreateInitialUserRequest, project coderd.Project, data []byte) coderd.ProjectVersion { + projectVersion, err := client.CreateProjectVersion(context.Background(), user.Organization, project.Name, coderd.CreateProjectVersionRequest{ StorageMethod: database.ProjectStorageMethodInlineArchive, StorageSource: data, }) require.NoError(t, err) require.Eventually(t, func() bool { - hist, err := client.ProjectHistory(context.Background(), user.Organization, project.Name, projectHistory.Name) + hist, err := client.ProjectVersion(context.Background(), user.Organization, project.Name, projectVersion.Name) require.NoError(t, err) return hist.Import.Status.Completed() }, 15*time.Second, 50*time.Millisecond) - return projectHistory + return projectVersion } server := coderdtest.New(t) @@ -62,10 +62,10 @@ func TestWorkspaceHistoryLogs(t *testing.T) { }, }}) require.NoError(t, err) - projectHistory := setupProjectHistory(t, server.Client, user, project, data) + projectVersion := setupProjectVersion(t, server.Client, user, project, data) workspaceHistory, err := server.Client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{ - ProjectHistoryID: projectHistory.ID, + ProjectVersionID: projectVersion.ID, Transition: database.WorkspaceTransitionCreate, }) require.NoError(t, err) diff --git a/codersdk/projects.go b/codersdk/projects.go index 7b43e5d604..e3805ba3c4 100644 --- a/codersdk/projects.go +++ b/codersdk/projects.go @@ -57,9 +57,9 @@ func (c *Client) CreateProject(ctx context.Context, organization string, request return project, json.NewDecoder(res.Body).Decode(&project) } -// ListProjectHistory lists history for a project. -func (c *Client) ListProjectHistory(ctx context.Context, organization, project string) ([]coderd.ProjectHistory, error) { - res, err := c.request(ctx, http.MethodGet, fmt.Sprintf("/api/v2/projects/%s/%s/history", organization, project), nil) +// ProjectVersions lists versions of a project. +func (c *Client) ProjectVersions(ctx context.Context, organization, project string) ([]coderd.ProjectVersion, error) { + res, err := c.request(ctx, http.MethodGet, fmt.Sprintf("/api/v2/projects/%s/%s/versions", organization, project), nil) if err != nil { return nil, err } @@ -67,41 +67,41 @@ func (c *Client) ListProjectHistory(ctx context.Context, organization, project s if res.StatusCode != http.StatusOK { return nil, readBodyAsError(res) } - var projectHistory []coderd.ProjectHistory - return projectHistory, json.NewDecoder(res.Body).Decode(&projectHistory) -} - -// ProjectHistory returns project history by name. -func (c *Client) ProjectHistory(ctx context.Context, organization, project, history string) (coderd.ProjectHistory, error) { - res, err := c.request(ctx, http.MethodGet, fmt.Sprintf("/api/v2/projects/%s/%s/history/%s", organization, project, history), nil) - if err != nil { - return coderd.ProjectHistory{}, err - } - defer res.Body.Close() - if res.StatusCode != http.StatusOK { - return coderd.ProjectHistory{}, readBodyAsError(res) - } - var projectHistory coderd.ProjectHistory - return projectHistory, json.NewDecoder(res.Body).Decode(&projectHistory) -} - -// CreateProjectHistory inserts a new version for the project. -func (c *Client) CreateProjectHistory(ctx context.Context, organization, project string, request coderd.CreateProjectHistoryRequest) (coderd.ProjectHistory, error) { - res, err := c.request(ctx, http.MethodPost, fmt.Sprintf("/api/v2/projects/%s/%s/history", organization, project), request) - if err != nil { - return coderd.ProjectHistory{}, err - } - defer res.Body.Close() - if res.StatusCode != http.StatusCreated { - return coderd.ProjectHistory{}, readBodyAsError(res) - } - var projectVersion coderd.ProjectHistory + var projectVersion []coderd.ProjectVersion return projectVersion, json.NewDecoder(res.Body).Decode(&projectVersion) } -// ProjectHistoryParameters returns project parameters for history by name. -func (c *Client) ProjectHistoryParameters(ctx context.Context, organization, project, history string) ([]coderd.ProjectParameter, error) { - res, err := c.request(ctx, http.MethodGet, fmt.Sprintf("/api/v2/projects/%s/%s/history/%s/parameters", organization, project, history), nil) +// ProjectVersion returns project version by name. +func (c *Client) ProjectVersion(ctx context.Context, organization, project, version string) (coderd.ProjectVersion, error) { + res, err := c.request(ctx, http.MethodGet, fmt.Sprintf("/api/v2/projects/%s/%s/versions/%s", organization, project, version), nil) + if err != nil { + return coderd.ProjectVersion{}, err + } + defer res.Body.Close() + if res.StatusCode != http.StatusOK { + return coderd.ProjectVersion{}, readBodyAsError(res) + } + var projectVersion coderd.ProjectVersion + return projectVersion, json.NewDecoder(res.Body).Decode(&projectVersion) +} + +// CreateProjectVersion inserts a new version for the project. +func (c *Client) CreateProjectVersion(ctx context.Context, organization, project string, request coderd.CreateProjectVersionRequest) (coderd.ProjectVersion, error) { + res, err := c.request(ctx, http.MethodPost, fmt.Sprintf("/api/v2/projects/%s/%s/versions", organization, project), request) + if err != nil { + return coderd.ProjectVersion{}, err + } + defer res.Body.Close() + if res.StatusCode != http.StatusCreated { + return coderd.ProjectVersion{}, readBodyAsError(res) + } + var projectVersion coderd.ProjectVersion + return projectVersion, json.NewDecoder(res.Body).Decode(&projectVersion) +} + +// ProjectVersionParameters returns project parameters for a version by name. +func (c *Client) ProjectVersionParameters(ctx context.Context, organization, project, version string) ([]coderd.ProjectParameter, error) { + res, err := c.request(ctx, http.MethodGet, fmt.Sprintf("/api/v2/projects/%s/%s/versions/%s/parameters", organization, project, version), nil) if err != nil { return nil, err } diff --git a/codersdk/projects_test.go b/codersdk/projects_test.go index 0645438c24..957a759b3e 100644 --- a/codersdk/projects_test.go +++ b/codersdk/projects_test.go @@ -74,7 +74,7 @@ func TestProjects(t *testing.T) { t.Run("UnauthenticatedHistory", func(t *testing.T) { t.Parallel() server := coderdtest.New(t) - _, err := server.Client.ListProjectHistory(context.Background(), "org", "project") + _, err := server.Client.ProjectVersions(context.Background(), "org", "project") require.Error(t, err) }) @@ -87,14 +87,14 @@ func TestProjects(t *testing.T) { Provisioner: database.ProvisionerTypeEcho, }) require.NoError(t, err) - _, err = server.Client.ListProjectHistory(context.Background(), user.Organization, project.Name) + _, err = server.Client.ProjectVersions(context.Background(), user.Organization, project.Name) require.NoError(t, err) }) t.Run("CreateHistoryUnauthenticated", func(t *testing.T) { t.Parallel() server := coderdtest.New(t) - _, err := server.Client.CreateProjectHistory(context.Background(), "org", "project", coderd.CreateProjectHistoryRequest{ + _, err := server.Client.CreateProjectVersion(context.Background(), "org", "project", coderd.CreateProjectVersionRequest{ StorageMethod: database.ProjectStorageMethodInlineArchive, StorageSource: []byte{}, }) @@ -119,13 +119,13 @@ func TestProjects(t *testing.T) { require.NoError(t, err) _, err = writer.Write(make([]byte, 1<<10)) require.NoError(t, err) - history, err := server.Client.CreateProjectHistory(context.Background(), user.Organization, project.Name, coderd.CreateProjectHistoryRequest{ + version, err := server.Client.CreateProjectVersion(context.Background(), user.Organization, project.Name, coderd.CreateProjectVersionRequest{ StorageMethod: database.ProjectStorageMethodInlineArchive, StorageSource: buffer.Bytes(), }) require.NoError(t, err) - _, err = server.Client.ProjectHistory(context.Background(), user.Organization, project.Name, history.Name) + _, err = server.Client.ProjectVersion(context.Background(), user.Organization, project.Name, version.Name) require.NoError(t, err) }) @@ -168,7 +168,7 @@ func TestProjects(t *testing.T) { t.Parallel() server := coderdtest.New(t) user := server.RandomInitialUser(t) - _, err := server.Client.ProjectHistoryParameters(context.Background(), user.Organization, "nothing", "nope") + _, err := server.Client.ProjectVersionParameters(context.Background(), user.Organization, "nothing", "nope") require.Error(t, err) }) } diff --git a/codersdk/workspaces.go b/codersdk/workspaces.go index 79878bf407..d6ddf14f7b 100644 --- a/codersdk/workspaces.go +++ b/codersdk/workspaces.go @@ -68,7 +68,7 @@ func (c *Client) ListWorkspaceHistory(ctx context.Context, owner, workspace stri if owner == "" { owner = "me" } - res, err := c.request(ctx, http.MethodGet, fmt.Sprintf("/api/v2/workspaces/%s/%s/history", owner, workspace), nil) + res, err := c.request(ctx, http.MethodGet, fmt.Sprintf("/api/v2/workspaces/%s/%s/version", owner, workspace), nil) if err != nil { return nil, err } @@ -89,7 +89,7 @@ func (c *Client) WorkspaceHistory(ctx context.Context, owner, workspace, history if history == "" { history = "latest" } - res, err := c.request(ctx, http.MethodGet, fmt.Sprintf("/api/v2/workspaces/%s/%s/history/%s", owner, workspace, history), nil) + res, err := c.request(ctx, http.MethodGet, fmt.Sprintf("/api/v2/workspaces/%s/%s/version/%s", owner, workspace, history), nil) if err != nil { return coderd.WorkspaceHistory{}, err } @@ -123,7 +123,7 @@ func (c *Client) CreateWorkspaceHistory(ctx context.Context, owner, workspace st if owner == "" { owner = "me" } - res, err := c.request(ctx, http.MethodPost, fmt.Sprintf("/api/v2/workspaces/%s/%s/history", owner, workspace), request) + res, err := c.request(ctx, http.MethodPost, fmt.Sprintf("/api/v2/workspaces/%s/%s/version", owner, workspace), request) if err != nil { return coderd.WorkspaceHistory{}, err } @@ -153,7 +153,7 @@ func (c *Client) WorkspaceHistoryLogsBetween(ctx context.Context, owner, workspa if !before.IsZero() { values["before"] = []string{strconv.FormatInt(before.UTC().UnixMilli(), 10)} } - res, err := c.request(ctx, http.MethodGet, fmt.Sprintf("/api/v2/workspaces/%s/%s/history/%s/logs?%s", owner, workspace, history, values.Encode()), nil) + res, err := c.request(ctx, http.MethodGet, fmt.Sprintf("/api/v2/workspaces/%s/%s/version/%s/logs?%s", owner, workspace, history, values.Encode()), nil) if err != nil { return nil, err } @@ -177,7 +177,7 @@ func (c *Client) FollowWorkspaceHistoryLogsAfter(ctx context.Context, owner, wor owner = "me" } - res, err := c.request(ctx, http.MethodGet, fmt.Sprintf("/api/v2/workspaces/%s/%s/history/%s/logs?follow%s", owner, workspace, history, afterQuery), nil) + res, err := c.request(ctx, http.MethodGet, fmt.Sprintf("/api/v2/workspaces/%s/%s/version/%s/logs?follow%s", owner, workspace, history, afterQuery), nil) if err != nil { return nil, err } diff --git a/codersdk/workspaces_test.go b/codersdk/workspaces_test.go index b030b37414..21e0d5bcaa 100644 --- a/codersdk/workspaces_test.go +++ b/codersdk/workspaces_test.go @@ -161,7 +161,7 @@ func TestWorkspaces(t *testing.T) { }) require.NoError(t, err) _, err = server.Client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{ - ProjectHistoryID: uuid.New(), + ProjectVersionID: uuid.New(), Transition: database.WorkspaceTransitionCreate, }) require.Error(t, err) diff --git a/database/databasefake/databasefake.go b/database/databasefake/databasefake.go index 36a8671c64..2ee1bf965e 100644 --- a/database/databasefake/databasefake.go +++ b/database/databasefake/databasefake.go @@ -21,8 +21,8 @@ func New() database.Store { parameterValue: make([]database.ParameterValue, 0), project: make([]database.Project, 0), - projectHistory: make([]database.ProjectHistory, 0), - projectHistoryLog: make([]database.ProjectHistoryLog, 0), + projectVersion: make([]database.ProjectVersion, 0), + projectVersionLog: make([]database.ProjectVersionLog, 0), projectParameter: make([]database.ProjectParameter, 0), provisionerDaemons: make([]database.ProvisionerDaemon, 0), provisionerJobs: make([]database.ProvisionerJob, 0), @@ -47,8 +47,8 @@ type fakeQuerier struct { // New tables parameterValue []database.ParameterValue project []database.Project - projectHistory []database.ProjectHistory - projectHistoryLog []database.ProjectHistoryLog + projectVersion []database.ProjectVersion + projectVersionLog []database.ProjectVersionLog projectParameter []database.ProjectParameter provisionerDaemons []database.ProvisionerDaemon provisionerJobs []database.ProvisionerJob @@ -410,55 +410,55 @@ func (q *fakeQuerier) GetProjectByOrganizationAndName(_ context.Context, arg dat return database.Project{}, sql.ErrNoRows } -func (q *fakeQuerier) GetProjectHistoryByProjectID(_ context.Context, projectID uuid.UUID) ([]database.ProjectHistory, error) { +func (q *fakeQuerier) GetProjectVersionByProjectID(_ context.Context, projectID uuid.UUID) ([]database.ProjectVersion, error) { q.mutex.Lock() defer q.mutex.Unlock() - history := make([]database.ProjectHistory, 0) - for _, projectHistory := range q.projectHistory { - if projectHistory.ProjectID.String() != projectID.String() { + version := make([]database.ProjectVersion, 0) + for _, projectVersion := range q.projectVersion { + if projectVersion.ProjectID.String() != projectID.String() { continue } - history = append(history, projectHistory) + version = append(version, projectVersion) } - if len(history) == 0 { + if len(version) == 0 { return nil, sql.ErrNoRows } - return history, nil + return version, nil } -func (q *fakeQuerier) GetProjectHistoryByProjectIDAndName(_ context.Context, arg database.GetProjectHistoryByProjectIDAndNameParams) (database.ProjectHistory, error) { +func (q *fakeQuerier) GetProjectVersionByProjectIDAndName(_ context.Context, arg database.GetProjectVersionByProjectIDAndNameParams) (database.ProjectVersion, error) { q.mutex.Lock() defer q.mutex.Unlock() - for _, projectHistory := range q.projectHistory { - if projectHistory.ProjectID.String() != arg.ProjectID.String() { + for _, projectVersion := range q.projectVersion { + if projectVersion.ProjectID.String() != arg.ProjectID.String() { continue } - if !strings.EqualFold(projectHistory.Name, arg.Name) { + if !strings.EqualFold(projectVersion.Name, arg.Name) { continue } - return projectHistory, nil + return projectVersion, nil } - return database.ProjectHistory{}, sql.ErrNoRows + return database.ProjectVersion{}, sql.ErrNoRows } -func (q *fakeQuerier) GetProjectHistoryLogsByIDBetween(_ context.Context, arg database.GetProjectHistoryLogsByIDBetweenParams) ([]database.ProjectHistoryLog, error) { +func (q *fakeQuerier) GetProjectVersionLogsByIDBetween(_ context.Context, arg database.GetProjectVersionLogsByIDBetweenParams) ([]database.ProjectVersionLog, error) { q.mutex.Lock() defer q.mutex.Unlock() - logs := make([]database.ProjectHistoryLog, 0) - for _, projectHistoryLog := range q.projectHistoryLog { - if projectHistoryLog.ProjectHistoryID.String() != arg.ProjectHistoryID.String() { + logs := make([]database.ProjectVersionLog, 0) + for _, projectVersionLog := range q.projectVersionLog { + if projectVersionLog.ProjectVersionID.String() != arg.ProjectVersionID.String() { continue } - if projectHistoryLog.CreatedAt.After(arg.CreatedBefore) { + if projectVersionLog.CreatedAt.After(arg.CreatedBefore) { continue } - if projectHistoryLog.CreatedAt.Before(arg.CreatedAfter) { + if projectVersionLog.CreatedAt.Before(arg.CreatedAfter) { continue } - logs = append(logs, projectHistoryLog) + logs = append(logs, projectVersionLog) } if len(logs) == 0 { return nil, sql.ErrNoRows @@ -466,26 +466,26 @@ func (q *fakeQuerier) GetProjectHistoryLogsByIDBetween(_ context.Context, arg da return logs, nil } -func (q *fakeQuerier) GetProjectHistoryByID(_ context.Context, projectHistoryID uuid.UUID) (database.ProjectHistory, error) { +func (q *fakeQuerier) GetProjectVersionByID(_ context.Context, projectVersionID uuid.UUID) (database.ProjectVersion, error) { q.mutex.Lock() defer q.mutex.Unlock() - for _, projectHistory := range q.projectHistory { - if projectHistory.ID.String() != projectHistoryID.String() { + for _, projectVersion := range q.projectVersion { + if projectVersion.ID.String() != projectVersionID.String() { continue } - return projectHistory, nil + return projectVersion, nil } - return database.ProjectHistory{}, sql.ErrNoRows + return database.ProjectVersion{}, sql.ErrNoRows } -func (q *fakeQuerier) GetProjectParametersByHistoryID(_ context.Context, projectHistoryID uuid.UUID) ([]database.ProjectParameter, error) { +func (q *fakeQuerier) GetProjectParametersByVersionID(_ context.Context, projectVersionID uuid.UUID) ([]database.ProjectParameter, error) { q.mutex.Lock() defer q.mutex.Unlock() parameters := make([]database.ProjectParameter, 0) for _, projectParameter := range q.projectParameter { - if projectParameter.ProjectHistoryID.String() != projectHistoryID.String() { + if projectParameter.ProjectVersionID.String() != projectVersionID.String() { continue } parameters = append(parameters, projectParameter) @@ -660,12 +660,12 @@ func (q *fakeQuerier) InsertProject(_ context.Context, arg database.InsertProjec return project, nil } -func (q *fakeQuerier) InsertProjectHistory(_ context.Context, arg database.InsertProjectHistoryParams) (database.ProjectHistory, error) { +func (q *fakeQuerier) InsertProjectVersion(_ context.Context, arg database.InsertProjectVersionParams) (database.ProjectVersion, error) { q.mutex.Lock() defer q.mutex.Unlock() //nolint:gosimple - history := database.ProjectHistory{ + version := database.ProjectVersion{ ID: arg.ID, ProjectID: arg.ProjectID, CreatedAt: arg.CreatedAt, @@ -676,18 +676,18 @@ func (q *fakeQuerier) InsertProjectHistory(_ context.Context, arg database.Inser StorageSource: arg.StorageSource, ImportJobID: arg.ImportJobID, } - q.projectHistory = append(q.projectHistory, history) - return history, nil + q.projectVersion = append(q.projectVersion, version) + return version, nil } -func (q *fakeQuerier) InsertProjectHistoryLogs(_ context.Context, arg database.InsertProjectHistoryLogsParams) ([]database.ProjectHistoryLog, error) { +func (q *fakeQuerier) InsertProjectVersionLogs(_ context.Context, arg database.InsertProjectVersionLogsParams) ([]database.ProjectVersionLog, error) { q.mutex.Lock() defer q.mutex.Unlock() - logs := make([]database.ProjectHistoryLog, 0) + logs := make([]database.ProjectVersionLog, 0) for index, output := range arg.Output { - logs = append(logs, database.ProjectHistoryLog{ - ProjectHistoryID: arg.ProjectHistoryID, + logs = append(logs, database.ProjectVersionLog{ + ProjectVersionID: arg.ProjectVersionID, ID: arg.ID[index], CreatedAt: arg.CreatedAt[index], Source: arg.Source[index], @@ -695,7 +695,7 @@ func (q *fakeQuerier) InsertProjectHistoryLogs(_ context.Context, arg database.I Output: output, }) } - q.projectHistoryLog = append(q.projectHistoryLog, logs...) + q.projectVersionLog = append(q.projectVersionLog, logs...) return logs, nil } @@ -707,7 +707,7 @@ func (q *fakeQuerier) InsertProjectParameter(_ context.Context, arg database.Ins param := database.ProjectParameter{ ID: arg.ID, CreatedAt: arg.CreatedAt, - ProjectHistoryID: arg.ProjectHistoryID, + ProjectVersionID: arg.ProjectVersionID, Name: arg.Name, Description: arg.Description, DefaultSourceScheme: arg.DefaultSourceScheme, @@ -821,7 +821,7 @@ func (q *fakeQuerier) InsertWorkspaceHistory(_ context.Context, arg database.Ins UpdatedAt: arg.UpdatedAt, WorkspaceID: arg.WorkspaceID, Name: arg.Name, - ProjectHistoryID: arg.ProjectHistoryID, + ProjectVersionID: arg.ProjectVersionID, BeforeID: arg.BeforeID, Transition: arg.Transition, Initiator: arg.Initiator, diff --git a/database/dump.sql b/database/dump.sql index 7f174528af..9da449f498 100644 --- a/database/dump.sql +++ b/database/dump.sql @@ -137,7 +137,7 @@ CREATE TABLE project ( active_version_id uuid ); -CREATE TABLE project_history ( +CREATE TABLE project_version ( id uuid NOT NULL, project_id uuid NOT NULL, created_at timestamp with time zone NOT NULL, @@ -149,9 +149,9 @@ CREATE TABLE project_history ( import_job_id uuid NOT NULL ); -CREATE TABLE project_history_log ( +CREATE TABLE project_version_log ( id uuid NOT NULL, - project_history_id uuid NOT NULL, + project_version_id uuid NOT NULL, created_at timestamp with time zone NOT NULL, source log_source NOT NULL, level log_level NOT NULL, @@ -161,7 +161,7 @@ CREATE TABLE project_history_log ( CREATE TABLE project_parameter ( id uuid NOT NULL, created_at timestamp with time zone NOT NULL, - project_history_id uuid NOT NULL, + project_version_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, @@ -247,7 +247,7 @@ CREATE TABLE workspace_history ( created_at timestamp with time zone NOT NULL, updated_at timestamp with time zone NOT NULL, workspace_id uuid NOT NULL, - project_history_id uuid NOT NULL, + project_version_id uuid NOT NULL, name character varying(64) NOT NULL, before_id uuid, after_id uuid, @@ -282,14 +282,14 @@ ALTER TABLE ONLY parameter_value ALTER TABLE ONLY parameter_value ADD CONSTRAINT parameter_value_name_scope_scope_id_key UNIQUE (name, scope, scope_id); -ALTER TABLE ONLY project_history - ADD CONSTRAINT project_history_id_key UNIQUE (id); +ALTER TABLE ONLY project_version + ADD CONSTRAINT project_version_id_key UNIQUE (id); -ALTER TABLE ONLY project_history_log - ADD CONSTRAINT project_history_log_id_key UNIQUE (id); +ALTER TABLE ONLY project_version_log + ADD CONSTRAINT project_version_log_id_key UNIQUE (id); -ALTER TABLE ONLY project_history - ADD CONSTRAINT project_history_project_id_name_key UNIQUE (project_id, name); +ALTER TABLE ONLY project_version + ADD CONSTRAINT project_version_project_id_name_key UNIQUE (project_id, name); ALTER TABLE ONLY project ADD CONSTRAINT project_id_key UNIQUE (id); @@ -301,7 +301,7 @@ ALTER TABLE ONLY project_parameter ADD CONSTRAINT project_parameter_id_key UNIQUE (id); ALTER TABLE ONLY project_parameter - ADD CONSTRAINT project_parameter_project_history_id_name_key UNIQUE (project_history_id, name); + ADD CONSTRAINT project_parameter_project_version_id_name_key UNIQUE (project_version_id, name); ALTER TABLE ONLY provisioner_daemon ADD CONSTRAINT provisioner_daemon_id_key UNIQUE (id); @@ -339,14 +339,14 @@ ALTER TABLE ONLY workspace_resource ALTER TABLE ONLY workspace_resource ADD CONSTRAINT workspace_resource_workspace_history_id_name_key UNIQUE (workspace_history_id, name); -ALTER TABLE ONLY project_history_log - ADD CONSTRAINT project_history_log_project_history_id_fkey FOREIGN KEY (project_history_id) REFERENCES project_history(id) ON DELETE CASCADE; +ALTER TABLE ONLY project_version_log + ADD CONSTRAINT project_version_log_project_version_id_fkey FOREIGN KEY (project_version_id) REFERENCES project_version(id) ON DELETE CASCADE; -ALTER TABLE ONLY project_history - ADD CONSTRAINT project_history_project_id_fkey FOREIGN KEY (project_id) REFERENCES project(id); +ALTER TABLE ONLY project_version + ADD CONSTRAINT project_version_project_id_fkey FOREIGN KEY (project_id) REFERENCES project(id); ALTER TABLE ONLY project_parameter - ADD CONSTRAINT project_parameter_project_history_id_fkey FOREIGN KEY (project_history_id) REFERENCES project_history(id) ON DELETE CASCADE; + ADD CONSTRAINT project_parameter_project_version_id_fkey FOREIGN KEY (project_version_id) REFERENCES project_version(id) ON DELETE CASCADE; ALTER TABLE ONLY provisioner_job ADD CONSTRAINT provisioner_job_project_id_fkey FOREIGN KEY (project_id) REFERENCES project(id) ON DELETE CASCADE; @@ -358,7 +358,7 @@ ALTER TABLE ONLY workspace_history_log ADD CONSTRAINT workspace_history_log_workspace_history_id_fkey FOREIGN KEY (workspace_history_id) REFERENCES workspace_history(id) ON DELETE CASCADE; ALTER TABLE ONLY workspace_history - ADD CONSTRAINT workspace_history_project_history_id_fkey FOREIGN KEY (project_history_id) REFERENCES project_history(id) ON DELETE CASCADE; + ADD CONSTRAINT workspace_history_project_version_id_fkey FOREIGN KEY (project_version_id) REFERENCES project_version(id) ON DELETE CASCADE; ALTER TABLE ONLY workspace_history ADD CONSTRAINT workspace_history_workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES workspace(id) ON DELETE CASCADE; diff --git a/database/migrations/000002_projects.up.sql b/database/migrations/000002_projects.up.sql index 0149ec8033..c33f2f1e72 100644 --- a/database/migrations/000002_projects.up.sql +++ b/database/migrations/000002_projects.up.sql @@ -20,10 +20,10 @@ CREATE TABLE project ( CREATE TYPE project_storage_method AS ENUM ('inline-archive'); --- Project Versions store Project history. When a Project Version is imported, +-- Project Versions store historical project data. When a Project Version is imported, -- an "import" job is queued to parse parameters. A Project Version -- can only be used if the import job succeeds. -CREATE TABLE project_history ( +CREATE TABLE project_version ( id uuid NOT NULL UNIQUE, -- This should be indexed. project_id uuid NOT NULL REFERENCES project (id), @@ -66,7 +66,7 @@ CREATE TYPE parameter_destination_scheme AS ENUM('none', 'environment_variable', CREATE TABLE project_parameter ( id uuid NOT NULL UNIQUE, created_at timestamptz NOT NULL, - project_history_id uuid NOT NULL REFERENCES project_history(id) ON DELETE CASCADE, + project_version_id uuid NOT NULL REFERENCES project_version(id) ON DELETE CASCADE, name varchar(64) NOT NULL, -- 8KB limit description varchar(8192) NOT NULL DEFAULT '', @@ -88,7 +88,7 @@ CREATE TABLE project_parameter ( validation_condition varchar(512) NOT NULL, validation_type_system parameter_type_system NOT NULL, validation_value_type varchar(64) NOT NULL, - UNIQUE(project_history_id, name) + UNIQUE(project_version_id, name) ); CREATE TYPE log_level AS ENUM ( @@ -104,9 +104,9 @@ CREATE TYPE log_source AS ENUM ( 'provisioner' ); -CREATE TABLE project_history_log ( +CREATE TABLE project_version_log ( id uuid NOT NULL UNIQUE, - project_history_id uuid NOT NULL REFERENCES project_history (id) ON DELETE CASCADE, + project_version_id uuid NOT NULL REFERENCES project_version (id) ON DELETE CASCADE, created_at timestamptz NOT NULL, source log_source NOT NULL, level log_level NOT NULL, diff --git a/database/migrations/000003_workspaces.up.sql b/database/migrations/000003_workspaces.up.sql index fcc0b8fc3f..fe7bfe6ea2 100644 --- a/database/migrations/000003_workspaces.up.sql +++ b/database/migrations/000003_workspaces.up.sql @@ -21,7 +21,7 @@ CREATE TABLE workspace_history ( created_at timestamptz NOT NULL, updated_at timestamptz NOT NULL, workspace_id uuid NOT NULL REFERENCES workspace (id) ON DELETE CASCADE, - project_history_id uuid NOT NULL REFERENCES project_history (id) ON DELETE CASCADE, + project_version_id uuid NOT NULL REFERENCES project_version (id) ON DELETE CASCADE, name varchar(64) NOT NULL, before_id uuid, after_id uuid, diff --git a/database/models.go b/database/models.go index f0c0458e5c..72e7007e17 100644 --- a/database/models.go +++ b/database/models.go @@ -316,31 +316,10 @@ type Project struct { ActiveVersionID uuid.NullUUID `db:"active_version_id" json:"active_version_id"` } -type ProjectHistory struct { - ID uuid.UUID `db:"id" json:"id"` - ProjectID uuid.UUID `db:"project_id" json:"project_id"` - CreatedAt time.Time `db:"created_at" json:"created_at"` - UpdatedAt time.Time `db:"updated_at" json:"updated_at"` - Name string `db:"name" json:"name"` - Description string `db:"description" json:"description"` - StorageMethod ProjectStorageMethod `db:"storage_method" json:"storage_method"` - StorageSource []byte `db:"storage_source" json:"storage_source"` - ImportJobID uuid.UUID `db:"import_job_id" json:"import_job_id"` -} - -type ProjectHistoryLog struct { - ID uuid.UUID `db:"id" json:"id"` - ProjectHistoryID uuid.UUID `db:"project_history_id" json:"project_history_id"` - CreatedAt time.Time `db:"created_at" json:"created_at"` - Source LogSource `db:"source" json:"source"` - Level LogLevel `db:"level" json:"level"` - Output string `db:"output" json:"output"` -} - type ProjectParameter struct { ID uuid.UUID `db:"id" json:"id"` CreatedAt time.Time `db:"created_at" json:"created_at"` - ProjectHistoryID uuid.UUID `db:"project_history_id" json:"project_history_id"` + ProjectVersionID uuid.UUID `db:"project_version_id" json:"project_version_id"` Name string `db:"name" json:"name"` Description string `db:"description" json:"description"` DefaultSourceScheme ParameterSourceScheme `db:"default_source_scheme" json:"default_source_scheme"` @@ -357,6 +336,27 @@ type ProjectParameter struct { ValidationValueType string `db:"validation_value_type" json:"validation_value_type"` } +type ProjectVersion struct { + ID uuid.UUID `db:"id" json:"id"` + ProjectID uuid.UUID `db:"project_id" json:"project_id"` + CreatedAt time.Time `db:"created_at" json:"created_at"` + UpdatedAt time.Time `db:"updated_at" json:"updated_at"` + Name string `db:"name" json:"name"` + Description string `db:"description" json:"description"` + StorageMethod ProjectStorageMethod `db:"storage_method" json:"storage_method"` + StorageSource []byte `db:"storage_source" json:"storage_source"` + ImportJobID uuid.UUID `db:"import_job_id" json:"import_job_id"` +} + +type ProjectVersionLog struct { + ID uuid.UUID `db:"id" json:"id"` + ProjectVersionID uuid.UUID `db:"project_version_id" json:"project_version_id"` + CreatedAt time.Time `db:"created_at" json:"created_at"` + Source LogSource `db:"source" json:"source"` + Level LogLevel `db:"level" json:"level"` + Output string `db:"output" json:"output"` +} + type ProvisionerDaemon struct { ID uuid.UUID `db:"id" json:"id"` CreatedAt time.Time `db:"created_at" json:"created_at"` @@ -426,7 +426,7 @@ type WorkspaceHistory struct { CreatedAt time.Time `db:"created_at" json:"created_at"` UpdatedAt time.Time `db:"updated_at" json:"updated_at"` WorkspaceID uuid.UUID `db:"workspace_id" json:"workspace_id"` - ProjectHistoryID uuid.UUID `db:"project_history_id" json:"project_history_id"` + ProjectVersionID uuid.UUID `db:"project_version_id" json:"project_version_id"` Name string `db:"name" json:"name"` BeforeID uuid.NullUUID `db:"before_id" json:"before_id"` AfterID uuid.NullUUID `db:"after_id" json:"after_id"` diff --git a/database/querier.go b/database/querier.go index 49793672fa..20c859cbe3 100644 --- a/database/querier.go +++ b/database/querier.go @@ -18,11 +18,11 @@ type querier interface { GetParameterValuesByScope(ctx context.Context, arg GetParameterValuesByScopeParams) ([]ParameterValue, error) GetProjectByID(ctx context.Context, id uuid.UUID) (Project, error) GetProjectByOrganizationAndName(ctx context.Context, arg GetProjectByOrganizationAndNameParams) (Project, error) - GetProjectHistoryByID(ctx context.Context, id uuid.UUID) (ProjectHistory, error) - GetProjectHistoryByProjectID(ctx context.Context, projectID uuid.UUID) ([]ProjectHistory, error) - GetProjectHistoryByProjectIDAndName(ctx context.Context, arg GetProjectHistoryByProjectIDAndNameParams) (ProjectHistory, error) - GetProjectHistoryLogsByIDBetween(ctx context.Context, arg GetProjectHistoryLogsByIDBetweenParams) ([]ProjectHistoryLog, error) - GetProjectParametersByHistoryID(ctx context.Context, projectHistoryID uuid.UUID) ([]ProjectParameter, error) + GetProjectParametersByVersionID(ctx context.Context, projectVersionID uuid.UUID) ([]ProjectParameter, error) + GetProjectVersionByID(ctx context.Context, id uuid.UUID) (ProjectVersion, error) + GetProjectVersionByProjectID(ctx context.Context, projectID uuid.UUID) ([]ProjectVersion, error) + GetProjectVersionByProjectIDAndName(ctx context.Context, arg GetProjectVersionByProjectIDAndNameParams) (ProjectVersion, error) + GetProjectVersionLogsByIDBetween(ctx context.Context, arg GetProjectVersionLogsByIDBetweenParams) ([]ProjectVersionLog, error) GetProjectsByOrganizationIDs(ctx context.Context, ids []string) ([]Project, error) GetProvisionerDaemonByID(ctx context.Context, id uuid.UUID) (ProvisionerDaemon, error) GetProvisionerDaemons(ctx context.Context) ([]ProvisionerDaemon, error) @@ -46,9 +46,9 @@ type querier interface { InsertOrganizationMember(ctx context.Context, arg InsertOrganizationMemberParams) (OrganizationMember, error) InsertParameterValue(ctx context.Context, arg InsertParameterValueParams) (ParameterValue, error) InsertProject(ctx context.Context, arg InsertProjectParams) (Project, error) - InsertProjectHistory(ctx context.Context, arg InsertProjectHistoryParams) (ProjectHistory, error) - InsertProjectHistoryLogs(ctx context.Context, arg InsertProjectHistoryLogsParams) ([]ProjectHistoryLog, error) InsertProjectParameter(ctx context.Context, arg InsertProjectParameterParams) (ProjectParameter, error) + InsertProjectVersion(ctx context.Context, arg InsertProjectVersionParams) (ProjectVersion, error) + InsertProjectVersionLogs(ctx context.Context, arg InsertProjectVersionLogsParams) ([]ProjectVersionLog, error) InsertProvisionerDaemon(ctx context.Context, arg InsertProvisionerDaemonParams) (ProvisionerDaemon, error) InsertProvisionerJob(ctx context.Context, arg InsertProvisionerJobParams) (ProvisionerJob, error) InsertUser(ctx context.Context, arg InsertUserParams) (User, error) diff --git a/database/query.sql b/database/query.sql index 93943326f7..3a9889c299 100644 --- a/database/query.sql +++ b/database/query.sql @@ -155,46 +155,46 @@ FROM WHERE organization_id = ANY(@ids :: text [ ]); --- name: GetProjectParametersByHistoryID :many +-- name: GetProjectParametersByVersionID :many SELECT * FROM project_parameter WHERE - project_history_id = $1; + project_version_id = $1; --- name: GetProjectHistoryByProjectID :many +-- name: GetProjectVersionByProjectID :many SELECT * FROM - project_history + project_version WHERE project_id = $1; --- name: GetProjectHistoryByProjectIDAndName :one +-- name: GetProjectVersionByProjectIDAndName :one SELECT * FROM - project_history + project_version WHERE project_id = $1 AND name = $2; --- name: GetProjectHistoryByID :one +-- name: GetProjectVersionByID :one SELECT * FROM - project_history + project_version WHERE id = $1; --- name: GetProjectHistoryLogsByIDBetween :many +-- name: GetProjectVersionLogsByIDBetween :many SELECT * FROM - project_history_log + project_version_log WHERE - project_history_id = @project_history_id + project_version_id = @project_version_id AND ( created_at >= @created_after OR created_at <= @created_before @@ -414,9 +414,9 @@ INSERT INTO VALUES ($1, $2, $3, $4, $5, $6) RETURNING *; --- name: InsertProjectHistory :one +-- name: InsertProjectVersion :one INSERT INTO - project_history ( + project_version ( id, project_id, created_at, @@ -430,11 +430,11 @@ INSERT INTO VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING *; --- name: InsertProjectHistoryLogs :many +-- name: InsertProjectVersionLogs :many INSERT INTO - project_history_log + project_version_log SELECT - @project_history_id :: uuid AS project_history_id, + @project_version_id :: uuid AS project_version_id, unnest(@id :: uuid [ ]) AS id, unnest(@created_at :: timestamptz [ ]) AS created_at, unnest(@source :: log_source [ ]) as source, @@ -446,7 +446,7 @@ INSERT INTO project_parameter ( id, created_at, - project_history_id, + project_version_id, name, description, default_source_scheme, @@ -553,7 +553,7 @@ INSERT INTO created_at, updated_at, workspace_id, - project_history_id, + project_version_id, before_id, name, transition, diff --git a/database/query.sql.go b/database/query.sql.go index 0da3e8cfba..363c5a3aae 100644 --- a/database/query.sql.go +++ b/database/query.sql.go @@ -350,18 +350,68 @@ func (q *sqlQuerier) GetProjectByOrganizationAndName(ctx context.Context, arg Ge return i, err } -const getProjectHistoryByID = `-- name: GetProjectHistoryByID :one +const getProjectParametersByVersionID = `-- name: GetProjectParametersByVersionID :many +SELECT + id, created_at, project_version_id, name, description, default_source_scheme, default_source_value, allow_override_source, default_destination_scheme, default_destination_value, allow_override_destination, default_refresh, redisplay_value, validation_error, validation_condition, validation_type_system, validation_value_type +FROM + project_parameter +WHERE + project_version_id = $1 +` + +func (q *sqlQuerier) GetProjectParametersByVersionID(ctx context.Context, projectVersionID uuid.UUID) ([]ProjectParameter, error) { + rows, err := q.db.QueryContext(ctx, getProjectParametersByVersionID, projectVersionID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []ProjectParameter + for rows.Next() { + var i ProjectParameter + if err := rows.Scan( + &i.ID, + &i.CreatedAt, + &i.ProjectVersionID, + &i.Name, + &i.Description, + &i.DefaultSourceScheme, + &i.DefaultSourceValue, + &i.AllowOverrideSource, + &i.DefaultDestinationScheme, + &i.DefaultDestinationValue, + &i.AllowOverrideDestination, + &i.DefaultRefresh, + &i.RedisplayValue, + &i.ValidationError, + &i.ValidationCondition, + &i.ValidationTypeSystem, + &i.ValidationValueType, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const getProjectVersionByID = `-- name: GetProjectVersionByID :one SELECT id, project_id, created_at, updated_at, name, description, storage_method, storage_source, import_job_id FROM - project_history + project_version WHERE id = $1 ` -func (q *sqlQuerier) GetProjectHistoryByID(ctx context.Context, id uuid.UUID) (ProjectHistory, error) { - row := q.db.QueryRowContext(ctx, getProjectHistoryByID, id) - var i ProjectHistory +func (q *sqlQuerier) GetProjectVersionByID(ctx context.Context, id uuid.UUID) (ProjectVersion, error) { + row := q.db.QueryRowContext(ctx, getProjectVersionByID, id) + var i ProjectVersion err := row.Scan( &i.ID, &i.ProjectID, @@ -376,24 +426,24 @@ func (q *sqlQuerier) GetProjectHistoryByID(ctx context.Context, id uuid.UUID) (P return i, err } -const getProjectHistoryByProjectID = `-- name: GetProjectHistoryByProjectID :many +const getProjectVersionByProjectID = `-- name: GetProjectVersionByProjectID :many SELECT id, project_id, created_at, updated_at, name, description, storage_method, storage_source, import_job_id FROM - project_history + project_version WHERE project_id = $1 ` -func (q *sqlQuerier) GetProjectHistoryByProjectID(ctx context.Context, projectID uuid.UUID) ([]ProjectHistory, error) { - rows, err := q.db.QueryContext(ctx, getProjectHistoryByProjectID, projectID) +func (q *sqlQuerier) GetProjectVersionByProjectID(ctx context.Context, projectID uuid.UUID) ([]ProjectVersion, error) { + rows, err := q.db.QueryContext(ctx, getProjectVersionByProjectID, projectID) if err != nil { return nil, err } defer rows.Close() - var items []ProjectHistory + var items []ProjectVersion for rows.Next() { - var i ProjectHistory + var i ProjectVersion if err := rows.Scan( &i.ID, &i.ProjectID, @@ -418,24 +468,24 @@ func (q *sqlQuerier) GetProjectHistoryByProjectID(ctx context.Context, projectID return items, nil } -const getProjectHistoryByProjectIDAndName = `-- name: GetProjectHistoryByProjectIDAndName :one +const getProjectVersionByProjectIDAndName = `-- name: GetProjectVersionByProjectIDAndName :one SELECT id, project_id, created_at, updated_at, name, description, storage_method, storage_source, import_job_id FROM - project_history + project_version WHERE project_id = $1 AND name = $2 ` -type GetProjectHistoryByProjectIDAndNameParams struct { +type GetProjectVersionByProjectIDAndNameParams struct { ProjectID uuid.UUID `db:"project_id" json:"project_id"` Name string `db:"name" json:"name"` } -func (q *sqlQuerier) GetProjectHistoryByProjectIDAndName(ctx context.Context, arg GetProjectHistoryByProjectIDAndNameParams) (ProjectHistory, error) { - row := q.db.QueryRowContext(ctx, getProjectHistoryByProjectIDAndName, arg.ProjectID, arg.Name) - var i ProjectHistory +func (q *sqlQuerier) GetProjectVersionByProjectIDAndName(ctx context.Context, arg GetProjectVersionByProjectIDAndNameParams) (ProjectVersion, error) { + row := q.db.QueryRowContext(ctx, getProjectVersionByProjectIDAndName, arg.ProjectID, arg.Name) + var i ProjectVersion err := row.Scan( &i.ID, &i.ProjectID, @@ -450,13 +500,13 @@ func (q *sqlQuerier) GetProjectHistoryByProjectIDAndName(ctx context.Context, ar return i, err } -const getProjectHistoryLogsByIDBetween = `-- name: GetProjectHistoryLogsByIDBetween :many +const getProjectVersionLogsByIDBetween = `-- name: GetProjectVersionLogsByIDBetween :many SELECT - id, project_history_id, created_at, source, level, output + id, project_version_id, created_at, source, level, output FROM - project_history_log + project_version_log WHERE - project_history_id = $1 + project_version_id = $1 AND ( created_at >= $2 OR created_at <= $3 @@ -465,24 +515,24 @@ ORDER BY created_at ` -type GetProjectHistoryLogsByIDBetweenParams struct { - ProjectHistoryID uuid.UUID `db:"project_history_id" json:"project_history_id"` +type GetProjectVersionLogsByIDBetweenParams struct { + ProjectVersionID uuid.UUID `db:"project_version_id" json:"project_version_id"` CreatedAfter time.Time `db:"created_after" json:"created_after"` CreatedBefore time.Time `db:"created_before" json:"created_before"` } -func (q *sqlQuerier) GetProjectHistoryLogsByIDBetween(ctx context.Context, arg GetProjectHistoryLogsByIDBetweenParams) ([]ProjectHistoryLog, error) { - rows, err := q.db.QueryContext(ctx, getProjectHistoryLogsByIDBetween, arg.ProjectHistoryID, arg.CreatedAfter, arg.CreatedBefore) +func (q *sqlQuerier) GetProjectVersionLogsByIDBetween(ctx context.Context, arg GetProjectVersionLogsByIDBetweenParams) ([]ProjectVersionLog, error) { + rows, err := q.db.QueryContext(ctx, getProjectVersionLogsByIDBetween, arg.ProjectVersionID, arg.CreatedAfter, arg.CreatedBefore) if err != nil { return nil, err } defer rows.Close() - var items []ProjectHistoryLog + var items []ProjectVersionLog for rows.Next() { - var i ProjectHistoryLog + var i ProjectVersionLog if err := rows.Scan( &i.ID, - &i.ProjectHistoryID, + &i.ProjectVersionID, &i.CreatedAt, &i.Source, &i.Level, @@ -501,56 +551,6 @@ func (q *sqlQuerier) GetProjectHistoryLogsByIDBetween(ctx context.Context, arg G return items, nil } -const getProjectParametersByHistoryID = `-- name: GetProjectParametersByHistoryID :many -SELECT - id, created_at, project_history_id, name, description, default_source_scheme, default_source_value, allow_override_source, default_destination_scheme, default_destination_value, allow_override_destination, default_refresh, redisplay_value, validation_error, validation_condition, validation_type_system, validation_value_type -FROM - project_parameter -WHERE - project_history_id = $1 -` - -func (q *sqlQuerier) GetProjectParametersByHistoryID(ctx context.Context, projectHistoryID uuid.UUID) ([]ProjectParameter, error) { - rows, err := q.db.QueryContext(ctx, getProjectParametersByHistoryID, projectHistoryID) - if err != nil { - return nil, err - } - defer rows.Close() - var items []ProjectParameter - for rows.Next() { - var i ProjectParameter - if err := rows.Scan( - &i.ID, - &i.CreatedAt, - &i.ProjectHistoryID, - &i.Name, - &i.Description, - &i.DefaultSourceScheme, - &i.DefaultSourceValue, - &i.AllowOverrideSource, - &i.DefaultDestinationScheme, - &i.DefaultDestinationValue, - &i.AllowOverrideDestination, - &i.DefaultRefresh, - &i.RedisplayValue, - &i.ValidationError, - &i.ValidationCondition, - &i.ValidationTypeSystem, - &i.ValidationValueType, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - const getProjectsByOrganizationIDs = `-- name: GetProjectsByOrganizationIDs :many SELECT id, created_at, updated_at, organization_id, name, provisioner, active_version_id @@ -870,7 +870,7 @@ func (q *sqlQuerier) GetWorkspaceByUserIDAndName(ctx context.Context, arg GetWor const getWorkspaceHistoryByID = `-- name: GetWorkspaceHistoryByID :one SELECT - id, created_at, updated_at, workspace_id, project_history_id, name, before_id, after_id, transition, initiator, provisioner_state, provision_job_id + id, created_at, updated_at, workspace_id, project_version_id, name, before_id, after_id, transition, initiator, provisioner_state, provision_job_id FROM workspace_history WHERE @@ -887,7 +887,7 @@ func (q *sqlQuerier) GetWorkspaceHistoryByID(ctx context.Context, id uuid.UUID) &i.CreatedAt, &i.UpdatedAt, &i.WorkspaceID, - &i.ProjectHistoryID, + &i.ProjectVersionID, &i.Name, &i.BeforeID, &i.AfterID, @@ -901,7 +901,7 @@ func (q *sqlQuerier) GetWorkspaceHistoryByID(ctx context.Context, id uuid.UUID) const getWorkspaceHistoryByWorkspaceID = `-- name: GetWorkspaceHistoryByWorkspaceID :many SELECT - id, created_at, updated_at, workspace_id, project_history_id, name, before_id, after_id, transition, initiator, provisioner_state, provision_job_id + id, created_at, updated_at, workspace_id, project_version_id, name, before_id, after_id, transition, initiator, provisioner_state, provision_job_id FROM workspace_history WHERE @@ -922,7 +922,7 @@ func (q *sqlQuerier) GetWorkspaceHistoryByWorkspaceID(ctx context.Context, works &i.CreatedAt, &i.UpdatedAt, &i.WorkspaceID, - &i.ProjectHistoryID, + &i.ProjectVersionID, &i.Name, &i.BeforeID, &i.AfterID, @@ -946,7 +946,7 @@ func (q *sqlQuerier) GetWorkspaceHistoryByWorkspaceID(ctx context.Context, works const getWorkspaceHistoryByWorkspaceIDAndName = `-- name: GetWorkspaceHistoryByWorkspaceIDAndName :one SELECT - id, created_at, updated_at, workspace_id, project_history_id, name, before_id, after_id, transition, initiator, provisioner_state, provision_job_id + id, created_at, updated_at, workspace_id, project_version_id, name, before_id, after_id, transition, initiator, provisioner_state, provision_job_id FROM workspace_history WHERE @@ -967,7 +967,7 @@ func (q *sqlQuerier) GetWorkspaceHistoryByWorkspaceIDAndName(ctx context.Context &i.CreatedAt, &i.UpdatedAt, &i.WorkspaceID, - &i.ProjectHistoryID, + &i.ProjectVersionID, &i.Name, &i.BeforeID, &i.AfterID, @@ -981,7 +981,7 @@ func (q *sqlQuerier) GetWorkspaceHistoryByWorkspaceIDAndName(ctx context.Context const getWorkspaceHistoryByWorkspaceIDWithoutAfter = `-- name: GetWorkspaceHistoryByWorkspaceIDWithoutAfter :one SELECT - id, created_at, updated_at, workspace_id, project_history_id, name, before_id, after_id, transition, initiator, provisioner_state, provision_job_id + id, created_at, updated_at, workspace_id, project_version_id, name, before_id, after_id, transition, initiator, provisioner_state, provision_job_id FROM workspace_history WHERE @@ -999,7 +999,7 @@ func (q *sqlQuerier) GetWorkspaceHistoryByWorkspaceIDWithoutAfter(ctx context.Co &i.CreatedAt, &i.UpdatedAt, &i.WorkspaceID, - &i.ProjectHistoryID, + &i.ProjectVersionID, &i.Name, &i.BeforeID, &i.AfterID, @@ -1466,126 +1466,12 @@ func (q *sqlQuerier) InsertProject(ctx context.Context, arg InsertProjectParams) return i, err } -const insertProjectHistory = `-- name: InsertProjectHistory :one -INSERT INTO - project_history ( - id, - project_id, - created_at, - updated_at, - name, - description, - storage_method, - storage_source, - import_job_id - ) -VALUES - ($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING id, project_id, created_at, updated_at, name, description, storage_method, storage_source, import_job_id -` - -type InsertProjectHistoryParams struct { - ID uuid.UUID `db:"id" json:"id"` - ProjectID uuid.UUID `db:"project_id" json:"project_id"` - CreatedAt time.Time `db:"created_at" json:"created_at"` - UpdatedAt time.Time `db:"updated_at" json:"updated_at"` - Name string `db:"name" json:"name"` - Description string `db:"description" json:"description"` - StorageMethod ProjectStorageMethod `db:"storage_method" json:"storage_method"` - StorageSource []byte `db:"storage_source" json:"storage_source"` - ImportJobID uuid.UUID `db:"import_job_id" json:"import_job_id"` -} - -func (q *sqlQuerier) InsertProjectHistory(ctx context.Context, arg InsertProjectHistoryParams) (ProjectHistory, error) { - row := q.db.QueryRowContext(ctx, insertProjectHistory, - arg.ID, - arg.ProjectID, - arg.CreatedAt, - arg.UpdatedAt, - arg.Name, - arg.Description, - arg.StorageMethod, - arg.StorageSource, - arg.ImportJobID, - ) - var i ProjectHistory - err := row.Scan( - &i.ID, - &i.ProjectID, - &i.CreatedAt, - &i.UpdatedAt, - &i.Name, - &i.Description, - &i.StorageMethod, - &i.StorageSource, - &i.ImportJobID, - ) - return i, err -} - -const insertProjectHistoryLogs = `-- name: InsertProjectHistoryLogs :many -INSERT INTO - project_history_log -SELECT - $1 :: uuid AS project_history_id, - unnest($2 :: uuid [ ]) AS id, - unnest($3 :: timestamptz [ ]) AS created_at, - unnest($4 :: log_source [ ]) as source, - unnest($5 :: log_level [ ]) as level, - unnest($6 :: varchar(1024) [ ]) as output RETURNING id, project_history_id, created_at, source, level, output -` - -type InsertProjectHistoryLogsParams struct { - ProjectHistoryID uuid.UUID `db:"project_history_id" json:"project_history_id"` - ID []uuid.UUID `db:"id" json:"id"` - CreatedAt []time.Time `db:"created_at" json:"created_at"` - Source []LogSource `db:"source" json:"source"` - Level []LogLevel `db:"level" json:"level"` - Output []string `db:"output" json:"output"` -} - -func (q *sqlQuerier) InsertProjectHistoryLogs(ctx context.Context, arg InsertProjectHistoryLogsParams) ([]ProjectHistoryLog, error) { - rows, err := q.db.QueryContext(ctx, insertProjectHistoryLogs, - arg.ProjectHistoryID, - pq.Array(arg.ID), - pq.Array(arg.CreatedAt), - pq.Array(arg.Source), - pq.Array(arg.Level), - pq.Array(arg.Output), - ) - if err != nil { - return nil, err - } - defer rows.Close() - var items []ProjectHistoryLog - for rows.Next() { - var i ProjectHistoryLog - if err := rows.Scan( - &i.ID, - &i.ProjectHistoryID, - &i.CreatedAt, - &i.Source, - &i.Level, - &i.Output, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - const insertProjectParameter = `-- name: InsertProjectParameter :one INSERT INTO project_parameter ( id, created_at, - project_history_id, + project_version_id, name, description, default_source_scheme, @@ -1620,13 +1506,13 @@ VALUES $15, $16, $17 - ) RETURNING id, created_at, project_history_id, name, description, default_source_scheme, default_source_value, allow_override_source, default_destination_scheme, default_destination_value, allow_override_destination, default_refresh, redisplay_value, validation_error, validation_condition, validation_type_system, validation_value_type + ) RETURNING id, created_at, project_version_id, name, description, default_source_scheme, default_source_value, allow_override_source, default_destination_scheme, default_destination_value, allow_override_destination, default_refresh, redisplay_value, validation_error, validation_condition, validation_type_system, validation_value_type ` type InsertProjectParameterParams struct { ID uuid.UUID `db:"id" json:"id"` CreatedAt time.Time `db:"created_at" json:"created_at"` - ProjectHistoryID uuid.UUID `db:"project_history_id" json:"project_history_id"` + ProjectVersionID uuid.UUID `db:"project_version_id" json:"project_version_id"` Name string `db:"name" json:"name"` Description string `db:"description" json:"description"` DefaultSourceScheme ParameterSourceScheme `db:"default_source_scheme" json:"default_source_scheme"` @@ -1647,7 +1533,7 @@ func (q *sqlQuerier) InsertProjectParameter(ctx context.Context, arg InsertProje row := q.db.QueryRowContext(ctx, insertProjectParameter, arg.ID, arg.CreatedAt, - arg.ProjectHistoryID, + arg.ProjectVersionID, arg.Name, arg.Description, arg.DefaultSourceScheme, @@ -1667,7 +1553,7 @@ func (q *sqlQuerier) InsertProjectParameter(ctx context.Context, arg InsertProje err := row.Scan( &i.ID, &i.CreatedAt, - &i.ProjectHistoryID, + &i.ProjectVersionID, &i.Name, &i.Description, &i.DefaultSourceScheme, @@ -1686,6 +1572,120 @@ func (q *sqlQuerier) InsertProjectParameter(ctx context.Context, arg InsertProje return i, err } +const insertProjectVersion = `-- name: InsertProjectVersion :one +INSERT INTO + project_version ( + id, + project_id, + created_at, + updated_at, + name, + description, + storage_method, + storage_source, + import_job_id + ) +VALUES + ($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING id, project_id, created_at, updated_at, name, description, storage_method, storage_source, import_job_id +` + +type InsertProjectVersionParams struct { + ID uuid.UUID `db:"id" json:"id"` + ProjectID uuid.UUID `db:"project_id" json:"project_id"` + CreatedAt time.Time `db:"created_at" json:"created_at"` + UpdatedAt time.Time `db:"updated_at" json:"updated_at"` + Name string `db:"name" json:"name"` + Description string `db:"description" json:"description"` + StorageMethod ProjectStorageMethod `db:"storage_method" json:"storage_method"` + StorageSource []byte `db:"storage_source" json:"storage_source"` + ImportJobID uuid.UUID `db:"import_job_id" json:"import_job_id"` +} + +func (q *sqlQuerier) InsertProjectVersion(ctx context.Context, arg InsertProjectVersionParams) (ProjectVersion, error) { + row := q.db.QueryRowContext(ctx, insertProjectVersion, + arg.ID, + arg.ProjectID, + arg.CreatedAt, + arg.UpdatedAt, + arg.Name, + arg.Description, + arg.StorageMethod, + arg.StorageSource, + arg.ImportJobID, + ) + var i ProjectVersion + err := row.Scan( + &i.ID, + &i.ProjectID, + &i.CreatedAt, + &i.UpdatedAt, + &i.Name, + &i.Description, + &i.StorageMethod, + &i.StorageSource, + &i.ImportJobID, + ) + return i, err +} + +const insertProjectVersionLogs = `-- name: InsertProjectVersionLogs :many +INSERT INTO + project_version_log +SELECT + $1 :: uuid AS project_version_id, + unnest($2 :: uuid [ ]) AS id, + unnest($3 :: timestamptz [ ]) AS created_at, + unnest($4 :: log_source [ ]) as source, + unnest($5 :: log_level [ ]) as level, + unnest($6 :: varchar(1024) [ ]) as output RETURNING id, project_version_id, created_at, source, level, output +` + +type InsertProjectVersionLogsParams struct { + ProjectVersionID uuid.UUID `db:"project_version_id" json:"project_version_id"` + ID []uuid.UUID `db:"id" json:"id"` + CreatedAt []time.Time `db:"created_at" json:"created_at"` + Source []LogSource `db:"source" json:"source"` + Level []LogLevel `db:"level" json:"level"` + Output []string `db:"output" json:"output"` +} + +func (q *sqlQuerier) InsertProjectVersionLogs(ctx context.Context, arg InsertProjectVersionLogsParams) ([]ProjectVersionLog, error) { + rows, err := q.db.QueryContext(ctx, insertProjectVersionLogs, + arg.ProjectVersionID, + pq.Array(arg.ID), + pq.Array(arg.CreatedAt), + pq.Array(arg.Source), + pq.Array(arg.Level), + pq.Array(arg.Output), + ) + if err != nil { + return nil, err + } + defer rows.Close() + var items []ProjectVersionLog + for rows.Next() { + var i ProjectVersionLog + if err := rows.Scan( + &i.ID, + &i.ProjectVersionID, + &i.CreatedAt, + &i.Source, + &i.Level, + &i.Output, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const insertProvisionerDaemon = `-- name: InsertProvisionerDaemon :one INSERT INTO provisioner_daemon (id, created_at, name, provisioners) @@ -1934,7 +1934,7 @@ INSERT INTO created_at, updated_at, workspace_id, - project_history_id, + project_version_id, before_id, name, transition, @@ -1943,7 +1943,7 @@ INSERT INTO provisioner_state ) VALUES - ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) RETURNING id, created_at, updated_at, workspace_id, project_history_id, name, before_id, after_id, transition, initiator, provisioner_state, provision_job_id + ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) RETURNING id, created_at, updated_at, workspace_id, project_version_id, name, before_id, after_id, transition, initiator, provisioner_state, provision_job_id ` type InsertWorkspaceHistoryParams struct { @@ -1951,7 +1951,7 @@ type InsertWorkspaceHistoryParams struct { CreatedAt time.Time `db:"created_at" json:"created_at"` UpdatedAt time.Time `db:"updated_at" json:"updated_at"` WorkspaceID uuid.UUID `db:"workspace_id" json:"workspace_id"` - ProjectHistoryID uuid.UUID `db:"project_history_id" json:"project_history_id"` + ProjectVersionID uuid.UUID `db:"project_version_id" json:"project_version_id"` BeforeID uuid.NullUUID `db:"before_id" json:"before_id"` Name string `db:"name" json:"name"` Transition WorkspaceTransition `db:"transition" json:"transition"` @@ -1966,7 +1966,7 @@ func (q *sqlQuerier) InsertWorkspaceHistory(ctx context.Context, arg InsertWorks arg.CreatedAt, arg.UpdatedAt, arg.WorkspaceID, - arg.ProjectHistoryID, + arg.ProjectVersionID, arg.BeforeID, arg.Name, arg.Transition, @@ -1980,7 +1980,7 @@ func (q *sqlQuerier) InsertWorkspaceHistory(ctx context.Context, arg InsertWorks &i.CreatedAt, &i.UpdatedAt, &i.WorkspaceID, - &i.ProjectHistoryID, + &i.ProjectVersionID, &i.Name, &i.BeforeID, &i.AfterID, diff --git a/httpmw/projecthistoryparam.go b/httpmw/projecthistoryparam.go deleted file mode 100644 index 07f6a0e901..0000000000 --- a/httpmw/projecthistoryparam.go +++ /dev/null @@ -1,60 +0,0 @@ -package httpmw - -import ( - "context" - "database/sql" - "errors" - "fmt" - "net/http" - - "github.com/go-chi/chi/v5" - - "github.com/coder/coder/database" - "github.com/coder/coder/httpapi" -) - -type projectHistoryParamContextKey struct{} - -// ProjectHistoryParam returns the project history from the ExtractProjectHistoryParam handler. -func ProjectHistoryParam(r *http.Request) database.ProjectHistory { - projectHistory, ok := r.Context().Value(projectHistoryParamContextKey{}).(database.ProjectHistory) - if !ok { - panic("developer error: project history param middleware not provided") - } - return projectHistory -} - -// ExtractProjectHistoryParam grabs project history from the "projecthistory" URL parameter. -func ExtractProjectHistoryParam(db database.Store) func(http.Handler) http.Handler { - return func(next http.Handler) http.Handler { - return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { - project := ProjectParam(r) - projectHistoryName := chi.URLParam(r, "projecthistory") - if projectHistoryName == "" { - httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "project history name must be provided", - }) - return - } - projectHistory, err := db.GetProjectHistoryByProjectIDAndName(r.Context(), database.GetProjectHistoryByProjectIDAndNameParams{ - ProjectID: project.ID, - Name: projectHistoryName, - }) - if errors.Is(err, sql.ErrNoRows) { - httpapi.Write(rw, http.StatusNotFound, httpapi.Response{ - Message: fmt.Sprintf("project history %q does not exist", projectHistoryName), - }) - return - } - if err != nil { - httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get project history: %s", err.Error()), - }) - return - } - - ctx := context.WithValue(r.Context(), projectHistoryParamContextKey{}, projectHistory) - next.ServeHTTP(rw, r.WithContext(ctx)) - }) - } -} diff --git a/httpmw/projectversionparam.go b/httpmw/projectversionparam.go new file mode 100644 index 0000000000..21deceff87 --- /dev/null +++ b/httpmw/projectversionparam.go @@ -0,0 +1,60 @@ +package httpmw + +import ( + "context" + "database/sql" + "errors" + "fmt" + "net/http" + + "github.com/go-chi/chi/v5" + + "github.com/coder/coder/database" + "github.com/coder/coder/httpapi" +) + +type projectVersionParamContextKey struct{} + +// ProjectVersionParam returns the project version from the ExtractProjectVersionParam handler. +func ProjectVersionParam(r *http.Request) database.ProjectVersion { + projectVersion, ok := r.Context().Value(projectVersionParamContextKey{}).(database.ProjectVersion) + if !ok { + panic("developer error: project version param middleware not provided") + } + return projectVersion +} + +// ExtractProjectVersionParam grabs project version from the "projectversion" URL parameter. +func ExtractProjectVersionParam(db database.Store) func(http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { + project := ProjectParam(r) + projectVersionName := chi.URLParam(r, "projectversion") + if projectVersionName == "" { + httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ + Message: "project version name must be provided", + }) + return + } + projectVersion, err := db.GetProjectVersionByProjectIDAndName(r.Context(), database.GetProjectVersionByProjectIDAndNameParams{ + ProjectID: project.ID, + Name: projectVersionName, + }) + if errors.Is(err, sql.ErrNoRows) { + httpapi.Write(rw, http.StatusNotFound, httpapi.Response{ + Message: fmt.Sprintf("project version %q does not exist", projectVersionName), + }) + return + } + if err != nil { + httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ + Message: fmt.Sprintf("get project version: %s", err.Error()), + }) + return + } + + ctx := context.WithValue(r.Context(), projectVersionParamContextKey{}, projectVersion) + next.ServeHTTP(rw, r.WithContext(ctx)) + }) + } +} diff --git a/httpmw/projecthistoryparam_test.go b/httpmw/projectversionparam_test.go similarity index 88% rename from httpmw/projecthistoryparam_test.go rename to httpmw/projectversionparam_test.go index dbac935176..b5054a5823 100644 --- a/httpmw/projecthistoryparam_test.go +++ b/httpmw/projectversionparam_test.go @@ -19,7 +19,7 @@ import ( "github.com/coder/coder/httpmw" ) -func TestProjectHistoryParam(t *testing.T) { +func TestProjectVersionParam(t *testing.T) { t.Parallel() setupAuthentication := func(db database.Store) (*http.Request, database.Project) { @@ -94,7 +94,7 @@ func TestProjectHistoryParam(t *testing.T) { httpmw.ExtractAPIKey(db, nil), httpmw.ExtractOrganizationParam(db), httpmw.ExtractProjectParam(db), - httpmw.ExtractProjectHistoryParam(db), + httpmw.ExtractProjectVersionParam(db), ) rtr.Get("/", nil) r, _ := setupAuthentication(db) @@ -114,12 +114,12 @@ func TestProjectHistoryParam(t *testing.T) { httpmw.ExtractAPIKey(db, nil), httpmw.ExtractOrganizationParam(db), httpmw.ExtractProjectParam(db), - httpmw.ExtractProjectHistoryParam(db), + httpmw.ExtractProjectVersionParam(db), ) rtr.Get("/", nil) r, _ := setupAuthentication(db) - chi.RouteContext(r.Context()).URLParams.Add("projecthistory", "nothin") + chi.RouteContext(r.Context()).URLParams.Add("projectversion", "nothin") rw := httptest.NewRecorder() rtr.ServeHTTP(rw, r) @@ -128,7 +128,7 @@ func TestProjectHistoryParam(t *testing.T) { require.Equal(t, http.StatusNotFound, res.StatusCode) }) - t.Run("ProjectHistory", func(t *testing.T) { + t.Run("ProjectVersion", func(t *testing.T) { t.Parallel() db := databasefake.New() rtr := chi.NewRouter() @@ -136,21 +136,21 @@ func TestProjectHistoryParam(t *testing.T) { httpmw.ExtractAPIKey(db, nil), httpmw.ExtractOrganizationParam(db), httpmw.ExtractProjectParam(db), - httpmw.ExtractProjectHistoryParam(db), + httpmw.ExtractProjectVersionParam(db), ) rtr.Get("/", func(rw http.ResponseWriter, r *http.Request) { - _ = httpmw.ProjectHistoryParam(r) + _ = httpmw.ProjectVersionParam(r) rw.WriteHeader(http.StatusOK) }) r, project := setupAuthentication(db) - projectHistory, err := db.InsertProjectHistory(context.Background(), database.InsertProjectHistoryParams{ + projectVersion, err := db.InsertProjectVersion(context.Background(), database.InsertProjectVersionParams{ ID: uuid.New(), ProjectID: project.ID, Name: "moo", }) require.NoError(t, err) - chi.RouteContext(r.Context()).URLParams.Add("projecthistory", projectHistory.Name) + chi.RouteContext(r.Context()).URLParams.Add("projectversion", projectVersion.Name) rw := httptest.NewRecorder() rtr.ServeHTTP(rw, r) diff --git a/provisionerd/proto/provisionerd.pb.go b/provisionerd/proto/provisionerd.pb.go index 0f1723b09b..c7b59d6f6f 100644 --- a/provisionerd/proto/provisionerd.pb.go +++ b/provisionerd/proto/provisionerd.pb.go @@ -602,8 +602,8 @@ type AcquiredJob_ProjectImport struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ProjectHistoryId string `protobuf:"bytes,1,opt,name=project_history_id,json=projectHistoryId,proto3" json:"project_history_id,omitempty"` - ProjectHistoryName string `protobuf:"bytes,2,opt,name=project_history_name,json=projectHistoryName,proto3" json:"project_history_name,omitempty"` + ProjectVersionId string `protobuf:"bytes,1,opt,name=project_version_id,json=projectVersionId,proto3" json:"project_version_id,omitempty"` + ProjectVersionName string `protobuf:"bytes,2,opt,name=project_version_name,json=projectVersionName,proto3" json:"project_version_name,omitempty"` } func (x *AcquiredJob_ProjectImport) Reset() { @@ -638,16 +638,16 @@ func (*AcquiredJob_ProjectImport) Descriptor() ([]byte, []int) { return file_provisionerd_proto_provisionerd_proto_rawDescGZIP(), []int{1, 1} } -func (x *AcquiredJob_ProjectImport) GetProjectHistoryId() string { +func (x *AcquiredJob_ProjectImport) GetProjectVersionId() string { if x != nil { - return x.ProjectHistoryId + return x.ProjectVersionId } return "" } -func (x *AcquiredJob_ProjectImport) GetProjectHistoryName() string { +func (x *AcquiredJob_ProjectImport) GetProjectVersionName() string { if x != nil { - return x.ProjectHistoryName + return x.ProjectVersionName } return "" } @@ -805,12 +805,12 @@ var file_provisionerd_proto_provisionerd_proto_rawDesc = []byte{ 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x1a, 0x6f, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6d, 0x70, - 0x6f, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x68, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x10, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x49, - 0x64, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x68, 0x69, 0x73, - 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x12, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4e, + 0x6f, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x12, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3b, 0x0a, 0x0c, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, diff --git a/provisionerd/proto/provisionerd.proto b/provisionerd/proto/provisionerd.proto index 836d2d5f49..accb69e99f 100644 --- a/provisionerd/proto/provisionerd.proto +++ b/provisionerd/proto/provisionerd.proto @@ -18,8 +18,8 @@ message AcquiredJob { bytes state = 4; } message ProjectImport { - string project_history_id = 1; - string project_history_name = 2; + string project_version_id = 1; + string project_version_name = 2; } string job_id = 1; int64 created_at = 2; diff --git a/provisionerd/provisionerd.go b/provisionerd/provisionerd.go index f751847b6a..2eff81620b 100644 --- a/provisionerd/provisionerd.go +++ b/provisionerd/provisionerd.go @@ -318,7 +318,7 @@ func (p *provisionerDaemon) runJob(ctx context.Context, job *proto.AcquiredJob) switch jobType := job.Type.(type) { case *proto.AcquiredJob_ProjectImport_: p.opts.Logger.Debug(context.Background(), "acquired job is project import", - slog.F("project_history_name", jobType.ProjectImport.ProjectHistoryName), + slog.F("project_version_name", jobType.ProjectImport.ProjectVersionName), ) p.runProjectImport(ctx, provisioner, job) @@ -362,7 +362,7 @@ func (p *provisionerDaemon) runProjectImport(ctx context.Context, provisioner sd p.opts.Logger.Debug(context.Background(), "parse job logged", slog.F("level", msgType.Log.Level), slog.F("output", msgType.Log.Output), - slog.F("project_history_id", job.GetProjectImport().ProjectHistoryId), + slog.F("project_version_id", job.GetProjectImport().ProjectVersionId), ) err = p.updateStream.Send(&proto.JobUpdate{