Rainbond/api/handler/app.go
2020-11-25 16:39:38 +08:00

149 lines
3.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package handler
import (
"fmt"
"io/ioutil"
"os"
"strconv"
"strings"
"github.com/goodrain/rainbond/mq/client"
"regexp"
"github.com/goodrain/rainbond/api/model"
"github.com/goodrain/rainbond/api/util"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"github.com/tidwall/gjson"
)
var re = regexp.MustCompile(`\s`)
//AppAction app action
type AppAction struct {
MQClient client.MQClient
staticDir string
}
//GetStaticDir get static dir
func (a *AppAction) GetStaticDir() string {
return a.staticDir
}
//CreateAppManager create app manager
func CreateAppManager(mqClient client.MQClient) *AppAction {
staticDir := "/grdata/app"
if os.Getenv("LOCAL_APP_CACHE_DIR") != "" {
staticDir = os.Getenv("LOCAL_APP_CACHE_DIR")
}
return &AppAction{
MQClient: mqClient,
staticDir: staticDir,
}
}
//Complete Complete
func (a *AppAction) Complete(tr *model.ExportAppStruct) error {
appName := gjson.Get(tr.Body.GroupMetadata, "group_name").String()
if appName == "" {
err := errors.New("Failed to get group name form metadata")
logrus.Error(err)
return err
}
if tr.Body.Format != "rainbond-app" && tr.Body.Format != "docker-compose" {
err := errors.New("Unsupported the format: " + tr.Body.Format)
logrus.Error(err)
return err
}
version := gjson.Get(tr.Body.GroupMetadata, "group_version").String()
appName = unicode2zh(appName)
tr.SourceDir = fmt.Sprintf("%s/%s/%s-%s", a.staticDir, tr.Body.Format, appName, version)
return nil
}
//ExportApp ExportApp
func (a *AppAction) ExportApp(tr *model.ExportAppStruct) error {
// 保存元数据到组目录
if err := saveMetadata(tr); err != nil {
return util.CreateAPIHandleErrorFromDBError("Failed to export app", err)
}
err := a.MQClient.SendBuilderTopic(client.TaskStruct{
TaskBody: model.BuildMQBodyFrom(tr),
TaskType: "export_app",
Topic: client.BuilderTopic,
})
if err != nil {
logrus.Error("Failed to Enqueue MQ for ExportApp:", err)
return err
}
return nil
}
//ImportApp import app
func (a *AppAction) ImportApp(importApp *model.ImportAppStruct) error {
err := a.MQClient.SendBuilderTopic(client.TaskStruct{
TaskBody: importApp,
TaskType: "import_app",
Topic: client.BuilderTopic,
})
if err != nil {
logrus.Error("Failed to MQ Enqueue for ImportApp:", err)
return err
}
logrus.Debugf("equeue mq build plugin from image success")
return nil
}
func saveMetadata(tr *model.ExportAppStruct) error {
// 创建应用组目录
os.MkdirAll(tr.SourceDir, 0755)
// 写入元数据到文件
err := ioutil.WriteFile(fmt.Sprintf("%s/metadata.json", tr.SourceDir), []byte(tr.Body.GroupMetadata), 0644)
if err != nil {
logrus.Error("Failed to save metadata", err)
return err
}
return nil
}
// unicode2zh 将unicode转为中文并去掉空格
func unicode2zh(uText string) (context string) {
for i, char := range strings.Split(uText, `\\u`) {
if i < 1 {
context = char
continue
}
length := len(char)
if length > 3 {
pre := char[:4]
zh, err := strconv.ParseInt(pre, 16, 32)
if err != nil {
context += char
continue
}
context += fmt.Sprintf("%c", zh)
if length > 4 {
context += char[4:]
}
}
}
context = re.ReplaceAllString(context, "")
return context
}