Create & Init Project...

This commit is contained in:
2019-04-22 18:49:16 +08:00
commit fc4fa37393
25440 changed files with 4054998 additions and 0 deletions

View File

@@ -0,0 +1,49 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"apm.go",
"app.go",
"build.go",
"common.go",
"conf_svr.go",
"config.go",
"http.go",
"tag.go",
"tree.go",
],
importpath = "go-common/app/admin/main/config/http",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/config/conf:go_default_library",
"//app/admin/main/config/model:go_default_library",
"//app/admin/main/config/service:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/http/blademaster/middleware/permit:go_default_library",
"//library/time:go_default_library",
"//vendor/github.com/jinzhu/gorm:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,36 @@
package http
import (
"go-common/app/admin/main/config/model"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
func apmCopy(c *bm.Context) {
res := map[string]interface{}{}
user := user(c)
v := new(model.ApmCopyReq)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApp(c, user, c.Request.Header.Get("Cookie"), v.TreeID); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
cnt := 0
if err = svr.DB.Model(&model.App{}).Where("tree_id=?", v.TreeID).Count(&cnt).Error; err != nil {
log.Error("svr.ApmCopy count error(%v)", err)
res["message"] = "查询该服务失败"
c.JSONMap(res, err)
return
}
if cnt <= 0 {
log.Error("svr.ApmCopy count (%v)", cnt)
res["message"] = "未找到该服务"
c.JSONMap(res, err)
return
}
c.JSON(nil, svr.Apm(v.TreeID, v.Name, v.ApmName, user))
}

View File

@@ -0,0 +1,277 @@
package http
import (
"go-common/app/admin/main/config/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"strconv"
"strings"
)
func updateToken(c *bm.Context) {
v := new(model.UpdateTokenReq)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApp(c, user(c), c.Request.Header.Get("Cookie"), v.TreeID); err != nil {
c.JSON(nil, err)
return
}
if err = svr.UpdateToken(c, v.Env, v.Zone, v.TreeID); err != nil {
c.JSON(nil, err)
return
}
c.JSON(nil, err)
}
func create(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.CreateReq)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApp(c, user(c), c.Request.Header.Get("Cookie"), v.TreeID); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
creates := []string{"dev", "fat1", "uat", "pre", "prod"}
for _, val := range creates {
if err = svr.CreateApp(v.AppName, val, model.DefaultZone, v.TreeID); err != nil {
res["message"] = "创建app失败"
c.JSONMap(res, err)
return
}
}
c.JSON(nil, err)
}
func appList(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.AppListReq)
err := c.Bind(v)
if err != nil {
return
}
nodes, err := svr.AuthApps(c, user(c), c.Request.Header.Get("Cookie"))
if err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
app, err := svr.AppList(c, v.Bu, v.Team, v.AppName, model.DefaultEnv, model.DefaultZone, v.Ps, v.Pn, nodes, v.Status)
if err != nil {
res["message"] = "数据获取失败"
c.JSONMap(res, err)
return
}
result := app
c.JSON(result, nil)
}
func envsByTeam(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.EnvsByTeamReq)
err := c.Bind(v)
if err != nil {
return
}
nodes, err := svr.AuthApps(c, user(c), c.Request.Header.Get("Cookie"))
if err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
data, err := svr.EnvsByTeam(c, v.AppName, v.Zone, nodes)
if err != nil {
c.JSON(nil, err)
return
}
result := data
c.JSON(result, nil)
}
func envs(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.EnvsReq)
err := c.Bind(v)
if err != nil {
return
}
user := user(c)
nodes, err := svr.AuthApps(c, user, c.Request.Header.Get("Cookie"))
if err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(svr.Envs(c, user, v.AppName, v.Zone, v.TreeID, nodes))
}
func nodeTree(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.NodeTreeReq)
err := c.Bind(v)
if err != nil {
return
}
cookie := c.Request.Header.Get("Cookie")
user := user(c)
nodes, err := svr.AuthApps(c, user, cookie)
if err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(svr.Node(c, user, v.Node, v.Team, cookie, nodes))
}
func zoneCopy(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.ZoneCopyReq)
err := c.Bind(v)
if err != nil {
return
}
if v.From == v.To {
res["message"] = "来源机房和目标机房不能是同一个"
c.JSONMap(res, ecode.RequestErr)
return
}
if _, err = svr.AuthApp(c, user(c), c.Request.Header.Get("Cookie"), v.TreeID); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
if err = svr.ZoneCopy(c, v.AppName, v.From, v.To, v.TreeID); err != nil {
res["message"] = "拷贝失败"
c.JSONMap(res, err)
return
}
c.JSON(nil, err)
}
func casterEnvs(c *bm.Context) {
v := new(model.CasterEnvsReq)
err := c.Bind(v)
if err != nil {
return
}
if v.Auth != "caster_envs_all" {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(svr.CasterEnvs(v.Zone, v.TreeID))
}
func rename(c *bm.Context) {
res := map[string]interface{}{}
v := new(struct {
TreeID int64 `form:"tree_id" validate:"required"`
})
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApp(c, user(c), c.Request.Header.Get("Cookie"), v.TreeID); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(nil, svr.AppRename(v.TreeID, user(c), c.Request.Header.Get("Cookie")))
}
func getApps(c *bm.Context) {
v := new(struct {
Name string `form:"name" validate:"required"`
Env string `form:"env" validate:"required"`
})
err := c.Bind(v)
if err != nil {
return
}
apps, err := svr.GetApps(v.Env)
if err != nil {
c.JSON(nil, err)
return
}
var appIDS []int64
for _, val := range apps {
appIDS = append(appIDS, val.ID)
}
if len(appIDS) == 0 {
c.JSON(nil, ecode.RequestErr)
return
}
builds, err := svr.AllBuilds(appIDS)
if err != nil {
c.JSON(nil, err)
return
}
var tagIDS []int64
for _, val := range builds {
tagIDS = append(tagIDS, val.TagID)
}
tags, err := svr.GetConfigIDS(tagIDS)
if err != nil {
c.JSON(nil, err)
return
}
var configIDS []int64
for _, val := range tags {
tmpIDs := strings.Split(val.ConfigIDs, ",")
for _, vv := range tmpIDs {
id, err := strconv.ParseInt(vv, 10, 64)
if err != nil {
log.Error("strconv.ParseInt() error(%v)", err)
return
}
configIDS = append(configIDS, id)
}
}
var appids []int64
var appslist []*model.App
var names []string
if len(configIDS) > 0 {
configs, err := svr.GetConfigs(configIDS, v.Name)
if err != nil {
c.JSON(nil, err)
return
}
for _, val := range configs {
appids = append(appids, val.AppID)
}
appslist, err = svr.IdsGetApps(appids)
if err != nil {
c.JSON(nil, err)
return
}
for _, val := range appslist {
names = append(names, val.Name)
}
}
c.JSON(names, nil)
}
func upAppStatus(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.AppStatusReq)
err := c.Bind(v)
if err != nil {
return
}
if !(v.Status == model.StatusShow || v.Status == model.StatusHidden) {
c.JSON(nil, ecode.RequestErr)
return
}
_, err = svr.AuthApps(c, user(c), c.Request.Header.Get("Cookie"))
if err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(nil, svr.UpAppStatus(c, v.Status, v.TreeID))
}

