123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- package service
- import (
- "bytes"
- "context"
- "encoding/json"
- "fmt"
- "strings"
- "go-common/app/admin/main/cache/conf"
- "go-common/app/admin/main/cache/dao"
- "go-common/app/admin/main/cache/model"
- "go-common/library/ecode"
- "github.com/BurntSushi/toml"
- )
- // Service struct
- type Service struct {
- c *conf.Config
- dao *dao.Dao
- opsMcs []*model.OpsCacheMemcache
- opsRds []*model.OpsCacheRedis
- }
- // New init
- func New(c *conf.Config) (s *Service) {
- s = &Service{
- c: c,
- dao: dao.New(c),
- }
- go s.loadOpsproc()
- return s
- }
- // Ping Service
- func (s *Service) Ping(c context.Context) (err error) {
- return
- }
- // Close Service
- func (s *Service) Close() {
- s.dao.Close()
- }
- func (s *Service) appids(c context.Context, cookie, appid string) (appids []string, err error) {
- msg, err := s.dao.Auth(c, cookie)
- if err != nil {
- err = ecode.AccessDenied
- return
- }
- tmp, ok := msg["token"]
- if !ok {
- err = ecode.NothingFound
- return
- }
- token, ok := tmp.(string)
- if !ok {
- err = ecode.NothingFound
- return
- }
- nodes, err := s.dao.Role(c, token)
- if err != nil {
- return
- }
- if appid == "" {
- for _, node := range nodes.Data {
- appids = append(appids, node.Path)
- }
- } else {
- for _, node := range nodes.Data {
- if appid == node.Path {
- appids = []string{appid}
- break
- }
- }
- }
- return
- }
- func (s *Service) treeid(c context.Context, cookie, appid string) (treeid int64, err error) {
- if appid == "" {
- err = ecode.AccessDenied
- return
- }
- msg, err := s.dao.Auth(c, cookie)
- if err != nil {
- err = ecode.AccessDenied
- return
- }
- tmp, ok := msg["token"]
- if !ok {
- err = ecode.NothingFound
- return
- }
- token, ok := tmp.(string)
- if !ok {
- err = ecode.NothingFound
- return
- }
- nodes, err := s.dao.Role(c, token)
- if err != nil {
- return
- }
- for _, node := range nodes.Data {
- if appid == node.Path {
- treeid = node.ID
- return
- }
- }
- return
- }
- // Clusters get clusters.
- func (s *Service) Clusters(c context.Context, req *model.ClusterReq) (resp *model.ClusterResp, err error) {
- appids, err := s.appids(c, req.Cookie, req.AppID)
- if err != nil {
- err = ecode.AccessDenied
- return
- }
- resp = new(model.ClusterResp)
- if len(appids) == 0 {
- return
- }
- if err = s.dao.DB.Where("appids in (?) AND zone=? AND type=?", appids, req.Zone, req.Type).Order("id").Offset((req.PN - 1) * req.PS).Limit(req.PS).Find(&resp.Clusters).Error; err != nil {
- return
- }
- var count int64
- s.dao.DB.Model(&model.Cluster{}).Where("appids in (?) AND zone=? AND type=?", appids, req.Zone, req.Type).Count(&count)
- resp.Total = count
- return
- }
- // AddCluster add new cluster.
- func (s *Service) AddCluster(c context.Context, req *model.AddClusterReq) (resp *model.EmpResp, err error) {
- cluster := &model.Cluster{
- Name: req.Name,
- Type: req.Type,
- AppID: req.AppID,
- Zone: req.Zone,
- HashMethod: req.HashMethod,
- HashDistribution: req.HashDistribution,
- HashTag: req.HashTag,
- DailTimeout: req.DailTimeout,
- ReadTimeout: req.ReadTimeout,
- WriteTimeout: req.WriteTimeout,
- NodeConn: req.NodeConn,
- ListenAddr: req.ListenAddr,
- ListenProto: req.ListenProto,
- PingFailLimit: req.PingFailLimit,
- PingAutoEject: req.PingAutoEject,
- }
- if req.ID == 0 {
- err = s.dao.DB.Create(cluster).Error
- } else {
- cluster.ID = req.ID
- s.dao.DB.Save(cluster)
- }
- return
- }
- // DelCluster del cluster of req id.
- func (s *Service) DelCluster(c context.Context, req *model.DelClusterReq) (resp *model.EmpResp, err error) {
- err = s.dao.DB.Exec("DELETE FROM cluster where id= ?", req.ID).Error
- if err != nil {
- return
- }
- err = s.dao.DB.Exec("DELETE FROM nodes where cid= ?", req.ID).Error
- return
- }
- // Cluster search cluster by appid or cluster name.
- func (s *Service) Cluster(c context.Context, req *model.ClusterReq) (resp []*model.Cluster, err error) {
- if req.Type != "" {
- err = s.dao.DB.Where("appids=? AND zone=? AND type=?", req.AppID, req.Zone, req.Type).Find(&resp).Error
- } else {
- err = s.dao.DB.Where("appids=? AND zone=?", req.AppID, req.Zone).Find(&resp).Error
- }
- if err != nil {
- return
- }
- for _, clu := range resp {
- err = s.dao.DB.Where("cid = ?", clu.ID).Find(&clu.Nodes).Error
- if err != nil {
- return nil, err
- }
- }
- return
- }
- // ModifyCluster add or del cluster nodes.
- func (s *Service) ModifyCluster(c context.Context, req *model.ModifyClusterReq) (resp *model.EmpResp, err error) {
- var nodes []*model.NodeDtl
- err = json.Unmarshal([]byte(req.Nodes), &nodes)
- if err != nil {
- return
- }
- var id = req.ID
- if req.Name != "" {
- var cluster = &model.Cluster{}
- err = s.dao.DB.Where("name = ?", req.Name).First(cluster).Error
- if err != nil {
- return
- }
- id = cluster.ID
- }
- if req.Action == 2 {
- var alias []string
- for _, ali := range nodes {
- alias = append(alias, ali.Alias)
- }
- //err = s.dao.DB.Delete(&nodes).Error
- err = s.dao.DB.Exec("DELETE FROM nodes WHERE alias in (?) ", strings.Join(alias, ",")).Error
- return
- } else if req.Action == 1 {
- // var nodes []*model.NodeDtl
- for _, node := range nodes {
- node.Cid = id
- err = s.dao.DB.Create(node).Error
- }
- return
- }
- return
- }
- // ClusterDtl get cluster detail about nodes info.
- func (s *Service) ClusterDtl(c context.Context, req *model.ClusterDtlReq) (resp *model.ClusterDtlResp, err error) {
- resp = new(model.ClusterDtlResp)
- err = s.dao.DB.Where("cid = ?", req.ID).Find(&resp.Nodes).Error
- // TODO(lintanghui):get node info
- return
- }
- // Toml return a toml file of cluster infos.
- func (s *Service) Toml(c context.Context, req *model.ClusterReq) (resp []byte, err error) {
- clusters, err := s.Cluster(c, req)
- if err != nil {
- return
- }
- for _, cluster := range clusters {
- for _, node := range cluster.Nodes {
- cluster.Servers = append(cluster.Servers, fmt.Sprintf("%s:%d %s", node.Addr, node.Weight, node.Alias))
- }
- }
- buf := bytes.NewBuffer(resp)
- t := struct {
- Clusters []*model.Cluster `toml:"clusters"`
- }{
- Clusters: clusters,
- }
- err = toml.NewEncoder(buf).Encode(t)
- resp = buf.Bytes()
- return
- }
|