-
Notifications
You must be signed in to change notification settings - Fork 1
/
ticker_frame.go
128 lines (103 loc) · 3.02 KB
/
ticker_frame.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// Copyright 2020 Apulis Technology Inc. All rights reserved.
package main
import (
"context"
"os"
"os/signal"
"sync"
"syscall"
"github.com/apulis/ApulisEdge/cloud/pkg/channel"
"github.com/apulis/ApulisEdge/cloud/pkg/cluster"
"github.com/apulis/ApulisEdge/cloud/pkg/database"
applicationticker "github.com/apulis/ApulisEdge/cloud/ticker/domain/application"
"github.com/apulis/ApulisEdge/cloud/ticker/domain/batchinstall"
nodeticker "github.com/apulis/ApulisEdge/cloud/ticker/domain/node"
"github.com/apulis/ApulisEdge/cloud/pkg/configs"
"github.com/apulis/ApulisEdge/cloud/pkg/loggers"
"github.com/urfave/cli/v2"
)
type CloudTicker struct {
internalApp *cli.App
flags []cli.Flag
configFile string
cloudConfig configs.EdgeCloudConfig
tickerCancelFunc context.CancelFunc
tickerCtx context.Context
clusters []configs.ClusterConfig
}
var once sync.Once
var instance *CloudTicker
func CloudTickerInstance() *CloudTicker {
once.Do(func() {
instance = &CloudTicker{
internalApp: cli.NewApp(),
}
})
return instance
}
func (app *CloudTicker) Init(appName string, appUsage string) error {
app.flags = []cli.Flag{
&cli.StringFlag{
Name: "config",
Aliases: []string{"c"},
Usage: "assign config file `PATH`",
Value: "/etc/apulisedge/cloud/cloud.yaml",
EnvVars: []string{"APULIS_EDGE_CLOUD_CONFIG"},
Destination: &app.configFile,
},
}
app.internalApp.Name = appName
app.internalApp.Usage = appUsage
app.internalApp.Flags = app.flags
app.internalApp.Action = func(c *cli.Context) error {
return app.MainLoop()
}
app.tickerCtx, app.tickerCancelFunc = context.WithCancel(context.Background())
return nil
}
func (app *CloudTicker) Run(arguments []string) error {
err := app.internalApp.Run(os.Args)
if err != nil {
return err
}
return nil
}
func (app *CloudTicker) MainLoop() error {
logger.Infof("PID = %d", os.Getpid())
// init config
app.InitConfig()
// init logger
app.InitLogger()
// init database
app.InitDatabase()
// init clusters
app.InitClusters()
// msg chan
msgChanContext := channel.ChanContextInstance()
msgChanContext.AddChannel(channel.ModuleNameContainerImage, msgChanContext.NewChannel())
// init ticker
go nodeticker.CreateNodeTickerLoop(app.tickerCtx, &app.cloudConfig)
go applicationticker.CreateApplicationTickerLoop(app.tickerCtx, &app.cloudConfig)
go batchinstall.CreateBatchInstallTicker(app.tickerCtx, &app.cloudConfig)
// quit when signal notifys
quit := make(chan os.Signal)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
select {
case <-quit:
app.tickerCancelFunc()
}
return nil
}
func (app *CloudTicker) InitLogger() {
loggers.InitLogger(&app.cloudConfig)
}
func (app *CloudTicker) InitConfig() {
logger.Infof("InitConfig, configFile path = %s", app.configFile)
configs.InitConfig(app.configFile, &app.cloudConfig)
}
func (app *CloudTicker) InitDatabase() {
database.InitDatabase(&app.cloudConfig)
}
func (app *CloudTicker) InitClusters() {
cluster.InitClusters(&app.cloudConfig)
}