View File

@@ -0,0 +1,94 @@
package http
import (
"strings"
"go-common/app/admin/main/config/model"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
)
func createBuild(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.CreateBuildReq)
err := c.Bind(v)
if err != nil {
return
}
name := user(c)
if _, err = svr.AuthApp(c, name, c.Request.Header.Get("Cookie"), v.TreeID); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
if len(strings.TrimSpace(v.Name)) == 0 {
res["message"] = "name不能为空"
c.JSONMap(res, ecode.RequestErr)
return
}
build := &model.Build{}
build.TagID = v.TagID
build.Operator = name
build.Name = v.Name
if err = svr.CreateBuild(build, v.TreeID, v.Env, v.Zone); err != nil {
res["message"] = "创建build失败"
c.JSONMap(res, err)
return
}
c.JSON(nil, err)
}
func builds(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.BuildsReq)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApp(c, user(c), c.Request.Header.Get("Cookie"), v.TreeID); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(svr.Builds(v.TreeID, v.AppName, v.Env, v.Zone))
}
func build(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.BuildReq)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApps(c, user(c), c.Request.Header.Get("Cookie")); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(svr.Build(v.BuildID))
}
func buildDel(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.BuildReq)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApps(c, user(c), c.Request.Header.Get("Cookie")); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
if err = svr.GetDelInfos(c, v.BuildID); err != nil {
res["message"] = "主机列表中有正在使用该build的机器请让主机离线3小时自动清除后再删除"
c.JSONMap(res, err)
return
}
if err = svr.Delete(v.BuildID); err != nil {
res["message"] = "删除build失败"
c.JSONMap(res, err)
return
}
c.JSON(nil, err)
}

View File

