Path: blob/main/components/gitpod-db/go/dbtest/workspace_instance.go
2500 views
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.1// Licensed under the GNU Affero General Public License (AGPL).2// See License.AGPL.txt in the project root for license information.34package dbtest56import (7"context"8"database/sql"9"testing"10"time"1112db "github.com/gitpod-io/gitpod/components/gitpod-db/go"13"github.com/google/uuid"14"github.com/stretchr/testify/require"15"gorm.io/gorm"16)1718var (19workspaceInstanceStatus = `{"phase": "stopped", "conditions": {"deployed": false, "pullingImages": false, "serviceExists": false}}`20)2122func NewWorkspaceInstance(t *testing.T, instance db.WorkspaceInstance) db.WorkspaceInstance {23t.Helper()2425id := uuid.New()26if instance.ID != uuid.Nil {27id = instance.ID28}2930workspaceID := GenerateWorkspaceID()31if instance.WorkspaceID != "" {32workspaceID = instance.WorkspaceID33}3435creationTime := db.VarcharTime{}36if instance.CreationTime.IsSet() {37creationTime = instance.CreationTime38} else if instance.StartedTime.IsSet() {39creationTime = instance.StartedTime40}4142startedTime := db.VarcharTime{}43if instance.StartedTime.IsSet() {44startedTime = instance.StartedTime45}4647deployedTime := db.VarcharTime{}48if instance.DeployedTime.IsSet() {49deployedTime = instance.DeployedTime50}5152stoppedTime := db.VarcharTime{}53if instance.StoppedTime.IsSet() {54stoppedTime = instance.StoppedTime55} else if instance.StoppingTime.IsSet() {56creationTime = instance.StoppingTime57}5859stoppingTime := db.VarcharTime{}60if instance.StoppingTime.IsSet() {61stoppingTime = instance.StoppingTime62}6364status := []byte(workspaceInstanceStatus)65if instance.Status.String() != "" {66status = instance.Status67}6869attributionID := db.NewTeamAttributionID(uuid.New().String())70if instance.UsageAttributionID != "" {71attributionID = instance.UsageAttributionID72}7374workspaceClass := db.WorkspaceClass_Default75if instance.WorkspaceClass != "" {76workspaceClass = instance.WorkspaceClass77}7879phasePersisted := ""80if instance.PhasePersisted != "" {81phasePersisted = instance.PhasePersisted82}8384return db.WorkspaceInstance{85ID: id,86WorkspaceID: workspaceID,87UsageAttributionID: attributionID,88WorkspaceClass: workspaceClass,89Configuration: nil,90Region: "",91ImageBuildInfo: sql.NullString{},92IdeURL: "",93WorkspaceBaseImage: "",94WorkspaceImage: "",95CreationTime: creationTime,96StartedTime: startedTime,97DeployedTime: deployedTime,98StoppedTime: stoppedTime,99LastModified: time.Time{},100StoppingTime: stoppingTime,101LastHeartbeat: "",102StatusOld: sql.NullString{},103Status: status,104Phase: sql.NullString{},105PhasePersisted: phasePersisted,106}107}108109func CreateWorkspaceInstances(t *testing.T, conn *gorm.DB, instances ...db.WorkspaceInstance) []db.WorkspaceInstance {110t.Helper()111112var records []db.WorkspaceInstance113var ids []string114for _, instance := range instances {115record := NewWorkspaceInstance(t, instance)116records = append(records, record)117ids = append(ids, record.ID.String())118}119120require.NoError(t, conn.CreateInBatches(&records, 1000).Error)121122t.Cleanup(func() {123require.NoError(t, conn.Where(ids).Delete(&db.WorkspaceInstance{}).Error)124})125126return records127}128129func FindStoppedWorkspaceInstancesInRange(t *testing.T, conn *gorm.DB, from, to time.Time, workspaceID string) []db.WorkspaceInstanceForUsage {130all, err := db.FindStoppedWorkspaceInstancesInRange(context.Background(), conn, from, to)131require.NoError(t, err)132return filterByWorkspaceId(all, workspaceID)133}134135func FindRunningWorkspaceInstances(t *testing.T, conn *gorm.DB, workspaceID string) []db.WorkspaceInstanceForUsage {136all, err := db.FindRunningWorkspaceInstances(context.Background(), conn)137require.NoError(t, err)138return filterByWorkspaceId(all, workspaceID)139}140141func filterByWorkspaceId(all []db.WorkspaceInstanceForUsage, workspaceID string) []db.WorkspaceInstanceForUsage {142var result []db.WorkspaceInstanceForUsage143for _, candidate := range all {144if candidate.WorkspaceID == workspaceID {145result = append(result, candidate)146}147}148return result149}150151152