Skip to content

Commit 4399b39

Browse files
committed
feat: support offline package upload
Signed-off-by: 张启航 <[email protected]>
1 parent 4ac23ec commit 4399b39

File tree

22 files changed

+1035
-110
lines changed

22 files changed

+1035
-110
lines changed

api/api/api_interface.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ type ClusterInterface interface {
5454
GetAbility(w http.ResponseWriter, r *http.Request)
5555
UpdateAbility(w http.ResponseWriter, r *http.Request)
5656
ListRainbondComponents(w http.ResponseWriter, r *http.Request)
57+
GetLangVersion(w http.ResponseWriter, r *http.Request)
58+
UpdateLangVersion(w http.ResponseWriter, r *http.Request)
59+
CreateLangVersion(w http.ResponseWriter, r *http.Request)
60+
DeleteLangVersion(w http.ResponseWriter, r *http.Request)
5761
}
5862

5963
// NodesInterface -
@@ -211,6 +215,13 @@ type AppInterface interface {
211215
UploadID(w http.ResponseWriter, r *http.Request)
212216
}
213217

218+
// LongVersionInterface long version interface
219+
type LongVersionInterface interface {
220+
UploadLongVersion(w http.ResponseWriter, r *http.Request)
221+
OptionLongVersion(w http.ResponseWriter, r *http.Request)
222+
DownloadLongVersion(w http.ResponseWriter, r *http.Request)
223+
}
224+
214225
// ApplicationInterface tenant application interface
215226
type ApplicationInterface interface {
216227
CreateApp(w http.ResponseWriter, r *http.Request)

api/api_routers/version2/v2Routers.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,10 @@ func (v2 *V2) clusterRouter() chi.Router {
147147
r.Get("/governance-mode", controller.GetManager().ListGovernanceMode)
148148
r.Get("/rbd-components", controller.GetManager().ListRainbondComponents)
149149
r.Mount("/nodes", v2.nodesRouter())
150+
r.Get("/langVersion", controller.GetManager().GetLangVersion)
151+
r.Post("/langVersion", controller.GetManager().CreateLangVersion)
152+
r.Put("/langVersion", controller.GetManager().UpdateLangVersion)
153+
r.Delete("/langVersion", controller.GetManager().DeleteLangVersion)
150154
return r
151155
}
152156

api/api_routers/websocket/websocket.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,8 @@
1919
package websocket
2020

2121
import (
22-
"github.com/goodrain/rainbond/api/controller"
23-
2422
"github.com/go-chi/chi"
23+
"github.com/goodrain/rainbond/api/controller"
2524
)
2625

2726
// Routes routes
@@ -60,3 +59,14 @@ func PackageBuildRoutes() chi.Router {
6059
r.Options("/component/events/{eventID}", controller.GetManager().UploadPackage)
6160
return r
6261
}
62+
63+
// LongVersionRoutes 语言包处理
64+
func LongVersionRoutes() chi.Router {
65+
r := chi.NewRouter()
66+
r.Options("/upload", controller.GetManager().OptionLongVersion)
67+
r.Post("/upload", controller.GetManager().UploadLongVersion)
68+
//r.Options("/download/{language}/{version}", controller.GetManager().OptionLongVersion)
69+
r.Get("/download/{language}/{version}", controller.GetManager().DownloadLongVersion)
70+
r.Head("/download/{language}/{version}", controller.GetManager().DownloadLongVersion)
71+
return r
72+
}

api/controller/cluster.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ import (
2828
dbmodel "github.com/goodrain/rainbond/db/model"
2929
"github.com/sirupsen/logrus"
3030
"net/http"
31+
"os"
32+
"path"
3133
"strconv"
3234

3335
httputil "github.com/goodrain/rainbond/util/http"
@@ -462,3 +464,64 @@ func (c *ClusterController) UpdateAbility(w http.ResponseWriter, r *http.Request
462464
}
463465
httputil.ReturnSuccess(r, w, nil)
464466
}
467+
468+
// GetLangVersion Get the unconnected namespaces under the current cluster
469+
func (c *ClusterController) GetLangVersion(w http.ResponseWriter, r *http.Request) {
470+
language := r.URL.Query().Get("language")
471+
versions, err := db.GetManager().LongVersionDao().ListVersionByLanguage(language)
472+
if err != nil {
473+
httputil.ReturnBcodeError(r, w, fmt.Errorf("update lang version failure: %v", err))
474+
return
475+
}
476+
httputil.ReturnSuccess(r, w, versions)
477+
}
478+
479+
// UpdateLangVersion -
480+
func (c *ClusterController) UpdateLangVersion(w http.ResponseWriter, r *http.Request) {
481+
var lang model.UpdateLangVersion
482+
if ok := httputil.ValidatorRequestStructAndErrorResponse(r, w, &lang, nil); !ok {
483+
httputil.ReturnError(r, w, 400, "failed to parse parameters")
484+
return
485+
}
486+
err := db.GetManager().LongVersionDao().DefaultLangVersion(lang.Lang, lang.Version)
487+
if err != nil {
488+
httputil.ReturnError(r, w, 400, fmt.Sprintf("update lang version failure: %v", err))
489+
return
490+
}
491+
httputil.ReturnSuccess(r, w, "更新成功")
492+
}
493+
494+
// CreateLangVersion -
495+
func (c *ClusterController) CreateLangVersion(w http.ResponseWriter, r *http.Request) {
496+
var lang model.UpdateLangVersion
497+
if ok := httputil.ValidatorRequestStructAndErrorResponse(r, w, &lang, nil); !ok {
498+
httputil.ReturnError(r, w, 400, "failed to parse parameters")
499+
return
500+
}
501+
err := db.GetManager().LongVersionDao().CreateLangVersion(lang.Lang, lang.Version, lang.EventID, lang.FileName)
502+
if err != nil {
503+
httputil.ReturnError(r, w, 400, fmt.Sprintf("create lang version failure: %v", err))
504+
return
505+
}
506+
httputil.ReturnSuccess(r, w, "创建成功")
507+
}
508+
509+
// DeleteLangVersion -
510+
func (c *ClusterController) DeleteLangVersion(w http.ResponseWriter, r *http.Request) {
511+
var lang model.UpdateLangVersion
512+
if ok := httputil.ValidatorRequestStructAndErrorResponse(r, w, &lang, nil); !ok {
513+
httputil.ReturnError(r, w, 400, "failed to parse parameters")
514+
return
515+
}
516+
eventID, err := db.GetManager().LongVersionDao().DeleteLangVersion(lang.Lang, lang.Version)
517+
if err != nil {
518+
httputil.ReturnError(r, w, 400, fmt.Sprintf("delete lang version failure: %v", err))
519+
return
520+
}
521+
err = os.RemoveAll(path.Join(BaseUploadPath, eventID))
522+
if err != nil {
523+
httputil.ReturnError(r, w, 400, fmt.Sprintf("delete lang version pack failure: %v", err))
524+
return
525+
}
526+
httputil.ReturnSuccess(r, w, "删除成功")
527+
}

api/controller/lg_pack.go

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
package controller
2+
3+
import (
4+
"encoding/json"
5+
"github.com/go-chi/chi"
6+
"github.com/goodrain/rainbond/db"
7+
httputil "github.com/goodrain/rainbond/util/http"
8+
"io"
9+
"math/rand"
10+
"net/http"
11+
"os"
12+
"path"
13+
"reflect"
14+
"strings"
15+
)
16+
17+
// LongVersionStruct -
18+
type LongVersionStruct struct{}
19+
20+
// BaseUploadPath lang version base dir
21+
const BaseUploadPath = "/grdata/lang"
22+
23+
// UploadLongVersion -
24+
func (t *LongVersionStruct) UploadLongVersion(w http.ResponseWriter, r *http.Request) {
25+
//从表单中读取文件
26+
file, fileHeader, err := r.FormFile("file")
27+
if err != nil {
28+
sendResponse(w, http.StatusBadRequest, "failure", "get file failure.")
29+
return
30+
}
31+
//defer 结束时关闭文件
32+
defer file.Close()
33+
eventID, err := generateRandomString(32)
34+
langPath := path.Join(BaseUploadPath, eventID)
35+
_, err = os.Stat(langPath)
36+
if os.IsNotExist(err) {
37+
// 创建文件夹
38+
err := os.MkdirAll(langPath, os.ModePerm)
39+
if err != nil {
40+
sendResponse(w, http.StatusInternalServerError, "failure", "dir is not exist,mkdir failure")
41+
return
42+
}
43+
}
44+
//创建文件
45+
newFile, err := os.Create(path.Join(langPath, fileHeader.Filename))
46+
if err != nil {
47+
sendResponse(w, http.StatusInternalServerError, "failure", "Create file error"+err.Error())
48+
return
49+
}
50+
//defer 结束时关闭文件
51+
defer newFile.Close()
52+
53+
//将文件写到本地
54+
_, err = io.Copy(newFile, file)
55+
if err != nil {
56+
sendResponse(w, http.StatusInternalServerError, "failure", "Failed to write file: "+err.Error())
57+
return
58+
}
59+
long := struct {
60+
EventID string `json:"event_id"`
61+
FileName string `json:"file_name"`
62+
}{
63+
eventID,
64+
fileHeader.Filename,
65+
}
66+
origin := r.Header.Get("Origin")
67+
w.Header().Add("Access-Control-Allow-Origin", origin)
68+
w.Header().Add("Access-Control-Allow-Methods", "POST, GET, DELETE, PUT, OPTIONS")
69+
w.Header().Add("Access-Control-Allow-Credentials", "true")
70+
w.Header().Add("Access-Control-Allow-Headers", "authorization,x_region_name,x_team_name,x-requested-with")
71+
sendResponse(w, http.StatusOK, "successful", long)
72+
}
73+
74+
// DownloadLongVersion -
75+
func (t *LongVersionStruct) DownloadLongVersion(w http.ResponseWriter, r *http.Request) {
76+
language := strings.TrimSpace(chi.URLParam(r, "language"))
77+
version := strings.TrimSpace(chi.URLParam(r, "version"))
78+
ver, err := db.GetManager().LongVersionDao().GetVersionByLanguageAndVersion(language, version)
79+
if err != nil {
80+
sendResponse(w, http.StatusBadRequest, "failure", "get version failure"+err.Error())
81+
return
82+
}
83+
http.ServeFile(w, r, path.Join(BaseUploadPath, ver.EventID, ver.FileName))
84+
}
85+
86+
// OptionLongVersion -
87+
func (t *LongVersionStruct) OptionLongVersion(w http.ResponseWriter, r *http.Request) {
88+
origin := r.Header.Get("Origin")
89+
w.Header().Add("Access-Control-Allow-Origin", origin)
90+
w.Header().Add("Access-Control-Allow-Methods", "POST, GET, DELETE, PUT, OPTIONS")
91+
w.Header().Add("Access-Control-Allow-Credentials", "true")
92+
w.Header().Add("Access-Control-Allow-Headers", "authorization,x_region_name,x_team_name,content-type,x-requested-with")
93+
httputil.ReturnSuccess(r, w, nil)
94+
return
95+
}
96+
97+
func generateRandomString(n int) (string, error) {
98+
const letters = "abcdefghijklmnopqrstuvwxyz0123456789"
99+
bytes := make([]byte, n)
100+
if _, err := rand.Read(bytes); err != nil {
101+
return "", err
102+
}
103+
for i, b := range bytes {
104+
bytes[i] = letters[b%byte(len(letters))]
105+
}
106+
return string(bytes), nil
107+
}
108+
109+
// APIResponse =
110+
type APIResponse struct {
111+
Code int `json:"code"`
112+
Message string `json:"message"`
113+
Bean interface{} `json:"bean,omitempty"`
114+
List interface{} `json:"list,omitempty"`
115+
}
116+
117+
func sendResponse(w http.ResponseWriter, code int, message string, data interface{}) {
118+
w.Header().Set("Content-Type", "application/json")
119+
w.WriteHeader(code)
120+
121+
response := APIResponse{
122+
Code: code,
123+
Message: message,
124+
}
125+
126+
switch reflect.TypeOf(data).Kind() {
127+
case reflect.Slice, reflect.Array:
128+
response.List = data
129+
default:
130+
response.Bean = data
131+
}
132+
133+
json.NewEncoder(w).Encode(response)
134+
}

api/controller/manager.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ type V2Manager interface {
4242
api.PluginInterface
4343
api.RulesInterface
4444
api.AppInterface
45+
api.LongVersionInterface
4546
api.Gatewayer
4647
api.ThirdPartyServicer
4748
api.Labeler

api/controller/resources.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ type V2Routes struct {
5555
TenantStruct
5656
EventLogStruct
5757
AppStruct
58+
LongVersionStruct
5859
GatewayStruct
5960
ThirdPartyServiceController
6061
LabelController

api/handler/helm.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ func (h *HelmAction) GetChartInformation(chart api_model.ChartInformation) (*[]a
6868
return nil, &util.APIHandleError{Code: 400, Err: errors.Wrap(err, "GetChartInformation NewRequest")}
6969
}
7070
client := &http.Client{}
71+
req.SetBasicAuth(chart.Username, chart.Password)
7172
resp, err := client.Do(req)
7273
if err != nil {
7374
return nil, &util.APIHandleError{Code: 400, Err: errors.Wrap(err, "GetChartInformation client.Do")}

api/handler/resource_import.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import (
1717
"time"
1818
)
1919

20-
//ResourceImport Import the converted k8s resources into recognition
20+
// ResourceImport Import the converted k8s resources into recognition
2121
func (c *clusterAction) ResourceImport(namespace string, as map[string]model.ApplicationResource, eid string) (*model.ReturnResourceImport, *util.APIHandleError) {
2222
logrus.Infof("ResourceImport function begin")
2323
var returnResourceImport model.ReturnResourceImport

api/model/model.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -523,6 +523,8 @@ type CheckHelmApp struct {
523523
type ChartInformation struct {
524524
RepoURL string `json:"repo_url"`
525525
ChartName string `json:"chart_name"`
526+
Username string `json:"username"`
527+
Password string `json:"password"`
526528
}
527529

528530
// GetYamlByChart -
@@ -2242,3 +2244,11 @@ type UploadChartValueYaml struct {
22422244
Values map[string]string `json:"values"`
22432245
Readme string `json:"readme"`
22442246
}
2247+
2248+
// UpdateLangVersion -
2249+
type UpdateLangVersion struct {
2250+
Lang string `json:"lang"`
2251+
Version string `json:"version"`
2252+
EventID string `json:"event_id"`
2253+
FileName string `json:"file_name"`
2254+
}

0 commit comments

Comments
 (0)