-
Notifications
You must be signed in to change notification settings - Fork 414
/
v2_worker_model.go
140 lines (125 loc) · 4.12 KB
/
v2_worker_model.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
package api
import (
"context"
"net/http"
"net/url"
"github.com/gorilla/mux"
"github.com/rockbears/yaml"
"github.com/ovh/cds/engine/api/entity"
"github.com/ovh/cds/engine/api/project"
"github.com/ovh/cds/engine/api/repositoriesmanager"
"github.com/ovh/cds/engine/service"
"github.com/ovh/cds/sdk"
)
func (api *API) getWorkerModelV2Handler() ([]service.RbacChecker, service.Handler) {
return service.RBAC(api.workerModelRead),
func(ctx context.Context, w http.ResponseWriter, req *http.Request) error {
vars := mux.Vars(req)
pKey := vars["projectKey"]
vcsIdentifier, err := url.PathUnescape(vars["vcsIdentifier"])
if err != nil {
return sdk.NewError(sdk.ErrWrongRequest, err)
}
repositoryIdentifier, err := url.PathUnescape(vars["repositoryIdentifier"])
if err != nil {
return sdk.WithStack(err)
}
workerModelName := vars["workerModelName"]
branch := QueryString(req, "branch")
// Secret only available for the hatchery
withCreds := QueryBool(req, "withSecrets")
if withCreds && getHatcheryConsumer(ctx) == nil {
return sdk.NewErrorFrom(sdk.ErrForbidden, "You cannot ask for secrets")
}
proj, err := project.Load(ctx, api.mustDB(), pKey)
if err != nil {
return err
}
vcsProject, err := api.getVCSByIdentifier(ctx, pKey, vcsIdentifier)
if err != nil {
return err
}
repo, err := api.getRepositoryByIdentifier(ctx, vcsProject.ID, repositoryIdentifier)
if err != nil {
return err
}
if branch == "" {
tx, err := api.mustDB().Begin()
if err != nil {
return err
}
vcsClient, err := repositoriesmanager.AuthorizedClient(ctx, tx, api.Cache, proj.Key, vcsProject.Name)
if err != nil {
_ = tx.Rollback()
return err
}
defaultBranch, err := vcsClient.Branch(ctx, repo.Name, sdk.VCSBranchFilters{Default: true})
if err != nil {
_ = tx.Rollback()
return err
}
if err := tx.Commit(); err != nil {
_ = tx.Rollback()
return err
}
branch = defaultBranch.DisplayID
}
var workerModel sdk.V2WorkerModel
ent, err := entity.LoadByBranchTypeName(ctx, api.mustDB(), repo.ID, branch, sdk.EntityTypeWorkerModel, workerModelName)
if err != nil {
return err
}
if err := yaml.Unmarshal([]byte(ent.Data), &workerModel); err != nil {
return sdk.WrapError(err, "unable to read %s / %s @ %s", repo.ID, workerModelName, branch)
}
// Only hatchery can ask for cred
if withCreds && getHatcheryConsumer(ctx) != nil {
if err := entity.WorkerModelDecryptSecrets(ctx, api.mustDB(), proj.ID, &workerModel, project.DecryptWithBuiltinKey); err != nil {
return err
}
}
return service.WriteJSON(w, workerModel, http.StatusOK)
}
}
func (api *API) getWorkerModelsV2Handler() ([]service.RbacChecker, service.Handler) {
return service.RBAC(api.projectRead),
func(ctx context.Context, w http.ResponseWriter, req *http.Request) error {
vars := mux.Vars(req)
pKey := vars["projectKey"]
vcsIdentifier, err := url.PathUnescape(vars["vcsIdentifier"])
if err != nil {
return sdk.NewError(sdk.ErrWrongRequest, err)
}
repositoryIdentifier, err := url.PathUnescape(vars["repositoryIdentifier"])
if err != nil {
return sdk.WithStack(err)
}
branch := QueryString(req, "branch")
vcsProject, err := api.getVCSByIdentifier(ctx, pKey, vcsIdentifier)
if err != nil {
return err
}
repo, err := api.getRepositoryByIdentifier(ctx, vcsProject.ID, repositoryIdentifier)
if err != nil {
return err
}
var entities []sdk.Entity
if branch == "" {
entities, err = entity.LoadByRepositoryAndType(ctx, api.mustDB(), repo.ID, sdk.EntityTypeWorkerModel)
} else {
entities, err = entity.LoadByTypeAndBranch(ctx, api.mustDB(), repo.ID, sdk.EntityTypeWorkerModel, branch)
}
if err != nil {
return err
}
modelTemplates := make([]sdk.V2WorkerModel, 0, len(entities))
for _, e := range entities {
var mt sdk.V2WorkerModel
if err := yaml.Unmarshal([]byte(e.Data), &mt); err != nil {
return sdk.WithStack(err)
}
modelTemplates = append(modelTemplates, mt)
}
return service.WriteJSON(w, modelTemplates, http.StatusOK)
}
}