@@ -0,0 +1,164 @@
package http
import (
"go-common/app/admin/main/config/model"
bm "go-common/library/net/http/blademaster"
"go-common/library/time"
"strconv"
"strings"
)
func createComConfig(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.CreateComConfigReq)
err := c.Bind(v)
if err != nil {
return
}
name := user(c)
if _, err = svr.AuthApps(c, name, c.Request.Header.Get("Cookie")); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
conf := &model.CommonConf{}
conf.Operator = name
conf.State = v.State
conf.Comment = v.Comment
conf.Mark = v.Mark
conf.Name = v.Name
c.JSON(nil, svr.CreateComConf(conf, v.Team, v.Env, v.Zone, v.SkipLint))
}
func comValue(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.ComValueReq)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApps(c, user(c), c.Request.Header.Get("Cookie")); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(svr.ComConfig(v.ConfigID))
}
func configsByTeam(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.ConfigsByTeamReq)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApps(c, user(c), c.Request.Header.Get("Cookie")); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(svr.ComConfigsByTeam(v.Team, v.Env, v.Zone, v.Ps, v.Pn))
}
func comConfigsByName(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.ComConfigsByNameReq)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApps(c, user(c), c.Request.Header.Get("Cookie")); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(svr.ComConfigsByName(v.Team, v.Env, v.Zone, v.Name))
}
func updateComConfValue(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.UpdateComConfValueReq)
err := c.Bind(v)
if err != nil {
return
}
user := user(c)
if _, err = svr.AuthApps(c, user, c.Request.Header.Get("Cookie")); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
conf := &model.CommonConf{}
conf.Mtime = time.Time(v.Mtime)
conf.Mark = v.Mark
conf.ID = v.ID
conf.State = v.State
conf.Comment = v.Comment
conf.Operator = user
conf.Name = v.Name
c.JSON(nil, svr.UpdateComConfValue(conf, v.SkipLint))
}
func namesByTeam(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.NamesByTeamReq)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApps(c, user(c), c.Request.Header.Get("Cookie")); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(svr.NamesByTeam(v.Team, v.Env, v.Zone))
}
func appByTeam(c *bm.Context) {
v := new(struct {
CommonConfigID int64 `form:"common_config_id" validate:"required"`
})
err := c.Bind(v)
if err != nil {
return
}
tagMap, err := svr.AppByTeam(v.CommonConfigID)
if err != nil {
c.JSON(nil, err)
return
}
c.JSON(tagMap, nil)
}
func tagPush(c *bm.Context) {
v := new(struct {
CommonConfigID int64 `form:"common_config_id" validate:"required"`
Tags string `form:"tags" validate:"required"`
})
err := c.Bind(v)
if err != nil {
return
}
user := user(c)
tagMap, err := svr.AppByTeam(v.CommonConfigID)
if err != nil {
c.JSON(nil, err)
return
}
res := make(map[int64]interface{})
tagIDS := strings.Split(v.Tags, ",")
for _, val := range tagIDS {
val, _ := strconv.ParseInt(val, 10, 64)
if _, ok := tagMap[val]; ok {
err = svr.CommonPush(c, val, v.CommonConfigID, user)
if err == nil {
res[val] = "success"
} else {
res[val] = "fail"
}
} else {
res[val] = "data error"
}
}
c.JSON(res, nil)
}

View File

@@ -0,0 +1,59 @@
package http
import (
"go-common/app/admin/main/config/model"
bm "go-common/library/net/http/blademaster"
)
func setToken(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.SetTokenReq)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApp(c, user(c), c.Request.Header.Get("Cookie"), v.TreeID); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
// update & write cache
if err = svr.SetToken(c, v.TreeID, v.Env, v.Zone, v.Token); err != nil {
res["message"] = "重置token失败"
c.JSONMap(res, err)
return
}
c.JSON(nil, err)
}
// hosts client hosts
func hosts(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.HostsReq)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApp(c, user(c), c.Request.Header.Get("Cookie"), v.TreeID); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(svr.Hosts(c, v.TreeID, v.App, v.Env, v.Zone))
}
//clear host in redis
func clearhost(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.HostsReq)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApp(c, user(c), c.Request.Header.Get("Cookie"), v.TreeID); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(nil, svr.ClearHost(c, v.TreeID, v.Env, v.Zone))
}

View File

