This repository has been archived by the owner on Dec 21, 2023. It is now read-only.
/
evaluationmanager.go
109 lines (95 loc) · 3.29 KB
/
evaluationmanager.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
package handler
import (
"github.com/keptn/keptn/shipyard-controller/internal/common"
"github.com/keptn/keptn/shipyard-controller/internal/db"
"time"
"github.com/google/uuid"
"github.com/keptn/go-utils/pkg/common/strutils"
"github.com/keptn/go-utils/pkg/common/timeutils"
"github.com/keptn/go-utils/pkg/lib/keptn"
keptnv2 "github.com/keptn/go-utils/pkg/lib/v0_2_0"
"github.com/keptn/keptn/shipyard-controller/models"
)
const userFriendlyTimeFormat = "2006-01-02T15:04:05"
const (
evaluationErrInvalidTimeframe = iota
evaluationErrSendEventFailed
evaluationErrServiceNotAvailable
)
//go:generate moq -pkg fake -skip-ensure -out ./fake/evaluationmanager.go . IEvaluationManager
type IEvaluationManager interface {
CreateEvaluation(project, stage, service string, params *models.CreateEvaluationParams) (*models.CreateEvaluationResponse, *models.Error)
}
type EvaluationManager struct {
eventSender keptn.EventSender
projectMVRepo db.ProjectMVRepo
}
func NewEvaluationManager(eventSender keptn.EventSender, projectMVRepo db.ProjectMVRepo) (*EvaluationManager, error) {
return &EvaluationManager{
eventSender: eventSender,
projectMVRepo: projectMVRepo,
}, nil
}
func (em *EvaluationManager) CreateEvaluation(project, stage, service string, params *models.CreateEvaluationParams) (*models.CreateEvaluationResponse, *models.Error) {
_, err := em.projectMVRepo.GetService(project, stage, service)
if err != nil {
return nil, &models.Error{
Code: evaluationErrServiceNotAvailable,
Message: strutils.Stringp(err.Error()),
}
}
keptnContext := uuid.New().String()
extensions := make(map[string]interface{})
extensions["shkeptncontext"] = keptnContext
var start, end *time.Time
start, end, err = timeutils.GetStartEndTime(timeutils.GetStartEndTimeParams{
StartDate: params.Start,
EndDate: params.End,
Timeframe: params.Timeframe,
})
if err != nil {
// if we got an error, try again with other time format
start, end, err = timeutils.GetStartEndTime(timeutils.GetStartEndTimeParams{
StartDate: params.Start,
EndDate: params.End,
Timeframe: params.Timeframe,
TimeFormat: userFriendlyTimeFormat,
})
if err != nil {
return nil, &models.Error{
Code: evaluationErrInvalidTimeframe,
Message: strutils.Stringp(err.Error()),
}
}
}
eventContext := &models.CreateEvaluationResponse{KeptnContext: keptnContext}
evaluationTriggeredEvent := keptnv2.EvaluationTriggeredEventData{
EventData: keptnv2.EventData{
Project: project,
Service: service,
Stage: stage,
Labels: params.Labels,
},
Evaluation: keptnv2.Evaluation{
Start: timeutils.GetKeptnTimeStamp(*start),
End: timeutils.GetKeptnTimeStamp(*end),
},
}
ce := common.CreateEventWithPayload(keptnContext, "", keptnv2.GetTriggeredEventType(stage+"."+keptnv2.EvaluationTaskName), evaluationTriggeredEvent)
if params.GitCommitID != "" {
ce.SetExtension("gitcommitid", params.GitCommitID)
}
if err := ce.Context.SetSource("https://github.com/keptn/keptn/api"); err != nil {
return nil, &models.Error{
Code: evaluationErrSendEventFailed,
Message: common.Stringp(err.Error()),
}
}
if err := em.eventSender.SendEvent(ce); err != nil {
return nil, &models.Error{
Code: evaluationErrSendEventFailed,
Message: common.Stringp(err.Error()),
}
}
return eventContext, nil
}