This repository has been archived by the owner on Apr 22, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathupmaster.go
156 lines (128 loc) · 3.76 KB
/
upmaster.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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package main
import (
"context"
"net/http"
"os"
"strconv"
"strings"
"sync"
"time"
"github.com/TechMinerApps/upmaster/modules/database"
"github.com/TechMinerApps/upmaster/modules/log"
"github.com/TechMinerApps/upmaster/modules/utils"
"github.com/TechMinerApps/upmaster/router"
"github.com/gin-gonic/gin"
"github.com/spf13/pflag"
"github.com/spf13/viper"
"gorm.io/gorm"
)
// UpMaster is a object of entire app
type UpMaster struct {
Config Config
DB *gorm.DB
InfluxDB database.InfluxDB
HTTPServer *http.Server
HTTPHandler *gin.Engine
viper *viper.Viper
logger log.Logger
wg *sync.WaitGroup
}
// Config has all the configuration required by UpMaster
type Config struct {
Port int
RDBMSConfig database.RDBMSConfig `mapstructure:"rdbms"`
InfluxDBConfig database.InfluxDBConfig `mapstructure:"influxdb"`
OAuthGCInterval int `mapstructure:"oauth_interval"`
}
// NewUpMaster is used to generate a UpMaster object
// no error is returned, so error must be handled within NewUpMaster
func NewUpMaster() *UpMaster {
var app UpMaster
app.setupLogger()
app.setupViper()
app.setupDB()
app.setupRouter()
app.wg = &sync.WaitGroup{}
return &app
}
// Start starts the instance of UpMaster non-blocking
// waitgroup inside UpMaster is added by 1
func (u *UpMaster) Start() {
u.HTTPServer = &http.Server{
Addr: ":" + strconv.Itoa(u.Config.Port),
Handler: u.HTTPHandler,
}
u.wg.Add(1)
go func() {
if err := u.HTTPServer.ListenAndServe(); err != http.ErrServerClosed && err != nil {
u.logger.Fatalf("HTTP Server Listen Error: %v", err)
}
}()
u.logger.Infof("UpMaster Started")
return
}
// Stop does the graceful shutdown
// waitgroup done here should reduce the waitgroup to 0
func (u *UpMaster) Stop(sig os.Signal) {
// Log the reason for stopping
u.logger.Infof("Recieved signal %s", sig.String())
// Graceful shutdown http server, with a 5 seconds timeout
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := u.HTTPServer.Shutdown(ctx); err != nil {
u.logger.Errorf("Server Closed With Error: %s", err.Error())
}
u.logger.Infof("UpMaster Shutdown")
u.wg.Done()
}
func (u *UpMaster) setupRouter() {
// Parse Config
var routerCfg router.Config
routerCfg.DB = u.DB
routerCfg.DBName = u.Config.RDBMSConfig.MySQLConfig.DBName
routerCfg.OAuthGCInterval = u.Config.OAuthGCInterval
// Create new handler
var err error
u.HTTPHandler, err = router.NewRouter(routerCfg)
if err != nil {
u.logger.Fatalf("Router Config Failed: %v", err)
}
}
func (u *UpMaster) setupDB() {
var err error
u.DB, err = database.NewRDBMSConnection(u.Config.RDBMSConfig)
if err != nil {
u.logger.Fatalf("Unable to establish RDBMS connection: %v", err)
}
u.InfluxDB, err = database.NewInfluxDBConnection(u.Config.InfluxDBConfig)
if err != nil {
u.logger.Fatalf("Unable to establish InfluxDB connection: %v", err)
}
}
func (u *UpMaster) setupViper() {
u.viper = viper.New()
pflag.String("config", "config", "config file name")
pflag.Parse()
u.viper.BindPFlags(pflag.CommandLine)
if u.viper.IsSet("config") {
u.viper.SetConfigFile(u.viper.GetString("config"))
} else {
u.viper.SetConfigName("config")
u.viper.SetConfigType("yaml")
u.viper.AddConfigPath(utils.AbsPath(""))
u.viper.AddConfigPath("/etc/upmaster")
}
u.viper.SetEnvPrefix("UPMASTER")
u.viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
u.viper.AutomaticEnv()
if err := u.viper.ReadInConfig(); err != nil {
// Used logger here, so setupLogger before setupViper
u.logger.Fatalf("Unable to read in config: %v", err)
}
if err := u.viper.Unmarshal(&u.Config); err != nil {
u.logger.Fatalf("Unable to decode into struct: %v", err)
}
}
func (u *UpMaster) setupLogger() {
u.logger = log.NewLogger()
}