@@ -0,0 +1,617 @@
package http
import (
"encoding/json"
"fmt"
"go-common/app/admin/main/config/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/time"
"strconv"
"strings"
"github.com/jinzhu/gorm"
)
func createConfig(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.CreateConfigReq)
err := c.Bind(v)
if err != nil {
return
}
user := user(c)
if _, err = svr.AuthApp(c, user, c.Request.Header.Get("Cookie"), v.TreeID); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
conf := &model.Config{}
conf.Operator = user
conf.Name = v.Name
conf.Mark = v.Mark
conf.Comment = v.Comment
conf.State = v.State
conf.From = v.From
c.JSON(nil, svr.CreateConf(conf, v.TreeID, v.Env, v.Zone, v.SkipLint))
}
func lintConfig(c *bm.Context) {
var req struct {
Name string `form:"name" validate:"required"`
Comment string `form:"comment" validate:"required"`
}
if err := c.Bind(&req); err != nil {
// ignore error
return
}
c.JSON(svr.LintConfig(req.Name, req.Comment))
}
func updateConfValue(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.UpdateConfValueReq)
err := c.Bind(v)
if err != nil {
return
}
user := user(c)
if _, err = svr.AuthApps(c, user, c.Request.Header.Get("Cookie")); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
conf := &model.Config{}
conf.Name = v.Name
conf.ID = v.ID
conf.Operator = user
conf.Mark = v.Mark
conf.Comment = v.Comment
conf.State = v.State
conf.Mtime = time.Time(v.Mtime)
var configs *model.Config
configs, err = svr.Value(v.ID)
if err != nil {
res["message"] = "未找到源文件"
c.JSONMap(res, err)
return
}
if v.NewCommon > 0 {
common := &model.CommonConf{}
common2 := &model.CommonConf{}
if err = svr.DB.Where("id = ?", configs.From).First(common).Error; err != nil {
res["message"] = "未找到公共源文件"
c.JSONMap(res, err)
return
}
if err = svr.DB.Where("team_id = ? and name = ? and state = 2 and id = ?", common.TeamID, common.Name, v.NewCommon).Order("id desc").First(common2).Error; err != nil {
res["message"] = "未找到最新的公共文件"
c.JSONMap(res, err)
return
}
conf.From = v.NewCommon
}
//验证是否最新源文件
newConfig := &model.Config{}
if err = svr.DB.Where("app_id = ? and name = ?", configs.AppID, configs.Name).Order("id desc").First(newConfig).Error; err != nil {
res["message"] = "未找到最新文件"
c.JSONMap(res, err)
return
}
//默认验证ignore 0
if newConfig.ID != v.ID && v.Ignore == 0 && user != newConfig.Operator {
err = ecode.ConfigNotNow
res["message"] = fmt.Sprintf("当前源文件:%d有最新源文件版本%d操作人:%s是否继续提交", v.ID, newConfig.ID, newConfig.Operator)
c.JSONMap(res, err)
return
}
c.JSON(nil, svr.UpdateConfValue(conf, v.SkipLint))
}
func value(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.ValueReq)
err := c.Bind(v)
if err != nil {
return
}
var TreeID int64
TreeID, err = svr.ConfigGetTreeID(v.ConfigID)
if err != nil {
res["message"] = "未找到tree_id"
c.JSONMap(res, err)
return
}
if _, err = svr.AuthApp(c, user(c), c.Request.Header.Get("Cookie"), TreeID); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(svr.Value(v.ConfigID))
}
func configsByBuildID(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.ConfigsByBuildIDReq)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApps(c, user(c), c.Request.Header.Get("Cookie")); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(svr.ConfigsByBuildID(v.BuildID))
}
func configsByTagID(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.ConfigsByTagIDReq)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApps(c, user(c), c.Request.Header.Get("Cookie")); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(svr.ConfigsByTagID(v.TagID))
}
func configsByAppName(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.ConfigsByAppNameReq)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApp(c, user(c), c.Request.Header.Get("Cookie"), v.TreeID); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(svr.ConfigsByAppName(v.AppName, v.Env, v.Zone, v.TreeID, 0))
}
func configSearchAll(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.ConfigSearchAllReq)
err := c.Bind(v)
if err != nil {
return
}
nodes, err := svr.AuthApps(c, user(c), c.Request.Header.Get("Cookie"))
if err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(svr.ConfigSearchAll(c, v.Env, v.Zone, v.Like, nodes))
}
func configSearchApp(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.ConfigSearchAppReq)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApp(c, user(c), c.Request.Header.Get("Cookie"), v.TreeID); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(svr.ConfigSearchApp(c, v.AppName, v.Env, v.Zone, v.Like, v.BuildID, v.TreeID))
}
func configsByName(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.ConfigsByNameReq)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApp(c, user(c), c.Request.Header.Get("Cookie"), v.TreeID); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(svr.ConfigsByTree(v.TreeID, v.Env, v.Zone, v.Name))
}
func configs(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.ConfigsReq)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApp(c, user(c), c.Request.Header.Get("Cookie"), v.TreeID); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(svr.Configs(v.AppName, v.Env, v.Zone, v.BuildID, v.TreeID))
}
func configRefs(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.ConfigRefsReq)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApp(c, user(c), c.Request.Header.Get("Cookie"), v.TreeID); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(svr.ConfigRefs(v.AppName, v.Env, v.Zone, v.BuildID, v.TreeID))
}
func namesByAppName(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.NamesByAppNameReq)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApp(c, user(c), c.Request.Header.Get("Cookie"), v.TreeID); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(svr.NamesByAppTree(v.AppName, v.Env, v.Zone, v.TreeID))
}
func diff(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.DiffReq)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApps(c, user(c), c.Request.Header.Get("Cookie")); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(svr.Diff(v.ConfigID, v.BuildID))
}
func configDel(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.ConfigDelReq)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApps(c, user(c), c.Request.Header.Get("Cookie")); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(nil, svr.ConfigDel(v.ConfigID))
}
func configBuildInfos(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.ConfigBuildInfosReq)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApp(c, user(c), c.Request.Header.Get("Cookie"), v.TreeID); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(svr.BuildConfigInfos(v.AppName, v.Env, v.Zone, v.BuildID, v.TreeID))
}
func configUpdate(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.ConfigUpdateReq)
err := c.Bind(v)
if err != nil {
return
}
app := &model.App{}
if err = svr.DB.Where("name = ? and env = ? and zone = ? and tree_id = ? and token = ?", v.AppName, v.Env, v.Zone, v.TreeID, v.Token).First(app).Error; err != nil {
res["message"] = "参数不正确,未找到该服务"
c.JSONMap(res, err)
return
}
var obj []map[string]string
err = json.Unmarshal([]byte(v.Data), &obj)
tx := svr.DB.Begin()
for _, val := range obj {
if len(val["name"]) > 0 {
config := &model.Config{}
if err = tx.Where("app_id = ? and name = ? and state = 1", app.ID, val["name"]).First(config).Error; err != nil {
if err != gorm.ErrRecordNotFound {
c.JSON(nil, err)
tx.Rollback()
return
}
} else {
//把老的更新了再加新的
ups := map[string]interface{}{
"state": 2,
}
if err = tx.Model(&model.App{}).Where("id = ? ", config.ID).Updates(ups).Error; err != nil {
c.JSON(nil, err)
tx.Rollback()
return
}
}
//加新的
m := &model.Config{
AppID: app.ID,
Name: val["name"],
Comment: val["comment"],
State: 2,
Mark: val["mark"],
Operator: v.User,
}
db := tx.Create(m)
if err = db.Error; err != nil {
res["message"] = "创建失败"
c.JSONMap(res, err)
tx.Rollback()
return
}
} else {
c.JSON(nil, ecode.RequestErr)
tx.Rollback()
return
}
}
tx.Commit()
c.JSON(nil, err)
}
func tagUpdate(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.TagUpdateReq)
err := c.Bind(v)
if err != nil {
return
}
if len(strings.TrimSpace(v.Build)) == 0 {
c.JSON(nil, ecode.RequestErr)
return
}
app := &model.App{}
if err = svr.DB.Where("name = ? and env = ? and zone = ? and tree_id = ? and token = ?", v.AppName, v.Env, v.Zone, v.TreeID, v.Token).First(app).Error; err != nil {
res["message"] = "参数不正确,未找到该服务"
c.JSONMap(res, err)
return
}
confs := []*model.Config{}
tags := &model.Tag{}
tag := &model.Tag{}
build := &model.Build{}
tagConfigs := []*model.Config{}
var in []string
var in2 []string
var nameString string
tmp := make(map[string]struct{})
if v.ConfigIDs == "" && v.Names == "" {
c.JSON(nil, ecode.RequestErr)
return
} else if v.Names != "" {
in = strings.Split(v.Names, ",")
if err = svr.DB.Select("max(id) as id,name").Where("app_id = ? and state = 2 and is_delete = 0 and name in (?)", app.ID, in).Group("name").Find(&confs).Error; err != nil {
res["message"] = "未找到发版文件"
c.JSONMap(res, err)
return
}
for _, vv := range confs {
if len(nameString) > 0 {
nameString = nameString + ","
}
nameString = nameString + strconv.FormatInt(vv.ID, 10)
}
tag.ConfigIDs = nameString
} else if v.ConfigIDs != "" {
in = strings.Split(v.ConfigIDs, ",")
if err = svr.DB.Where("app_id = ? and state = 2 and is_delete = 0 and id in (?)", app.ID, in).Find(&confs).Error; err != nil {
res["message"] = "未找到发版文件"
c.JSONMap(res, err)
return
}
tag.ConfigIDs = v.ConfigIDs
}
if v.Names != "" && v.Increment == 1 {
if err = svr.DB.Where("app_id = ? and name = ?", app.ID, v.Build).Order("id desc").First(build).Error; err != nil {
res["message"] = "未找到对应的build"
c.JSONMap(res, err)
return
}
if err = svr.DB.Where("app_id = ? and build_id = ?", app.ID, build.ID).Order("id desc").First(tags).Error; err != nil {
res["message"] = "未找到对应的tag"
c.JSONMap(res, err)
return
}
in2 = strings.Split(tags.ConfigIDs, ",")
if err = svr.DB.Where("app_id = ? and state = 2 and id in (?)", app.ID, in2).Find(&tagConfigs).Error; err != nil {
res["message"] = "未找到tag中的文件"
c.JSONMap(res, err)
return
}
for _, vv := range tagConfigs {
tss := 0
for _, vvv := range confs {
if vv.Name == vvv.Name {
tss = 1
}
}
if tss != 1 {
if len(nameString) > 0 {
nameString = nameString + ","
}
nameString = nameString + strconv.FormatInt(vv.ID, 10)
}
}
tag.ConfigIDs = nameString
} else {
if len(confs) != len(in) {
res["message"] = "发版数据不符"
c.JSONMap(res, ecode.RequestErr)
return
}
for _, vv := range confs {
if _, ok := tmp[vv.Name]; !ok {
tmp[vv.Name] = struct{}{}
}
}
if len(tmp) != len(confs) {
res["message"] = "有重复的文件名"
c.JSONMap(res, ecode.RequestErr)
return
}
}
tag.Operator = v.User
tag.Mark = v.Mark
if v.Force == 1 {
tag.Force = 1
}
c.JSON(nil, svr.UpdateTag(c, v.TreeID, v.Env, v.Zone, v.Build, tag))
}
func canalTagUpdate(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.CanalTagUpdateReq)
err := c.Bind(v)
if err != nil {
return
}
if v.Force != 1 {
v.Force = 0
}
if len(strings.TrimSpace(v.Build)) == 0 {
c.JSON(nil, ecode.RequestErr)
return
}
app := &model.App{}
if err = svr.DB.Where("name = ? and env = ? and zone = ? and tree_id = ? and token = ?", v.AppName, v.Env, v.Zone, v.TreeID, v.Token).First(app).Error; err != nil {
res["message"] = "参数不正确,未找到该服务"
c.JSONMap(res, err)
return
}
confs := []*model.Config{}
configs := []*model.Config{}
tags := &model.Tag{}
tag := &model.Tag{}
build := &model.Build{}
tagConfigs := []*model.Config{}
var in []string
var in2 []string
var nameString string
tmp := make(map[string]struct{})
in = strings.Split(v.ConfigIDs, ",")
if err = svr.DB.Where("app_id = ? and state = 2 and id in(?)", app.ID, in).Find(&configs).Error; err != nil {
res["message"] = "未找到文件"
c.JSONMap(res, err)
return
}
if len(configs) != len(in) {
res["message"] = fmt.Sprintf("数据不匹配,传的数据为(%v)条,查到的数据为(%v)条,app_id(%v),config_ids(%v),in(%v)", len(in), len(configs), app.ID, v.ConfigIDs, in)
err = ecode.RequestErr
c.JSONMap(res, err)
return
}
if err = svr.DB.Where("app_id = ? and name = ?", app.ID, v.Build).Order("id desc").First(build).Error; err != nil {
res["message"] = "未找到对应的build"
c.JSONMap(res, err)
return
}
if err = svr.DB.Where("app_id = ? and build_id = ?", app.ID, build.ID).Order("id desc").First(tags).Error; err != nil {
res["message"] = "未找到对应的tag"
c.JSONMap(res, err)
return
}
in2 = strings.Split(tags.ConfigIDs, ",")
if err = svr.DB.Where("app_id = ? and state = 2 and id in (?)", app.ID, in2).Find(&tagConfigs).Error; err != nil {
res["message"] = "未找到tag中的文件"
c.JSONMap(res, err)
return
}
if err = svr.DB.Select("id,app_id,name,`from`,state,mark,operator,ctime,mtime").Where(in2).Find(&confs).Error; err != nil {
log.Error("ConfigsByIDs(%v) error(%v)", in2, err)
res["message"] = "config文件未找到"
c.JSONMap(res, err)
return
}
for _, val := range confs {
for _, vv := range configs {
if val.Name == vv.Name {
if len(nameString) > 0 {
nameString = nameString + ","
}
nameString = nameString + strconv.FormatInt(vv.ID, 10)
tmp[vv.Name] = struct{}{}
}
}
if _, ok := tmp[val.Name]; !ok {
if len(nameString) > 0 {
nameString = nameString + ","
}
nameString = nameString + strconv.FormatInt(val.ID, 10)
}
}
for _, val := range configs {
if _, ok := tmp[val.Name]; !ok {
if len(nameString) > 0 {
nameString = nameString + ","
}
nameString = nameString + strconv.FormatInt(val.ID, 10)
}
}
tag.ConfigIDs = nameString
tag.Operator = v.User
tag.Mark = v.Mark
tag.Force = v.Force
c.JSON(nil, svr.UpdateTag(c, v.TreeID, v.Env, v.Zone, v.Build, tag))
}
func canalConfigCreate(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.CanalConfigCreateReq)
err := c.Bind(v)
if err != nil {
return
}
if err = svr.CanalCheckToken(v.AppName, v.Env, v.Zone, v.Token); err != nil {
res["message"] = "未找到数据"
c.JSONMap(res, err)
return
}
conf := &model.Config{}
conf.Operator = v.User
conf.Name = v.Name
conf.Mark = v.Mark
conf.Comment = v.Comment
conf.State = v.State
conf.From = v.From
c.JSON(nil, svr.CreateConf(conf, v.TreeID, v.Env, v.Zone, true))
}
func canalNameConfigs(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.CanalNameConfigsReq)
err := c.Bind(v)
if err != nil {
return
}
if err = svr.CanalCheckToken(v.AppName, v.Env, v.Zone, v.Token); err != nil {
res["message"] = "未找到数据"
c.JSONMap(res, err)
return
}
c.JSON(svr.ConfigsByTree(v.TreeID, v.Env, v.Zone, v.Name))
}

