3 Star 2 Fork 0

info-superbahn-ict / superbahn

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
resources.go 28.71 KB
一键复制 编辑 原始数据 按行查看 历史
xjk 提交于 2022-03-14 09:43 . SERVE update
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921
package supbres
import (
"context"
"crypto/rand"
"fmt"
"gitee.com/info-superbahn-ict/superbahn/pkg/supbmanager/v3_test/supb-modules/supbres/applications"
m2 "gitee.com/info-superbahn-ict/superbahn/pkg/supbmanager/v3_test/supb-modules/supbres/applications/model"
"gitee.com/info-superbahn-ict/superbahn/pkg/supbmanager/v3_test/supb-modules/supbres/assumes"
"gitee.com/info-superbahn-ict/superbahn/pkg/supbmanager/v3_test/supb-modules/supbres/compose"
"gitee.com/info-superbahn-ict/superbahn/pkg/supbmanager/v3_test/supb-modules/supbres/status"
"gitee.com/info-superbahn-ict/superbahn/pkg/supbmanager/v3_test/supb-modules/supbres/strategies"
m1 "gitee.com/info-superbahn-ict/superbahn/pkg/supbmanager/v3_test/supb-modules/supbres/strategies/model"
"gitee.com/info-superbahn-ict/superbahn/pkg/supbmanager/v3_test/supb-modules/supbres/syncer"
"gitee.com/info-superbahn-ict/superbahn/pkg/supbmanager/v3_test/supb-modules/supbres/types"
"gitee.com/info-superbahn-ict/superbahn/pkg/supbmanager/v3_test/supb-modules/supbrunner"
"gitee.com/info-superbahn-ict/superbahn/pkg/supbmanager/v3_test/supb-modules/supbspg"
"gitee.com/info-superbahn-ict/superbahn/v3_test/supbenv/log"
uuid "github.com/satori/go.uuid"
"github.com/spf13/pflag"
"github.com/spf13/viper"
"strings"
)
type SupbResources struct {
ctx context.Context
prefix string
appMgr *applications.SupbApplications
strategyMgr *strategies.SupbStrategies
resSyncer *syncer.SyncMod
spg *supbspg.SupbSponge
runner *supbrunner.SupbRunner
logger log.Logger
debugMod bool
}
func NewSupbResManager(ctx context.Context, prefix string) *SupbResources {
return &SupbResources{
ctx: ctx,
prefix: prefix,
appMgr: applications.NewSupbAppManager(),
strategyMgr: strategies.NewSupbResManager(),
resSyncer: syncer.NewSyncMod(ctx, strings.Join([]string{prefix, "syncer"}, ".")),
logger: log.NewLogger(prefix),
}
}
func (r *SupbResources) StrategiesManager() *strategies.SupbStrategies {
return r.strategyMgr
}
func (r *SupbResources) ApplicationsManager() *applications.SupbApplications {
return r.appMgr
}
func (r *SupbResources) InitFlags(flags *pflag.FlagSet) {
flags.Bool(r.prefix+".debug",false,"")
}
func (r *SupbResources) ViperConfig(viper *viper.Viper) {
}
func (r *SupbResources) InitViper(viper *viper.Viper) {
r.debugMod = viper.GetBool(r.prefix+".debug")
}
func (r *SupbResources) OptionConfig(opts ...option) {
for _, apply := range opts {
apply(r)
}
}
func (r *SupbResources) Initialize(opts ...option) {
for _, apply := range opts {
apply(r)
}
r.logger.Infof("%v initialized", r.prefix)
r.resSyncer.Initialize(syncer.WithStrategyManager(r.strategyMgr),
syncer.WithAppManager(r.appMgr))
r.examples()
}
func (r *SupbResources) Close() error {
r.logger.Infof("%v closed", r.prefix)
return nil
}
func (r *SupbResources) RunStaticStrategies(strategyKey, strategyName string, links map[string]string) (*m1.SupbStrategyBaseInfo, error) {
sst, err := r.strategyMgr.GetStrategies(types.StaticStrategy, types.SupbStrategyKey(strategyKey))
if err != nil {
return nil, fmt.Errorf("get static strategies %v", err)
}
ams := assumes.NewAssumes()
sst.StrategyKeyParent = sst.StrategyKey
randBytes := make([]byte, 5)
_, _ = rand.Read(randBytes)
sst.StrategyKey = types.SupbStrategyKey(fmt.Sprintf("%v_%x",sst.StrategyKeyParent, randBytes))
sst.StrategyType = types.DynamicStrategy
sst.StrategyStatus = status.StrategyReady
sst.StrategyName = strategyName
//sst.StrategyContainerNamePrefix = containerName
for _, v := range sst.StrategyContainers {
v.Guid = uuid.NewV4().String()
randBytes := make([]byte, 4)
_, _ = rand.Read(randBytes)
v.Name = sst.StrategyContainerNamePrefix + fmt.Sprintf("_%x", randBytes)
v.Status = "ready"
}
for appKey, appType := range links {
app, err := r.appMgr.GetApplication(appType, types.SupbApplicationKey(appKey))
if err != nil {
ams.Cancel()
return nil, fmt.Errorf("%v", err)
}
if ass, err := r.appMgr.LinkControllerAssume(app.ApplicationType, app.ApplicationKey, sst.StrategyKey, &m2.ApplicationController{
StrategyLevel: sst.StrategyLevel,
StrategyKey: sst.StrategyKey,
StrategyStatus: sst.StrategyStatus,
StrategyTypes: sst.StrategyType,
}); err != nil {
ams.Cancel()
return nil, fmt.Errorf("link app to strategy %v", err)
} else {
ams.AddAssume(ass)
}
sst.StrategySlaves[app.ApplicationKey] = &m1.StrategySlave{
SlaveKey: app.ApplicationKey,
SlaveLevel: app.ApplicationLevel,
SlaveTypes: app.ApplicationType,
SlaveStatus: app.ApplicationStatus,
}
}
//for _, slave := range sst.StrategySlaves {
// if app, err := r.appMgr.GetApplication(slave.SlaveTypes, slave.SlaveKey); err != nil {
// ams.Cancel()
// return nil, fmt.Errorf("slave not found")
// } else {
// // 查看应用有没有绑定静态策略
// if _, ok := app.ApplicationStaticStrategies[sst.StrategyKeyParent]; !ok {
// ams.Cancel()
// return nil, fmt.Errorf("link is incomplete")
// }
//
// // 查看应用动态策略是否冲突
// conflict := false
// for _, ctl := range app.ApplicationDynamicStrategies {
// if ctl.StrategyLevel == m1.LevelRead {
// continue
// }
//
// if sst.StrategyLevel == ctl.StrategyLevel {
// conflict = true
// break
// }
// }
// if conflict {
// r.logger.Warnf("application link conflict auto, cancel link")
// delete(sst.StrategySlaves, slave.SlaveKey)
// continue
// }
//
// r.resSyncer.CreateLinkSyncAssume(app.ApplicationType, app.ApplicationKey, sst.StrategyType, sst.StrategyKey)
// //// 动态策略不冲突则继续
// //app.ApplicationDynamicStrategies[sst.StrategyKey] = &m2.ApplicationController{
// // StrategyKey: sst.StrategyKey,
// // StrategyTypes: sst.StrategyType,
// // StrategyLevel: sst.StrategyLevel,
// // StrategyStatus: sst.StrategyStatus,
// //}
// //
// //if ass, err := r.appMgr.PutApplicationsAssume(app.ApplicationType, app); err != nil {
// // ams.Cancel()
// // return nil, fmt.Errorf("ams put application %v", err)
// //} else {
// // ams.AddAssume(ass)
// //}
// }
//}
// 启动策略
if !r.debugMod {
for _, v := range sst.StrategyContainers {
v.EnvsKey["ETCD_KEY"] = string(sst.StrategyKey)
v.EnvsKey["RPC_GUID"] = string(sst.StrategyKey)
//v.Tags = append(v.Tags, )
info, err := r.runner.Run(r.spg.GetAgentGuid(v), v)
if err != nil {
ams.Cancel()
return nil, fmt.Errorf("running compose %v", err)
}
v.Cid = info.CID
v.Guid = info.Guid
v.Name = info.ContainerName
}
}
// 存储策略
if ass, err := r.strategyMgr.PutStrategiesAssume(types.DynamicStrategy, sst.DeepCopy()); err != nil {
ams.Cancel()
return nil, fmt.Errorf("ams put strategy %v", err)
} else {
sst.StrategyVersion = ass.Done()
}
// 执行
ams.Done()
for appKey, appType := range links {
r.resSyncer.CreateLinkSyncAssume(appType, types.SupbApplicationKey(appKey), sst.StrategyType, sst.StrategyKey)
}
r.resSyncer.StrategyPutInformer(sst.DeepCopy())
return sst.DeepCopy(), nil
}
func (r *SupbResources) RunStaticApplication(applicationKey, appName string, links map[string]string) (*m2.SupbApplicationBaseInfo, error) {
app, err := r.appMgr.GetApplication(types.StaticApplication, types.SupbApplicationKey(applicationKey))
if err != nil {
return nil, fmt.Errorf("%v", err)
}
ams := assumes.NewAssumes()
app.ApplicationKeyParent = app.ApplicationKey
randBytes := make([]byte, 5)
_, _ = rand.Read(randBytes)
app.ApplicationKey = types.SupbApplicationKey(fmt.Sprintf("%v_%x",app.ApplicationKeyParent, randBytes))
app.ApplicationStatus = status.ApplicationReady
app.ApplicationType = types.DynamicApplication
app.ApplicationName = appName
//app.ApplicationContainerNamePrefix = appContainName
for _, v := range app.ApplicationContainers {
v.Guid = uuid.NewV4().String()
randBytes := make([]byte, 4)
_, _ = rand.Read(randBytes)
v.Name = app.ApplicationContainerNamePrefix + fmt.Sprintf("_%x", randBytes)
v.Status = "ready"
}
for strategyKey, strategyType := range links {
st, err := r.strategyMgr.GetStrategies(strategyType, types.SupbStrategyKey(strategyKey))
if err != nil {
ams.Cancel()
return nil, fmt.Errorf("%v", err)
}
switch strategyType {
case types.StaticStrategy:
app.ApplicationStaticStrategies[st.StrategyKey] = &m2.ApplicationController{
StrategyLevel: st.StrategyLevel,
StrategyKey: st.StrategyKey,
StrategyStatus: st.StrategyStatus,
StrategyTypes: st.StrategyType,
}
case types.DynamicStrategy:
app.ApplicationDynamicStrategies[st.StrategyKey] = &m2.ApplicationController{
StrategyLevel: st.StrategyLevel,
StrategyKey: st.StrategyKey,
StrategyStatus: st.StrategyStatus,
StrategyTypes: st.StrategyType,
}
}
if ass, err := r.strategyMgr.LinkSlaveAssume(st.StrategyType, st.StrategyKey, app.ApplicationKey, &m1.StrategySlave{
SlaveKey: app.ApplicationKey,
SlaveLevel: app.ApplicationLevel,
SlaveTypes: app.ApplicationType,
SlaveStatus: app.ApplicationStatus,
}); err != nil {
ams.Cancel()
return nil, fmt.Errorf("link strategy to app %v", err)
} else {
ams.AddAssume(ass)
}
}
//for _, strategyController := range app.ApplicationStaticStrategies {
// if st, err := r.strategyMgr.GetStrategies(strategyController.StrategyTypes, strategyController.StrategyKey); err != nil {
// ams.Cancel()
// return nil, fmt.Errorf("contorller not fount")
// } else {
// // 是否连接静态策略
// if _, ok := st.StrategySlaves[app.ApplicationKeyParent]; !ok {
// ams.Cancel()
// return nil, fmt.Errorf("link is incomplete")
// }
// // 生成连接动态策略
// r.resSyncer.CreateLinkSyncAssume(app.ApplicationType, app.ApplicationKey, st.StrategyType, st.StrategyKey)
// }
//}
//
//for _, strategyController := range app.ApplicationDynamicStrategies {
// if st, err := r.strategyMgr.GetStrategies(strategyController.StrategyTypes, strategyController.StrategyKey); err != nil {
// ams.Cancel()
// return nil, fmt.Errorf("contorller not fount")
// } else {
// // 是否连接静态策略
// if _, ok := st.StrategySlaves[app.ApplicationKeyParent]; !ok {
// ams.Cancel()
// return nil, fmt.Errorf("link is incomplete")
// }
//
// r.resSyncer.CreateLinkSyncAssume(app.ApplicationType, app.ApplicationKey, st.StrategyType, st.StrategyKey)
// }
//}
// 启动应用
if !r.debugMod {
//if len(app.ApplicationContainers) > 1 {
// if strings.Contains(string(app.ApplicationKey),"supb.application.test.car") {
//
// var info *compose.RunningBaseInfo
//
// for _,v := range app.ApplicationContainers {
// if strings.Contains(v.AppKey,"supb.application.test.car.darknet") {
// guid := r.spg.GetAgentGuid(v)
// r.logger.Infof("scheduler to %v",guid)
//
// info, err = r.runner.Run(guid, v)
// if err != nil {
// ams.Cancel()
// return nil, fmt.Errorf("running compose %v", err)
// }
// v.Cid = info.CID
// v.Guid = info.Guid
// v.Name = info.ContainerName
// r.logger.Infof("run %v ok return %v",v.AppKey,info.CID)
// }
// }
//
// for _,v := range app.ApplicationContainers {
// if strings.Contains(v.AppKey,"supb.application.test.car.app") {
// guid := r.spg.GetAgentGuid(v)
// r.logger.Infof("scheduler to %v",guid)
//
// if info != nil {
// v.EnvsKey["DARK_NET_HOST"] = info.Host
// }
//
// info, err = r.runner.Run(guid, v)
// if err != nil {
// ams.Cancel()
// return nil, fmt.Errorf("running compose %v", err)
// }
// v.Cid = info.CID
// v.Guid = info.Guid
// v.Name = info.ContainerName
// r.logger.Infof("run %v ok return %v",v.AppKey,info.CID)
// }
//
// }
//
// for _,v := range app.ApplicationContainers {
// //v.EnvsKey["DARK_NET_HOST"] = info.Host
// if strings.Contains(v.AppKey,"supb.application.test.car.frontend") {
// //v.EnvsKey["CAR_PATH"] = info.Host + ":10039"
// guid := r.spg.GetAgentGuid(v)
// r.logger.Infof("scheduler to %v",guid)
//
// info, err = r.runner.Run(guid, v)
// if err != nil {
// ams.Cancel()
// return nil, fmt.Errorf("running compose %v", err)
// }
// v.Cid = info.CID
// v.Guid = info.Guid
// v.Name = info.ContainerName
// r.logger.Infof("run %v ok return %v",v.AppKey,info.CID)
// app.ApplicationTags = append(app.ApplicationTags, types.Tag{
// Key: "URL",
// Type: "string",
// Value: "http://"+info.Host+":10041/car_war/",
// })
// }
//
// }
//
// } else {
// for _, v := range app.ApplicationContainers {
// guid := r.spg.GetAgentGuid(v)
// r.logger.Infof("scheduler to %v",guid)
// info, err := r.runner.Run(guid, v)
// if err != nil {
// ams.Cancel()
// return nil, fmt.Errorf("running compose %v", err)
// }
// v.Cid = info.CID
// v.Guid = info.Guid
// v.Name = info.ContainerName
// }
// }
//
// //for _,v := range clist {
// // r.logger.Infof("clist %v", v)
// //}
// //r.logger.Infof("Map %v",cmap)
//
//}
if strings.Contains(string(app.ApplicationKey),"supb.application.gitlab.runner"){
var info *compose.RunningBaseInfo
for _,v := range app.ApplicationContainers {
if strings.Contains(v.AppKey,"supb.application.gitlab.runner.gitlab_runner") {
guid := r.spg.GetAgentGuid(v)
r.logger.Infof("scheduler to %v",guid)
if info != nil {
v.EnvsKey["DARK_NET_HOST"] = info.Host
}
info, err = r.runner.Run(guid, v)
if err != nil {
ams.Cancel()
return nil, fmt.Errorf("running compose %v", err)
}
//赋值参数还需要修改
v.Cid = info.CID
v.Guid = info.Guid
v.Name = info.ContainerName
r.logger.Infof("run %v ok return %v",v.AppKey,info.CID)
}
}
} else {
for _, v := range app.ApplicationContainers {
info, err := r.runner.Run(r.spg.GetAgentGuid(v), v)
if err != nil {
ams.Cancel()
return nil, fmt.Errorf("running compose %v", err)
}
v.Cid = info.CID
v.Guid = info.Guid
v.Name = info.ContainerName
}
}
}
//app.ApplicationContainerId = info.CID
//app.ApplicationGuid = info.Guid
//app.ApplicationContainerNamePrefix = info.ContainerName
// 存储策略
if ass, err := r.appMgr.PutApplicationsAssume(types.DynamicApplication, app.DeepCopy()); err != nil {
ams.Cancel()
return nil, fmt.Errorf("ams put strategy %v", err)
} else {
app.ApplicationVersion = ass.Done()
}
// 执行
ams.Done()
for strategyKey, strategyType := range links {
r.resSyncer.CreateLinkSyncAssume(app.ApplicationType, app.ApplicationKey, strategyType, types.SupbStrategyKey(strategyKey))
}
r.resSyncer.ApplicationPutInformer(app.DeepCopy())
return app.DeepCopy(), nil
}
func (r *SupbResources) GetStrategy(strategyTypes, strategyKey string) (*m1.SupbStrategyBaseInfo, error) {
return r.strategyMgr.GetStrategies(strategyTypes, types.SupbStrategyKey(strategyKey))
}
func (r *SupbResources) ListStrategies(strategyTypes string) ([]*m1.SupbStrategyBaseInfo, error) {
return r.strategyMgr.ListStrategies(strategyTypes)
}
func (r *SupbResources) GetApplication(appTypes, appKey string) (*m2.SupbApplicationBaseInfo, error) {
return r.appMgr.GetApplication(appTypes, types.SupbApplicationKey(appKey))
}
func (r *SupbResources) ListApplications(appTypes string) ([]*m2.SupbApplicationBaseInfo, error) {
return r.appMgr.ListApplications(appTypes)
}
func (r *SupbResources) RemoveDynamicStrategy(strategyKey string) (*m1.SupbStrategyBaseInfo, error) {
st, err := r.strategyMgr.GetStrategies(types.DynamicStrategy, types.SupbStrategyKey(strategyKey))
if err != nil {
return nil, fmt.Errorf("get dynamic strategy %v", err)
}
// 正式远端移除策略
if !r.debugMod {
for _, v := range st.StrategyContainers {
err = r.runner.Remove(r.spg.GetContainerGuid(v), v)
if err != nil {
return nil, fmt.Errorf("stop compose %v", err)
}
}
}
// 假定本地移除策略
if ass, err := r.strategyMgr.RemoveStrategiesAssume(types.DynamicStrategy, st.StrategyKey); err != nil {
return nil, fmt.Errorf("ams remove dynamic strategies %v", err)
} else {
st.StrategyVersion = ass.Done()
}
// 正式本地移除和通知应用
r.resSyncer.StrategyDelInformer(st.DeepCopy())
return st.DeepCopy(), nil
}
func (r *SupbResources) StopDynamicStrategy(strategyKey string) (*m1.SupbStrategyBaseInfo, error) {
st, err := r.strategyMgr.GetStrategies(types.DynamicStrategy, types.SupbStrategyKey(strategyKey))
if err != nil {
return nil, fmt.Errorf("get dynamic strategy %v", err)
}
// 正式远端停止策略
if !r.debugMod {
for _, v := range st.StrategyContainers {
err = r.runner.Stop(r.spg.GetContainerGuid(v), v)
if err != nil {
return nil, fmt.Errorf("stop compose %v", err)
}
}
}
// 假定本地更新状态
st.StrategyStatus = status.StrategyNotReady
if ass, err := r.strategyMgr.PutStrategiesAssume(types.DynamicStrategy, st.DeepCopy()); err != nil {
return nil, fmt.Errorf("ams remove dynamic strategies %v", err)
} else {
st.StrategyVersion = ass.Done()
}
// 正式本地停止和通知应用
r.resSyncer.StrategyPutInformer(st.DeepCopy())
return st.DeepCopy(), nil
}
func (r *SupbResources) ReStartDynamicStrategy(strategyKey string) (*m1.SupbStrategyBaseInfo, error) {
st, err := r.strategyMgr.GetStrategies(types.DynamicStrategy, types.SupbStrategyKey(strategyKey))
if err != nil {
return nil, fmt.Errorf("get dynamic strategy %v", err)
}
// 正式远端停止策略
if !r.debugMod {
for _, v := range st.StrategyContainers {
err = r.runner.Restart(r.spg.GetContainerGuid(v), v)
if err != nil {
return nil, fmt.Errorf("running compose %v", err)
}
}
}
st.StrategyStatus = status.StrategyReady
if ass, err := r.strategyMgr.PutStrategiesAssume(types.DynamicStrategy, st.DeepCopy()); err != nil {
return nil, fmt.Errorf("remove dynamic strategies %v", err)
} else {
st.StrategyVersion = ass.Done()
}
// 正式本地停止和通知应用
r.resSyncer.StrategyPutInformer(st.DeepCopy())
return st.DeepCopy(), nil
}
func (r *SupbResources) RemoveStaticStrategy(strategyKey string) (*m1.SupbStrategyBaseInfo, error) {
st, err := r.strategyMgr.GetStrategies(types.StaticStrategy, types.SupbStrategyKey(strategyKey))
if err != nil {
return nil, fmt.Errorf("get dynamic strategy %v", err)
}
// 假定本地移除策略
if ass, err := r.strategyMgr.RemoveStrategiesAssume(types.StaticStrategy, st.StrategyKey); err != nil {
return nil, fmt.Errorf("ams remove dynamic strategies %v", err)
} else {
st.StrategyVersion = ass.Done()
}
r.resSyncer.StrategyDelInformer(st.DeepCopy())
return st.DeepCopy(), nil
}
func (r *SupbResources) RemoveDynamicApplication(applicationKey string) (*m2.SupbApplicationBaseInfo, error) {
app, err := r.appMgr.GetApplication(types.DynamicApplication, types.SupbApplicationKey(applicationKey))
if err != nil {
return nil, fmt.Errorf("get dynamic application %v", err)
}
// 正式远端移除应用
if !r.debugMod {
for _, v := range app.ApplicationContainers {
err = r.runner.Remove(r.spg.GetContainerGuid(v), v)
if err != nil {
return nil, fmt.Errorf("running compose %v", err)
}
}
}
// 假定本地移除应用
if ass, err := r.appMgr.RemoveApplicationAssume(types.DynamicStrategy, app.ApplicationKey); err != nil {
return nil, fmt.Errorf("ams remove dynamic strategies %v", err)
} else {
app.ApplicationVersion = ass.Done()
}
// 正式本地移除和通知应用
r.resSyncer.ApplicationDelInformer(app.DeepCopy())
return app.DeepCopy(), nil
}
func (r *SupbResources) StopDynamicApplication(applicationKey string) (*m2.SupbApplicationBaseInfo, error) {
app, err := r.appMgr.GetApplication(types.DynamicApplication, types.SupbApplicationKey(applicationKey))
if err != nil {
return nil, fmt.Errorf("get dynamic strategy %v", err)
}
// 正式远端停止应用
if !r.debugMod {
for _, v := range app.ApplicationContainers {
err = r.runner.Stop(r.spg.GetContainerGuid(v), v)
if err != nil {
return nil, fmt.Errorf("running compose %v", err)
}
}
}
// 假定本地更新状态
app.ApplicationStatus = status.ApplicationNotReady
if ass, err := r.appMgr.PutApplicationsAssume(types.DynamicApplication, app); err != nil {
return nil, fmt.Errorf("ams remove dynamic strategies %v", err)
} else {
app.ApplicationVersion = ass.Done()
}
// 正式本地停止和通知策略
r.resSyncer.ApplicationPutInformer(app)
return app.DeepCopy(), nil
}
func (r *SupbResources) ReStartDynamicApplication(applicationKey string) (*m2.SupbApplicationBaseInfo, error) {
app, err := r.appMgr.GetApplication(types.DynamicApplication, types.SupbApplicationKey(applicationKey))
if err != nil {
return nil, fmt.Errorf("get dynamic strategy %v", err)
}
// 正式远端停止应用
if !r.debugMod {
for _, v := range app.ApplicationContainers {
err = r.runner.Restart(r.spg.GetContainerGuid(v), v)
if err != nil {
return nil, fmt.Errorf("running compose %v", err)
}
}
}
// 假定本地更新状态
app.ApplicationStatus = status.ApplicationReady
if ass, err := r.appMgr.PutApplicationsAssume(types.DynamicApplication, app); err != nil {
return nil, fmt.Errorf("ams remove dynamic strategies %v", err)
} else {
app.ApplicationVersion = ass.Done()
}
// 正式本地停止和通知策略
r.resSyncer.ApplicationPutInformer(app.DeepCopy())
return app.DeepCopy(), nil
}
func (r *SupbResources) RemoveStaticApplication(applicationKey string) (*m2.SupbApplicationBaseInfo, error) {
app, err := r.appMgr.GetApplication(types.StaticApplication, types.SupbApplicationKey(applicationKey))
if err != nil {
return nil, fmt.Errorf("get dynamic application %v", err)
}
// 假定本地移除应用
if ass, err := r.appMgr.RemoveApplicationAssume(types.StaticStrategy, app.ApplicationKey); err != nil {
return nil, fmt.Errorf("ams remove dynamic strategies %v", err)
} else {
app.ApplicationVersion = ass.Done()
}
r.resSyncer.ApplicationDelInformer(app.DeepCopy())
return app.DeepCopy(), nil
}
func (r *SupbResources) PutStrategy(strategyTypes string, strategy *m1.SupbStrategyBaseInfo) (*m1.SupbStrategyBaseInfo, error) {
// check
//st, err := r.strategyMgr.GetStrategies(strategyTypes, strategy.StrategyKey)
//if err != nil && !errors.Is(err, types.StrategyIsNilError) {
// return err
//}
// 存在需要check
switch strategyTypes {
case types.StaticStrategy:
if err := m1.ValidateStaticStrategy(strategy); err != nil {
return nil, fmt.Errorf("validate %v", err)
}
case types.DynamicStrategy:
if err := m1.ValidateDynamicStrategy(strategy); err != nil {
return nil, fmt.Errorf("validate %v", err)
}
}
// put
ass, err := r.strategyMgr.PutStrategiesAssume(strategyTypes, strategy.DeepCopy())
if err != nil {
return nil, err
}
//// 是否新增了连接
//for slaveKey, slave := range strategy.StrategySlaves {
// if _, ok := st.StrategySlaves[slaveKey]; !ok {
// if _, err := r.resSyncer.CreateLinkSync(slave.SlaveTypes, slave.SlaveKey, strategy.StrategyType, strategy.StrategyKey); err != nil {
// ass.Cancel()
// return fmt.Errorf("create link %v", err)
// }
// }
//}
strategy.StrategyVersion = ass.Done()
r.resSyncer.StrategyPutInformer(strategy.DeepCopy())
return strategy, nil
}
func (r *SupbResources) PutApplication(appTypes string, application *m2.SupbApplicationBaseInfo) (*m2.SupbApplicationBaseInfo, error) {
//app, err := r.appMgr.GetApplication(appTypes, app.ApplicationKey)
//if err != nil && !errors.Is(err, types.ApplicationIsNilError) {
// return err
//}
switch appTypes {
case types.StaticApplication:
if err := m2.ValidateStaticApplication(application); err != nil {
return nil, fmt.Errorf("validate %v", err)
}
case types.DynamicApplication:
if err := m2.ValidateDynamicApplication(application); err != nil {
return nil, fmt.Errorf("validate %v", err)
}
}
// put
ass, err := r.appMgr.PutApplicationsAssume(appTypes, application.DeepCopy())
if err != nil {
return nil, err
}
//// 是否新增了连接
//for _, st := range application.ApplicationStaticStrategies {
// if _, err := r.resSyncer.CreateLinkSync(application.ApplicationType, application.ApplicationKey, st.StrategyTypes, st.StrategyKey); err != nil {
// ass.Cancel()
// return fmt.Errorf("create link %v", err)
// }
//}
//
//for _, st := range application.ApplicationDynamicStrategies {
// if _, err := r.resSyncer.CreateLinkSync(application.ApplicationType, application.ApplicationKey, st.StrategyTypes, st.StrategyKey); err != nil {
// ass.Cancel()
// return fmt.Errorf("create link %v", err)
// }
//}
application.ApplicationVersion = ass.Done()
r.resSyncer.ApplicationPutInformer(application.DeepCopy())
return application, nil
}
func (r *SupbResources) Link(appType, appKey string, strategyType, strategyKey string) error {
app, err := r.appMgr.GetApplication(appType, types.SupbApplicationKey(appKey))
if err != nil {
return fmt.Errorf("%v", err)
}
st, err := r.strategyMgr.GetStrategies(strategyType, types.SupbStrategyKey(strategyKey))
if err != nil {
return fmt.Errorf("get dynamic strategy %v", err)
}
ams := assumes.NewAssumes()
if ass, err := r.appMgr.LinkControllerAssume(app.ApplicationType, app.ApplicationKey, st.StrategyKey, &m2.ApplicationController{
StrategyLevel: st.StrategyLevel,
StrategyKey: st.StrategyKey,
StrategyStatus: st.StrategyStatus,
StrategyTypes: strategyType,
}); err != nil {
ams.Cancel()
return fmt.Errorf("link app to strategy %v", err)
} else {
ams.AddAssume(ass)
}
if ass, err := r.strategyMgr.LinkSlaveAssume(st.StrategyType, st.StrategyKey, app.ApplicationKey, &m1.StrategySlave{
SlaveKey: app.ApplicationKey,
SlaveLevel: app.ApplicationLevel,
SlaveTypes: app.ApplicationType,
SlaveStatus: app.ApplicationStatus,
}); err != nil {
ams.Cancel()
return fmt.Errorf("link strategy to app %v", err)
} else {
ams.AddAssume(ass)
}
ams.Done()
r.resSyncer.CreateLinkSyncAssume(app.ApplicationType, app.ApplicationKey, st.StrategyType, st.StrategyKey)
return nil
}
func (r *SupbResources) UnLink(appType, appKey string, strategyType, strategyKey string) error {
st, err := r.strategyMgr.GetStrategies(strategyType, types.SupbStrategyKey(strategyKey))
if err != nil {
return fmt.Errorf("get dynamic strategy %v", err)
}
app, err := r.appMgr.GetApplication(appType, types.SupbApplicationKey(appKey))
if err != nil {
return fmt.Errorf("get dynamic strategy %v", err)
}
ams := assumes.NewAssumes()
if ass, err := r.appMgr.UnLinkControllerAssume(app.ApplicationType, app.ApplicationKey, st.StrategyType, st.StrategyKey); err != nil {
ams.Cancel()
return fmt.Errorf("%v", err)
} else {
ams.AddAssume(ass)
}
if ass, err := r.strategyMgr.UnLinkSlaveAssume(st.StrategyType, st.StrategyKey, app.ApplicationKey); err != nil {
ams.Cancel()
return fmt.Errorf("%v", err)
} else {
ams.AddAssume(ass)
}
ams.Done()
return nil
}
func (r *SupbResources) AddStrategy(strategy *m1.SupbStrategyBaseInfo) (*m1.SupbStrategyBaseInfo, error) {
// 存在需要check
strategy.StrategyStatus = status.StrategyNotReady
strategy.StrategyKey = types.SupbStrategyKey(uuid.NewV4().String())
strategy.StrategyKeyParent = strategy.StrategyKey
strategy.StrategyType = types.StaticStrategy
if err := m1.ValidateStaticStrategy(strategy); err != nil {
return nil, fmt.Errorf("validate %v", err)
}
if err := m1.MarshallCompose(strategy); err != nil {
return nil, fmt.Errorf("%v", err)
}
// put
ass, err := r.strategyMgr.PutStrategiesAssume(types.StaticStrategy, strategy.DeepCopy())
if err != nil {
return nil, err
}
// 是存在连接
//for _, slave := range strategy.StrategySlaves {
// if _, err := r.resSyncer.CreateLinkSync(slave.SlaveTypes, slave.SlaveKey, strategy.StrategyType, strategy.StrategyKey); err != nil {
// ass.Cancel()
// return fmt.Errorf("create link %v", err)
// }
//}
strategy.StrategyVersion = ass.Done()
r.resSyncer.StrategyPutInformer(strategy.DeepCopy())
return strategy, nil
}
func (r *SupbResources) AddApplication(app *m2.SupbApplicationBaseInfo) (*m2.SupbApplicationBaseInfo, error) {
// 存在需要check
app.ApplicationStatus = status.ApplicationNotReady
app.ApplicationKey = types.SupbApplicationKey(uuid.NewV4().String())
app.ApplicationKeyParent = app.ApplicationKey
app.ApplicationType = types.StaticApplication
if err := m2.ValidateStaticApplication(app); err != nil {
return nil, fmt.Errorf("validate %v", err)
}
if err := m2.MarshallCompose(app); err != nil {
return nil, fmt.Errorf("%v", err)
}
// put
ass, err := r.appMgr.PutApplicationsAssume(types.StaticApplication, app.DeepCopy())
if err != nil {
return nil, err
}
// 是存在连接
//for _, slave := range strategy.StrategySlaves {
// if _, err := r.resSyncer.CreateLinkSync(slave.SlaveTypes, slave.SlaveKey, strategy.StrategyType, strategy.StrategyKey); err != nil {
// ass.Cancel()
// return fmt.Errorf("create link %v", err)
// }
//}
app.ApplicationVersion = ass.Done()
r.resSyncer.ApplicationPutInformer(app.DeepCopy())
return app, nil
}
Go
1
https://gitee.com/info-superbahn-ict/superbahn.git
git@gitee.com:info-superbahn-ict/superbahn.git
info-superbahn-ict
superbahn
superbahn
5fda629dab96

搜索帮助