2022-03-07 17:40:54 +00:00
|
|
|
package coderd
|
|
|
|
|
|
|
|
import (
|
2022-03-22 19:17:50 +00:00
|
|
|
"database/sql"
|
2022-03-07 17:40:54 +00:00
|
|
|
"fmt"
|
|
|
|
"net/http"
|
|
|
|
|
|
|
|
"github.com/go-chi/render"
|
|
|
|
|
2022-03-25 21:07:45 +00:00
|
|
|
"github.com/coder/coder/coderd/database"
|
|
|
|
"github.com/coder/coder/coderd/httpapi"
|
|
|
|
"github.com/coder/coder/coderd/httpmw"
|
2022-03-22 19:17:50 +00:00
|
|
|
"github.com/coder/coder/codersdk"
|
2022-03-07 17:40:54 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func (api *api) workspaceBuild(rw http.ResponseWriter, r *http.Request) {
|
|
|
|
workspaceBuild := httpmw.WorkspaceBuildParam(r)
|
|
|
|
job, err := api.Database.GetProvisionerJobByID(r.Context(), workspaceBuild.JobID)
|
|
|
|
if err != nil {
|
|
|
|
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
|
|
|
|
Message: fmt.Sprintf("get provisioner job: %s", err),
|
|
|
|
})
|
|
|
|
return
|
|
|
|
}
|
|
|
|
render.Status(r, http.StatusOK)
|
|
|
|
render.JSON(rw, r, convertWorkspaceBuild(workspaceBuild, convertProvisionerJob(job)))
|
|
|
|
}
|
|
|
|
|
2022-03-22 19:17:50 +00:00
|
|
|
func (api *api) patchCancelWorkspaceBuild(rw http.ResponseWriter, r *http.Request) {
|
|
|
|
workspaceBuild := httpmw.WorkspaceBuildParam(r)
|
|
|
|
job, err := api.Database.GetProvisionerJobByID(r.Context(), workspaceBuild.JobID)
|
|
|
|
if err != nil {
|
|
|
|
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
|
|
|
|
Message: fmt.Sprintf("get provisioner job: %s", err),
|
|
|
|
})
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if job.CompletedAt.Valid {
|
|
|
|
httpapi.Write(rw, http.StatusPreconditionFailed, httpapi.Response{
|
|
|
|
Message: "Job has already completed!",
|
|
|
|
})
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if job.CanceledAt.Valid {
|
|
|
|
httpapi.Write(rw, http.StatusPreconditionFailed, httpapi.Response{
|
|
|
|
Message: "Job has already been marked as canceled!",
|
|
|
|
})
|
|
|
|
return
|
|
|
|
}
|
|
|
|
err = api.Database.UpdateProvisionerJobWithCancelByID(r.Context(), database.UpdateProvisionerJobWithCancelByIDParams{
|
|
|
|
ID: job.ID,
|
|
|
|
CanceledAt: sql.NullTime{
|
|
|
|
Time: database.Now(),
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
|
|
|
|
Message: fmt.Sprintf("update provisioner job: %s", err),
|
|
|
|
})
|
|
|
|
return
|
|
|
|
}
|
|
|
|
httpapi.Write(rw, http.StatusOK, httpapi.Response{
|
|
|
|
Message: "Job has been marked as canceled...",
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2022-03-07 17:40:54 +00:00
|
|
|
func (api *api) workspaceBuildResources(rw http.ResponseWriter, r *http.Request) {
|
|
|
|
workspaceBuild := httpmw.WorkspaceBuildParam(r)
|
|
|
|
job, err := api.Database.GetProvisionerJobByID(r.Context(), workspaceBuild.JobID)
|
|
|
|
if err != nil {
|
|
|
|
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
|
|
|
|
Message: fmt.Sprintf("get provisioner job: %s", err),
|
|
|
|
})
|
|
|
|
return
|
|
|
|
}
|
|
|
|
api.provisionerJobResources(rw, r, job)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (api *api) workspaceBuildLogs(rw http.ResponseWriter, r *http.Request) {
|
|
|
|
workspaceBuild := httpmw.WorkspaceBuildParam(r)
|
|
|
|
job, err := api.Database.GetProvisionerJobByID(r.Context(), workspaceBuild.JobID)
|
|
|
|
if err != nil {
|
|
|
|
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
|
|
|
|
Message: fmt.Sprintf("get provisioner job: %s", err),
|
|
|
|
})
|
|
|
|
return
|
|
|
|
}
|
|
|
|
api.provisionerJobLogs(rw, r, job)
|
|
|
|
}
|
|
|
|
|
2022-03-22 19:17:50 +00:00
|
|
|
func convertWorkspaceBuild(workspaceBuild database.WorkspaceBuild, job codersdk.ProvisionerJob) codersdk.WorkspaceBuild {
|
2022-03-07 17:40:54 +00:00
|
|
|
//nolint:unconvert
|
2022-03-22 19:17:50 +00:00
|
|
|
return codersdk.WorkspaceBuild{
|
2022-04-06 17:42:40 +00:00
|
|
|
ID: workspaceBuild.ID,
|
|
|
|
CreatedAt: workspaceBuild.CreatedAt,
|
|
|
|
UpdatedAt: workspaceBuild.UpdatedAt,
|
|
|
|
WorkspaceID: workspaceBuild.WorkspaceID,
|
|
|
|
TemplateVersionID: workspaceBuild.TemplateVersionID,
|
|
|
|
BeforeID: workspaceBuild.BeforeID.UUID,
|
|
|
|
AfterID: workspaceBuild.AfterID.UUID,
|
|
|
|
Name: workspaceBuild.Name,
|
|
|
|
Transition: workspaceBuild.Transition,
|
|
|
|
InitiatorID: workspaceBuild.InitiatorID,
|
|
|
|
Job: job,
|
2022-03-22 19:17:50 +00:00
|
|
|
}
|
2022-03-07 17:40:54 +00:00
|
|
|
}
|
|
|
|
|
2022-03-22 19:17:50 +00:00
|
|
|
func convertWorkspaceResource(resource database.WorkspaceResource, agent *codersdk.WorkspaceAgent) codersdk.WorkspaceResource {
|
|
|
|
return codersdk.WorkspaceResource{
|
2022-03-07 17:40:54 +00:00
|
|
|
ID: resource.ID,
|
|
|
|
CreatedAt: resource.CreatedAt,
|
|
|
|
JobID: resource.JobID,
|
|
|
|
Transition: resource.Transition,
|
2022-03-22 19:17:50 +00:00
|
|
|
Address: resource.Address,
|
2022-03-07 17:40:54 +00:00
|
|
|
Type: resource.Type,
|
|
|
|
Name: resource.Name,
|
|
|
|
Agent: agent,
|
|
|
|
}
|
|
|
|
}
|