View File

@@ -0,0 +1,136 @@
package http
import (
"net/http"
"go-common/app/admin/main/config/conf"
"go-common/app/admin/main/config/service"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/middleware/permit"
)
var (
svr *service.Service
authSrv *permit.Permit
)
// Init init config.
func Init(c *conf.Config, s *service.Service) {
svr = s
authSrv = permit.New(c.Auth)
engine := bm.DefaultServer(c.BM)
innerRouter(engine)
if err := engine.Start(); err != nil {
log.Error("engine.Start error(%v)", err)
panic(err)
}
}
// innerRouter init inner router.
func innerRouter(e *bm.Engine) {
e.Ping(ping)
b := e.Group("x/admin/config", authSrv.Verify())
d := e.Group("x/admin/config")
{
notAuth := d.Group("/")
{
notAuth.POST("home/config/update", configUpdate)
notAuth.POST("home/tag/update", tagUpdate)
notAuth.POST("canal/tag/update", canalTagUpdate)
notAuth.POST("canal/name/configs", canalNameConfigs)
notAuth.POST("canal/config/create", canalConfigCreate)
notAuth.POST("caster/envs", casterEnvs)
notAuth.GET("get/apps", getApps)
}
service := b.Group("/service")
{
service.POST("/token/set", setToken)
service.GET("/host/infos", hosts)
service.POST("/delete", clearhost)
}
app := b.Group("/app")
{
app.POST("/token/update", updateToken)
app.POST("/create", create)
app.GET("/apps", appList)
app.GET("/envs", envs)
app.GET("/nodeTree", nodeTree)
app.POST("/zone/copy", zoneCopy)
app.POST("/rename", rename)
app.POST("/status", upAppStatus)
}
bu := b.Group("/build")
{
bu.POST("/create", createBuild)
bu.POST("/tag/update", updateTag)
bu.POST("/tagid/update", updateTagID)
bu.GET("/builds", builds)
bu.GET("/build", build)
bu.POST("/delete", buildDel)
bu.POST("/hosts/force", hostsForce)
bu.POST("/clear/force", clearForce)
}
config := b.Group("/config")
{
config.POST("/create", createConfig)
config.POST("/lint", lintConfig)
config.POST("/value/update", updateConfValue)
config.GET("/app/configs", configsByAppName)
config.GET("/build/configs", configsByBuildID)
config.GET("/tag/configs", configsByTagID)
config.GET("/name/configs", configsByName)
config.GET("/names", namesByAppName)
config.GET("/configs", configs)
config.GET("/all/search", configSearchAll)
config.GET("/app/search", configSearchApp)
config.GET("/refs", configRefs)
config.GET("/value", value)
config.GET("/diff", diff)
config.POST("/delete", configDel)
config.GET("/build/infos", configBuildInfos)
}
common := b.Group("/common")
{
common.POST("/create", createComConfig)
common.POST("/value/update", updateComConfValue)
common.GET("/name/configs", comConfigsByName)
common.GET("/configs", configsByTeam)
common.GET("/names", namesByTeam)
common.GET("/value", comValue)
common.GET("/envs", envsByTeam)
common.GET("/app", appByTeam)
common.GET("/tag/push", tagPush)
}
tags := b.Group("/tag")
{
tags.POST("/create", createTag)
tags.GET("/last/tags", lastTags)
tags.GET("/build/tags", tagsByBuild)
tags.GET("/tag", tag)
tags.GET("/config/diff", tagConfigDiff)
}
apm := b.Group("/apm")
{
apm.GET("/copy", apmCopy)
}
tree := b.Group("/tree")
{
tree.GET("/update", syncTree)
}
}
}
// ping check server ok.
func ping(ctx *bm.Context) {
if err := svr.Ping(); err != nil {
log.Error("service ping error(%v)", err)
ctx.AbortWithStatus(http.StatusServiceUnavailable)
}
}
func user(c *bm.Context) (username string) {
usernameI, _ := c.Get("username")
username, _ = usernameI.(string)
return
}

