This repository has been archived by the owner on Dec 21, 2023. It is now read-only.
/
configurationstore.go
142 lines (121 loc) · 4.99 KB
/
configurationstore.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
137
138
139
140
141
142
package common
import (
"errors"
"net/http"
"strings"
apimodels "github.com/keptn/go-utils/pkg/api/models"
keptnapi "github.com/keptn/go-utils/pkg/api/utils"
)
type configStoreErrType int
var ErrConfigStoreInvalidToken = errors.New("invalid git token")
var ErrConfigStoreUpstreamNotFound = errors.New("upstream repository not found")
var ErrServiceNotFound = errors.New("service not found")
const configServiceSvcDoesNotExistErrorMsg = "service does not exists" // [sic] this is what we get from the configuration service
const resourceServiceSvcDoesNotExistErrorMsg = "service not found"
//go:generate moq -pkg common_mock -out ./fake/configurationstore_mock.go . ConfigurationStore
type ConfigurationStore interface {
CreateProject(project apimodels.Project) error
UpdateProject(project apimodels.Project) error
CreateProjectShipyard(projectName string, resources []*apimodels.Resource) error
UpdateProjectResource(projectName string, resource *apimodels.Resource) error
DeleteProject(projectName string) error
CreateStage(projectName string, stage string) error
CreateService(projectName string, stageName string, serviceName string) error
GetProjectResource(projectName string, resourceURI string) (*apimodels.Resource, error)
GetStageResource(projectName, stageName, resourceURI string) (*apimodels.Resource, error)
DeleteService(projectName string, stageName string, serviceName string) error
}
type GitConfigurationStore struct {
projectAPI *keptnapi.ProjectHandler
stagesAPI *keptnapi.StageHandler
servicesAPI *keptnapi.ServiceHandler
resourceAPI *keptnapi.ResourceHandler
}
func NewGitConfigurationStore(configurationServiceEndpoint string) *GitConfigurationStore {
return &GitConfigurationStore{
projectAPI: keptnapi.NewProjectHandler(configurationServiceEndpoint),
stagesAPI: keptnapi.NewStageHandler(configurationServiceEndpoint),
servicesAPI: keptnapi.NewServiceHandler(configurationServiceEndpoint),
resourceAPI: keptnapi.NewResourceHandler(configurationServiceEndpoint),
}
}
func (g GitConfigurationStore) GetProjectResource(projectName string, resourceURI string) (*apimodels.Resource, error) {
return g.resourceAPI.GetProjectResource(projectName, resourceURI)
}
func (g GitConfigurationStore) GetStageResource(projectName, stageName, resourceURI string) (*apimodels.Resource, error) {
return g.resourceAPI.GetStageResource(projectName, stageName, resourceURI)
}
func (g GitConfigurationStore) CreateProject(project apimodels.Project) error {
if _, err := g.projectAPI.CreateProject(project); err != nil {
return g.buildErrResponse(err)
}
return nil
}
func (g GitConfigurationStore) UpdateProject(project apimodels.Project) error {
if _, err := g.projectAPI.UpdateConfigurationServiceProject(project); err != nil {
return g.buildErrResponse(err)
}
return nil
}
func (g GitConfigurationStore) DeleteProject(projectName string) error {
p := apimodels.Project{
ProjectName: projectName,
}
if _, err := g.projectAPI.DeleteProject(p); err != nil {
return errors.New(*err.Message)
}
return nil
}
func (g GitConfigurationStore) CreateProjectShipyard(projectName string, resources []*apimodels.Resource) error {
if _, err := g.resourceAPI.CreateProjectResources(projectName, resources); err != nil {
return err
}
return nil
}
func (g GitConfigurationStore) UpdateProjectResource(projectName string, resource *apimodels.Resource) error {
if _, err := g.resourceAPI.UpdateProjectResource(projectName, resource); err != nil {
return err
}
return nil
}
func (g GitConfigurationStore) CreateStage(projectName string, stageName string) error {
if _, err := g.stagesAPI.CreateStage(projectName, stageName); err != nil {
return g.buildErrResponse(err)
}
return nil
}
func (g GitConfigurationStore) CreateService(projectName string, stageName string, serviceName string) error {
if _, err := g.servicesAPI.CreateServiceInStage(projectName, stageName, serviceName); err != nil {
return g.buildErrResponse(err)
}
return nil
}
func (g GitConfigurationStore) DeleteService(projectName string, stageName string, serviceName string) error {
if _, err := g.servicesAPI.DeleteServiceFromStage(projectName, stageName, serviceName); err != nil {
return g.buildErrResponse(err)
}
return nil
}
func (g GitConfigurationStore) buildErrResponse(err *apimodels.Error) error {
if isServiceNotFoundErr(*err) {
return ErrServiceNotFound
} else if err.Code == http.StatusFailedDependency {
return ErrConfigStoreInvalidToken
} else if err.Code == http.StatusNotFound {
return ErrConfigStoreUpstreamNotFound
}
return errors.New(*err.Message)
}
func isServiceNotFoundErr(err apimodels.Error) bool {
if err.Message == nil {
// if there is no message, we cannot deduct it being a service not found error
return false
}
if err.Code == http.StatusBadRequest || err.Code == http.StatusNotFound {
errMsg := strings.ToLower(*err.Message)
if strings.Contains(errMsg, configServiceSvcDoesNotExistErrorMsg) || strings.Contains(errMsg, resourceServiceSvcDoesNotExistErrorMsg) {
return true
}
}
return false
}