Skip to content

Commit b0170ec

Browse files
easyCZroboquat
authored andcommitted
[usage] Add usageAttributionID to WorksapceInstance model (in go)
1 parent e2dcab4 commit b0170ec

File tree

3 files changed

+60
-0
lines changed

3 files changed

+60
-0
lines changed

components/usage/pkg/db/dbtest/workspace_instance.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,15 @@ func NewWorkspaceInstance(t *testing.T, instance db.WorkspaceInstance) db.Worksp
5959
status = instance.Status
6060
}
6161

62+
attributionID := db.NewUserAttributionID(uuid.New().String())
63+
if instance.UsageAttributionID != "" {
64+
attributionID = instance.UsageAttributionID
65+
}
66+
6267
return db.WorkspaceInstance{
6368
ID: id,
6469
WorkspaceID: workspaceID,
70+
UsageAttributionID: attributionID,
6571
Configuration: nil,
6672
Region: "",
6773
ImageBuildInfo: sql.NullString{},

components/usage/pkg/db/workspace_instance.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/google/uuid"
1212
"gorm.io/datatypes"
1313
"gorm.io/gorm"
14+
"strings"
1415
"time"
1516
)
1617

@@ -23,6 +24,7 @@ type WorkspaceInstance struct {
2324
IdeURL string `gorm:"column:ideUrl;type:varchar;size:255;" json:"ideUrl"`
2425
WorkspaceBaseImage string `gorm:"column:workspaceBaseImage;type:varchar;size:255;" json:"workspaceBaseImage"`
2526
WorkspaceImage string `gorm:"column:workspaceImage;type:varchar;size:255;" json:"workspaceImage"`
27+
UsageAttributionID AttributionID `gorm:"column:usageAttributionId;type:varchar;size:60;" json:"usageAttributionId"`
2628

2729
CreationTime VarcharTime `gorm:"column:creationTime;type:varchar;size:255;" json:"creationTime"`
2830
StartedTime VarcharTime `gorm:"column:startedTime;type:varchar;size:255;" json:"startedTime"`
@@ -87,3 +89,33 @@ func ListWorkspaceInstancesInRange(ctx context.Context, conn *gorm.DB, from, to
8789

8890
return instances, nil
8991
}
92+
93+
const (
94+
AttributionEntity_User = "user"
95+
AttributionEntity_Team = "team"
96+
)
97+
98+
func newAttributionID(entity, identifier string) AttributionID {
99+
return AttributionID(fmt.Sprintf("%s:%s", entity, identifier))
100+
}
101+
102+
func NewUserAttributionID(userID string) AttributionID {
103+
return newAttributionID(AttributionEntity_User, userID)
104+
}
105+
106+
func NewTeamAttributionID(teamID string) AttributionID {
107+
return newAttributionID(AttributionEntity_Team, teamID)
108+
}
109+
110+
// AttributionID consists of an entity, and an identifier in the form:
111+
// <entity>:<identifier>, e.g. team:a7dcf253-f05e-4dcf-9a47-cf8fccc74717
112+
type AttributionID string
113+
114+
func (a AttributionID) Values() (entity string, identifier string) {
115+
tokens := strings.Split(string(a), ":")
116+
if len(tokens) != 2 {
117+
return "", ""
118+
}
119+
120+
return tokens[0], tokens[1]
121+
}

components/usage/pkg/db/workspace_instance_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,3 +217,25 @@ func TestListWorkspaceInstancesInRange_InBatches(t *testing.T) {
217217
require.NoError(t, err)
218218
require.Len(t, results, len(instances))
219219
}
220+
221+
func TestAttributionID_Values(t *testing.T) {
222+
scenarios := []struct {
223+
Input string
224+
ExpectedEntity string
225+
ExpectedID string
226+
}{
227+
{Input: "team:123", ExpectedEntity: db.AttributionEntity_Team, ExpectedID: "123"},
228+
{Input: "user:123", ExpectedEntity: db.AttributionEntity_User, ExpectedID: "123"},
229+
{Input: "user:123:invalid", ExpectedEntity: "", ExpectedID: ""},
230+
{Input: "invalid:123:", ExpectedEntity: "", ExpectedID: ""},
231+
{Input: "", ExpectedEntity: "", ExpectedID: ""},
232+
}
233+
234+
for _, s := range scenarios {
235+
t.Run(fmt.Sprintf("attribution in: %s, expecting: %s %s", s.Input, s.ExpectedEntity, s.ExpectedID), func(t *testing.T) {
236+
entity, id := db.AttributionID(s.Input).Values()
237+
require.Equal(t, s.ExpectedEntity, entity)
238+
require.Equal(t, s.ExpectedID, id)
239+
})
240+
}
241+
}

0 commit comments

Comments
 (0)