View File

@@ -0,0 +1,222 @@
package http
import (
"encoding/json"
"fmt"
"strconv"
"strings"
"go-common/app/admin/main/config/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
func createTag(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.CreateTagReq)
err := c.Bind(v)
if err != nil {
return
}
user := user(c)
if _, err = svr.AuthApp(c, user, c.Request.Header.Get("Cookie"), v.TreeID); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
tag := &model.Tag{}
tag.Mark = v.Mark
tag.ConfigIDs = v.ConfigIDs
tag.Operator = user
c.JSON(nil, svr.CreateTag(tag, v.TreeID, v.Env, v.Zone))
}
func lastTags(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.LastTagsReq)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApp(c, user(c), c.Request.Header.Get("Cookie"), v.TreeID); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(svr.LastTags(v.TreeID, v.Env, v.Zone, v.Build))
}
func tagsByBuild(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.TagsByBuildReq)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApp(c, user(c), c.Request.Header.Get("Cookie"), v.TreeID); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(svr.TagsByBuild(v.AppName, v.Env, v.Zone, v.Build, v.Ps, v.Pn, v.TreeID))
}
func tag(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.TagReq)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApps(c, user(c), c.Request.Header.Get("Cookie")); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
c.JSON(svr.Tag(v.TagID))
}
func updateTag(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.UpdatetagReq)
err := c.Bind(v)
if err != nil {
return
}
if v.Force != 1 {
v.Force = 0
}
user := user(c)
if _, err = svr.AuthApp(c, user, c.Request.Header.Get("Cookie"), v.TreeID); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
if len(strings.TrimSpace(v.Build)) == 0 {
res["message"] = "build不能为空"
c.JSONMap(res, ecode.RequestErr)
return
}
tag := &model.Tag{}
tag.Operator = user
tag.Mark = v.Mark
tag.ConfigIDs = v.ConfigIDs
tag.Force = v.Force
c.JSON(nil, svr.UpdateTag(c, v.TreeID, v.Env, v.Zone, v.Build, tag))
}
func updateTagID(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.UpdateTagIDReq)
err := c.Bind(v)
if err != nil {
return
}
user := user(c)
if _, err = svr.AuthApp(c, user, c.Request.Header.Get("Cookie"), v.TreeID); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
if len(strings.TrimSpace(v.Build)) == 0 {
res["message"] = "build不能为空"
c.JSONMap(res, ecode.RequestErr)
return
}
tag := &model.Tag{}
if tag, err = svr.RollBackTag(v.TagID); err != nil {
res["message"] = "tag_id有误"
c.JSONMap(res, ecode.RequestErr)
return
}
tag.Operator = user
tag.Mark = fmt.Sprintf("回滚操作原tag_id%d", v.TagID)
c.JSON(nil, svr.UpdateTag(c, v.TreeID, v.Env, v.Zone, v.Build, tag))
}
func hostsForce(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.CreateForceReq)
err := c.Bind(v)
if err != nil {
return
}
user := user(c)
if _, err = svr.AuthApp(c, user, c.Request.Header.Get("Cookie"), v.TreeID); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
var mHosts model.MapHosts
err = json.Unmarshal([]byte(v.Hosts), &mHosts)
if err != nil {
res["message"] = "解析hosts失败"
c.JSONMap(res, err)
return
}
c.JSON(nil, svr.UpdateForce(c, v.TreeID, v.Version, v.Env, v.Zone, v.Build, user, mHosts))
}
func clearForce(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.ClearForceReq)
err := c.Bind(v)
if err != nil {
return
}
user := user(c)
if _, err = svr.AuthApp(c, user, c.Request.Header.Get("Cookie"), v.TreeID); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
var mHosts model.MapHosts
err = json.Unmarshal([]byte(v.Hosts), &mHosts)
if err != nil {
res["message"] = "解析hosts失败"
c.JSONMap(res, err)
return
}
c.JSON(nil, svr.ClearForce(c, v.TreeID, v.Env, v.Zone, v.Build, mHosts))
}
func tagConfigDiff(c *bm.Context) {
res := map[string]interface{}{}
v := new(model.TagConfigDiff)
err := c.Bind(v)
if err != nil {
return
}
if _, err = svr.AuthApp(c, user(c), c.Request.Header.Get("Cookie"), v.TreeID); err != nil {
res["message"] = "服务树权限不足"
c.JSONMap(res, err)
return
}
tag, err := svr.LastTasConfigDiff(v.TagID, v.AppID, v.BuildID)
if err != nil {
res["message"] = "版本未找到"
c.JSONMap(res, err)
return
}
var config *model.Config
var configIDS []int64
if len(tag.ConfigIDs) > 0 {
tmpIDs := strings.Split(tag.ConfigIDs, ",")
for _, vv := range tmpIDs {
id, err := strconv.ParseInt(vv, 10, 64)
if err != nil {
log.Error("strconv.ParseInt() error(%v)", err)
return
}
configIDS = append(configIDS, id)
}
config, err = svr.GetConfig(configIDS, v.Name)
if err != nil {
res["message"] = "配置文件未找到"
c.JSONMap(res, err)
return
}
}
c.JSON(config, err)
}

View File

@@ -0,0 +1,10 @@
package http
import (
bm "go-common/library/net/http/blademaster"
)
func syncTree(c *bm.Context) {
svr.SyncTree(c, user(c), c.Request.Header.Get("Cookie"))
c.JSON(nil, nil)
}