Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/usage/pkg/apiv1/pricer.go
2499 views
1
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
2
// Licensed under the GNU Affero General Public License (AGPL).
3
// See License.AGPL.txt in the project root for license information.
4
5
package apiv1
6
7
import (
8
"time"
9
10
"github.com/gitpod-io/gitpod/common-go/log"
11
db "github.com/gitpod-io/gitpod/components/gitpod-db/go"
12
)
13
14
const (
15
defaultPrice = float64(1) / float64(6)
16
)
17
18
var (
19
DefaultWorkspacePricer, _ = NewWorkspacePricer(map[string]float64{})
20
)
21
22
func NewWorkspacePricer(creditMinutesByWorkspaceClass map[string]float64) (*WorkspacePricer, error) {
23
return &WorkspacePricer{creditMinutesByWorkspaceClass: creditMinutesByWorkspaceClass}, nil
24
}
25
26
type WorkspacePricer struct {
27
creditMinutesByWorkspaceClass map[string]float64
28
}
29
30
func (p *WorkspacePricer) CreditsUsedByInstance(instance *db.WorkspaceInstanceForUsage, stopTimeIfStillRunning time.Time) float64 {
31
runtime := instance.WorkspaceRuntimeSeconds(stopTimeIfStillRunning)
32
return p.Credits(instance.WorkspaceClass, runtime)
33
}
34
35
func (p *WorkspacePricer) Credits(workspaceClass string, runtimeInSeconds int64) float64 {
36
inMinutes := float64(runtimeInSeconds) / 60
37
return p.CreditsPerMinuteForClass(workspaceClass) * inMinutes
38
}
39
40
func (p *WorkspacePricer) CreditsPerMinuteForClass(workspaceClass string) float64 {
41
if creditsForClass, ok := p.creditMinutesByWorkspaceClass[workspaceClass]; ok {
42
return creditsForClass
43
}
44
log.Errorf("No credit minutes configured for workspace class %q - using default price of %v credits per minute", workspaceClass, defaultPrice)
45
return defaultPrice
46
}
47
48