11package deployment
22
33import (
4+ "encoding/json"
45 "fmt"
56 "github.com/devtron-labs/devtron/api/restHandler/common"
67 chartRepoRepository "github.com/devtron-labs/devtron/pkg/chartRepo/repository"
@@ -14,11 +15,14 @@ import (
1415 "io/ioutil"
1516 "net/http"
1617 "os"
18+ "path/filepath"
19+ "strings"
1720 "time"
1821)
1922
2023type DeploymentConfigRestHandler interface {
2124 CreateChartFromFile (w http.ResponseWriter , r * http.Request )
25+ SaveChart (w http.ResponseWriter , r * http.Request )
2226}
2327
2428type DeploymentConfigRestHandlerImpl struct {
@@ -31,6 +35,13 @@ type DeploymentConfigRestHandlerImpl struct {
3135 chartRefRepository chartRepoRepository.ChartRefRepository
3236}
3337
38+ type DeploymentChartInfo struct {
39+ ChartName string `json:"chartName"`
40+ Description string `json:"description"`
41+ FileId string `json:"fileId"`
42+ Action string `json:"action"`
43+ }
44+
3445func NewDeploymentConfigRestHandlerImpl (Logger * zap.SugaredLogger , userAuthService user.UserService , enforcer casbin.Enforcer , validator * validator.Validate ,
3546 refChartDir pipeline.RefChartDir , chartService pipeline.ChartService , chartRefRepository chartRepoRepository.ChartRefRepository ) * DeploymentConfigRestHandlerImpl {
3647 return & DeploymentConfigRestHandlerImpl {
@@ -86,14 +97,13 @@ func (handler *DeploymentConfigRestHandlerImpl) CreateChartFromFile(w http.Respo
8697
8798 chartInfo , err := handler .chartService .ExtractChartIfMissing (fileBytes , string (handler .refChartDir ), "" )
8899
89- if chartInfo .TemporaryFolder != "" {
90- err1 := os .RemoveAll (chartInfo .TemporaryFolder )
91- if err1 != nil {
92- handler .Logger .Errorw ("error in deleting temp dir " , "err" , err )
93- }
94- }
95-
96100 if err != nil {
101+ if chartInfo .TemporaryFolder != "" {
102+ err1 := os .RemoveAll (chartInfo .TemporaryFolder )
103+ if err1 != nil {
104+ handler .Logger .Errorw ("error in deleting temp dir " , "err" , err1 )
105+ }
106+ }
97107 common .WriteJsonResp (w , fmt .Errorf (err .Error ()), nil , http .StatusBadRequest )
98108 return
99109 }
@@ -113,12 +123,78 @@ func (handler *DeploymentConfigRestHandlerImpl) CreateChartFromFile(w http.Respo
113123 },
114124 }
115125
116- err = handler .chartRefRepository .Save (chartRefs )
126+ chartsJson , _ := json .Marshal (chartRefs )
127+ err = ioutil .WriteFile (filepath .Join (chartInfo .TemporaryFolder , "output.json" ), chartsJson , 0644 )
128+ if err != nil {
129+ common .WriteJsonResp (w , fmt .Errorf (err .Error ()), nil , http .StatusInternalServerError )
130+ return
131+ }
132+
133+ pathList := strings .Split (chartInfo .TemporaryFolder , "/" )
134+ chartData := & DeploymentChartInfo {
135+ ChartName : chartInfo .ChartName ,
136+ Description : chartInfo .Description ,
137+ FileId : pathList [len (pathList )- 1 ],
138+ }
139+
140+ common .WriteJsonResp (w , err , chartData , http .StatusOK )
141+ return
142+ }
143+
144+ func (handler * DeploymentConfigRestHandlerImpl ) SaveChart (w http.ResponseWriter , r * http.Request ) {
145+ decoder := json .NewDecoder (r .Body )
146+ userId , err := handler .userAuthService .GetLoggedInUser (r )
147+ if userId == 0 || err != nil {
148+ common .WriteJsonResp (w , err , nil , http .StatusUnauthorized )
149+ return
150+ }
151+
152+ token := r .Header .Get ("token" )
153+ if ok := handler .enforcer .Enforce (token , casbin .ResourceGlobal , casbin .ActionDelete , "*" ); ! ok {
154+ common .WriteJsonResp (w , errors .New ("unauthorized" ), nil , http .StatusForbidden )
155+ return
156+ }
157+
158+ var request DeploymentChartInfo
159+ err = decoder .Decode (& request )
117160 if err != nil {
118- handler .Logger .Errorw ("error in saving ConfigMap, CallbackConfigMap " , "err" , err )
119- common .WriteJsonResp (w , err , "Chart couldn't be saved" , http .StatusInternalServerError )
161+ handler .Logger .Errorw ("decode err " , "err" , err )
162+ common .WriteJsonResp (w , err , nil , http .StatusBadRequest )
120163 return
121164 }
122- common .WriteJsonResp (w , err , "Chart Saved Successfully" , http .StatusOK )
165+
166+ location := filepath .Join (string (handler .refChartDir ), request .FileId )
167+ if request .Action == "Save" {
168+ file , err := ioutil .ReadFile (filepath .Join (location , "output.json" ))
169+ if err != nil {
170+ handler .Logger .Errorw ("Error reading output.json" , "err" , err )
171+ common .WriteJsonResp (w , err , nil , http .StatusBadRequest )
172+ return
173+ }
174+ chartRefs := & chartRepoRepository.ChartRef {}
175+ err = json .Unmarshal (file , & chartRefs )
176+ if err != nil {
177+ handler .Logger .Errorw ("unmarshall err" , "err" , err )
178+ common .WriteJsonResp (w , err , nil , http .StatusBadRequest )
179+ return
180+ }
181+
182+ err = handler .chartRefRepository .Save (chartRefs )
183+ if err != nil {
184+ handler .Logger .Errorw ("error in saving Chart" , "err" , err )
185+ common .WriteJsonResp (w , err , "Chart couldn't be saved" , http .StatusInternalServerError )
186+ return
187+ }
188+ }
189+
190+ if location != "" {
191+ err = os .RemoveAll (location )
192+ if err != nil {
193+ handler .Logger .Errorw ("error in deleting temp dir " , "err" , err )
194+ }
195+ }
196+
197+ common .WriteJsonResp (w , err , "Processed successfully" , http .StatusOK )
123198 return
199+
124200}
0 commit comments