/
github_faker.go
136 lines (109 loc) · 4.35 KB
/
github_faker.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
//+build faker
package usecase
import (
"fmt"
"math/rand"
"time"
cmap "github.com/orcaman/concurrent-map"
"github.com/AlekSi/pointer"
"github.com/monitoror/monitoror/models"
"github.com/monitoror/monitoror/monitorable/github"
githubModels "github.com/monitoror/monitoror/monitorable/github/models"
"github.com/monitoror/monitoror/pkg/monitoror/builder"
"github.com/monitoror/monitoror/pkg/monitoror/faker"
"github.com/monitoror/monitoror/pkg/monitoror/utils/git"
"github.com/monitoror/monitoror/pkg/monitoror/utils/nonempty"
)
type (
githubUsecase struct {
timeRefByProject cmap.ConcurrentMap
}
)
var availableBuildStatus = faker.Statuses{
{models.SuccessStatus, time.Second * 30},
{models.FailedStatus, time.Second * 30},
{models.CanceledStatus, time.Second * 20},
{models.RunningStatus, time.Second * 60},
{models.QueuedStatus, time.Second * 30},
{models.WarningStatus, time.Second * 20},
{models.DisabledStatus, time.Second * 20},
{models.ActionRequiredStatus, time.Second * 20},
}
func NewGithubUsecase() github.Usecase {
return &githubUsecase{cmap.New()}
}
func (gu *githubUsecase) Count(params *githubModels.CountParams) (*models.Tile, error) {
tile := models.NewTile(github.GithubCountTileType).WithValue(models.NumberUnit)
tile.Label = params.Query
tile.Status = models.SuccessStatus
if len(params.ValueValues) != 0 {
tile.Value.Values = params.ValueValues
} else {
tile.Value.Values = []string{"42"}
}
return tile, nil
}
func (gu *githubUsecase) Checks(params *githubModels.ChecksParams) (tile *models.Tile, err error) {
tile = models.NewTile(github.GithubChecksTileType).WithBuild()
tile.Label = params.Repository
tile.Status = nonempty.Struct(params.Status, gu.computeStatus(params)).(models.TileStatus)
if tile.Status == models.DisabledStatus {
return
}
if tile.Status == models.WarningStatus {
// Warning can be Unstable Build
if rand.Intn(2) == 0 {
tile.Message = "Fake error message"
return
}
}
tile.Build.Branch = pointer.ToString(git.HumanizeBranch(params.Ref))
tile.Build.PreviousStatus = nonempty.Struct(params.PreviousStatus, models.SuccessStatus).(models.TileStatus)
// Author
if tile.Status == models.FailedStatus {
tile.Build.Author = &models.Author{}
tile.Build.Author.Name = nonempty.String(params.AuthorName, "John Doe")
tile.Build.Author.AvatarURL = nonempty.String(params.AuthorAvatarURL, "https://monitoror.com/assets/images/avatar.png")
}
// Duration / EstimatedDuration
if tile.Status == models.RunningStatus {
estimatedDuration := nonempty.Duration(time.Duration(params.EstimatedDuration), time.Second*300)
tile.Build.Duration = pointer.ToInt64(nonempty.Int64(params.Duration, int64(gu.computeDuration(params, estimatedDuration).Seconds())))
if tile.Build.PreviousStatus != models.UnknownStatus {
tile.Build.EstimatedDuration = pointer.ToInt64(int64(estimatedDuration.Seconds()))
} else {
tile.Build.EstimatedDuration = pointer.ToInt64(0)
}
}
// StartedAt / FinishedAt
if tile.Build.Duration == nil {
tile.Build.StartedAt = pointer.ToTime(nonempty.Time(params.StartedAt, time.Now().Add(-time.Minute*10)))
} else {
tile.Build.StartedAt = pointer.ToTime(nonempty.Time(params.StartedAt, time.Now().Add(-time.Second*time.Duration(*tile.Build.Duration))))
}
if tile.Status != models.QueuedStatus && tile.Status != models.RunningStatus {
tile.Build.FinishedAt = pointer.ToTime(nonempty.Time(params.FinishedAt, tile.Build.StartedAt.Add(time.Minute*5)))
}
return tile, nil
}
func (gu *githubUsecase) ListDynamicTile(params interface{}) ([]builder.Result, error) {
panic("unimplemented")
}
func (gu *githubUsecase) computeStatus(params *githubModels.ChecksParams) models.TileStatus {
projectID := fmt.Sprintf("%s-%s-%s", params.Owner, params.Repository, params.Ref)
value, ok := gu.timeRefByProject.Get(projectID)
if !ok || value == nil {
value = faker.GetRefTime()
gu.timeRefByProject.Set(projectID, value)
}
return faker.ComputeStatus(value.(time.Time), availableBuildStatus)
}
func (gu *githubUsecase) computeDuration(params *githubModels.ChecksParams, duration time.Duration) time.Duration {
projectID := fmt.Sprintf("%s-%s-%s", params.Owner, params.Repository, params.Ref)
value, ok := gu.timeRefByProject.Get(projectID)
if !ok || value == nil {
value = faker.GetRefTime()
gu.timeRefByProject.Set(projectID, value)
}
return faker.ComputeDuration(value.(time.Time), duration)
}