added validate config cmd for heruvym
This commit is contained in:
parent
10001152e4
commit
4f5e84fd98
143
cmd/validator/main.go
Normal file
143
cmd/validator/main.go
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"gitea.pena/PenaSide/common/mongo"
|
||||||
|
"gitea.pena/PenaSide/common/validate"
|
||||||
|
"gitea.pena/PenaSide/heruvym/internal/initialize"
|
||||||
|
"github.com/minio/minio-go/v7"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
cfg, err := loadConfig()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("error loading config: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if cfg.HTTPUrl == "" {
|
||||||
|
log.Fatalf("error http url is empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
err = validate.ValidateMongo(cfg.ExternalCfg.Database)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("error validating mongo: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = validate.ValidateTgToken(cfg.TelegramToken)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("error validating telegram token: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if cfg.TelegramChannelID == 0 {
|
||||||
|
log.Fatalf("telegram channel id must be set")
|
||||||
|
}
|
||||||
|
|
||||||
|
err = validateRedis(cfg)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("error validating redis: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = validateS3(cfg)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("error validating s3: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func loadConfig() (initialize.Config, error) {
|
||||||
|
config := initialize.Config{
|
||||||
|
ExternalCfg: initialize.ExternalCfg{
|
||||||
|
Database: mongo.Configuration{
|
||||||
|
URL: os.Getenv("MONGO_URL"),
|
||||||
|
DatabaseName: os.Getenv("MONGO_DB_NAME"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
IsProd: envToBool(os.Getenv("IS_PROD")),
|
||||||
|
S3Endpoint: os.Getenv("S3_ENDPOINT"),
|
||||||
|
S3AccessKey: os.Getenv("S3_ACCESS_KEY"),
|
||||||
|
S3SecretKey: os.Getenv("S3_SECRET_KEY"),
|
||||||
|
S3Token: os.Getenv("S3_TOKEN"),
|
||||||
|
TelegramToken: os.Getenv("TELEGRAM_TOKEN"),
|
||||||
|
RedisHost: os.Getenv("REDIS_HOST"),
|
||||||
|
RedisPassword: os.Getenv("REDIS_PASSWORD"),
|
||||||
|
RedisDB: int(envToInt64(os.Getenv("REDIS_DB"))),
|
||||||
|
TelegramChannelID: envToInt64(os.Getenv("TELEGRAM_CHANNEL_ID")),
|
||||||
|
HTTPUrl: os.Getenv("HTTP_URL"),
|
||||||
|
}
|
||||||
|
|
||||||
|
return config, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func envToInt64(str string) int64 {
|
||||||
|
n, err := strconv.ParseInt(str, 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
func envToBool(str string) bool {
|
||||||
|
switch strings.ToLower(strings.TrimSpace(str)) {
|
||||||
|
case "1", "true":
|
||||||
|
return true
|
||||||
|
case "0", "false":
|
||||||
|
return false
|
||||||
|
default:
|
||||||
|
panic(fmt.Sprintf("invalid boolean value: %s", str))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func validateRedis(cfg initialize.Config) error {
|
||||||
|
if cfg.RedisHost == "" {
|
||||||
|
return fmt.Errorf("redis host is empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := initialize.Redis(context.TODO(), cfg)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func validateS3(cfg initialize.Config) error {
|
||||||
|
if cfg.S3Endpoint == "" {
|
||||||
|
return fmt.Errorf("s3 endpoint is empty")
|
||||||
|
}
|
||||||
|
if cfg.S3AccessKey == "" {
|
||||||
|
return fmt.Errorf("s3 access key is empty")
|
||||||
|
}
|
||||||
|
if cfg.S3SecretKey == "" {
|
||||||
|
return fmt.Errorf("s3 secret key is empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx := context.TODO()
|
||||||
|
|
||||||
|
client, err := initialize.Minio(cfg)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
bucket := "validate-test"
|
||||||
|
|
||||||
|
exist, err := client.BucketExists(ctx, bucket)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if !exist {
|
||||||
|
err := client.MakeBucket(ctx, bucket, minio.MakeBucketOptions{})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
err = client.RemoveBucket(ctx, bucket)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
41
cmd/validator/main_test.go
Normal file
41
cmd/validator/main_test.go
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"gitea.pena/PenaSide/heruvym/internal/initialize"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestLoadConfig(t *testing.T) {
|
||||||
|
envVars := map[string]string{
|
||||||
|
"MONGO_URL": "mongodb://test:test@localhost:27020/",
|
||||||
|
"MONGO_DB_NAME": "admin",
|
||||||
|
"IS_PROD": "false",
|
||||||
|
"S3Endpoint": "localhost:9000",
|
||||||
|
"S3_ACCESS_KEY": "minioadmin",
|
||||||
|
"S3_SECRET_KEY": "minioadmin",
|
||||||
|
"S3_TOKEN": "",
|
||||||
|
"REDIS_HOST": "localhost:6379",
|
||||||
|
"REDIS_PASSWORD": "admin",
|
||||||
|
"REDIS_DB": "2",
|
||||||
|
"HTTP_URL": "localhost:3000",
|
||||||
|
"TELEGRAM_TOKEN": "7127966184:AAG1steOCH4wDvHRe9QcsXJPS4dWRyRYsqg",
|
||||||
|
"TELEGRAM_CHANNEL_ID": "1001344671794",
|
||||||
|
}
|
||||||
|
|
||||||
|
for key, value := range envVars {
|
||||||
|
os.Setenv(key, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg, err := loadConfig()
|
||||||
|
assert.Nil(t, err)
|
||||||
|
|
||||||
|
fmt.Println(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestValidateS3(t *testing.T) {
|
||||||
|
err := validateS3(initialize.Config{S3Endpoint: "localhost:9000", S3AccessKey: "minioadmin", S3SecretKey: "minioadmin"})
|
||||||
|
assert.NoError(t, err)
|
||||||
|
}
|
@ -25,13 +25,13 @@ type Build struct {
|
|||||||
BuildTime int64
|
BuildTime int64
|
||||||
}
|
}
|
||||||
|
|
||||||
type InfoSvcStarted struct {}
|
type InfoSvcStarted struct{}
|
||||||
|
|
||||||
func Run(ctx context.Context, cfg initialize.Config, build Build) error {
|
func Run(ctx context.Context, cfg initialize.Config, build Build) error {
|
||||||
var logger *zap.Logger
|
var logger *zap.Logger
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
if cfg.LoggerDevMode {
|
if cfg.IsProd {
|
||||||
logger, err = zap.NewProduction(zapOptions...)
|
logger, err = zap.NewProduction(zapOptions...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -75,7 +75,7 @@ func Run(ctx context.Context, cfg initialize.Config, build Build) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
minioClient, err := initialize.Minio(ctx, cfg)
|
minioClient, err := initialize.Minio(cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("Error initializing Minio", zap.Error(err))
|
logger.Error("Error initializing Minio", zap.Error(err))
|
||||||
return err
|
return err
|
||||||
@ -108,7 +108,7 @@ func Run(ctx context.Context, cfg initialize.Config, build Build) error {
|
|||||||
Reps: repositories,
|
Reps: repositories,
|
||||||
RedisClient: redisClient,
|
RedisClient: redisClient,
|
||||||
Notifier: tgBot,
|
Notifier: tgBot,
|
||||||
TgChatID: int64(cfg.TgChatID),
|
TgChatID: cfg.TelegramChannelID,
|
||||||
HLogger: hlogger,
|
HLogger: hlogger,
|
||||||
ZapLogger: logger,
|
ZapLogger: logger,
|
||||||
})
|
})
|
||||||
@ -121,7 +121,7 @@ func Run(ctx context.Context, cfg initialize.Config, build Build) error {
|
|||||||
})
|
})
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
if err := srv.Start(cfg.HTTPHost + ":" + cfg.HTTPPort); err != nil {
|
if err := srv.Start(cfg.HTTPUrl); err != nil {
|
||||||
logger.Error("Server startup error", zap.Error(err))
|
logger.Error("Server startup error", zap.Error(err))
|
||||||
cancel()
|
cancel()
|
||||||
}
|
}
|
||||||
|
@ -8,18 +8,21 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
LoggerDevMode bool `env:"BB_IS_PROD" envDefault:"false"`
|
IsProd bool `env:"IS_PROD" envDefault:"false"`
|
||||||
MinioEndpoint string `env:"BB_MINIO_EP" envDefault:"localhost:9000"`
|
S3Endpoint string `env:"S3_ENDPOINT" envDefault:"localhost:9000"`
|
||||||
MinioAccessKey string `env:"BB_MINIO_AK" envDefault:"minioadmin"`
|
S3AccessKey string `env:"S3_ACCESS_KEY" envDefault:"minioadmin"`
|
||||||
MinioSecretKey string `env:"BB_MINIO_SK" envDefault:"minioadmin"`
|
S3SecretKey string `env:"S3_SECRET_KEY" envDefault:"minioadmin"`
|
||||||
MinioToken string `env:"BB_MINIO_TOKEN" envDefault:""`
|
S3Token string `env:"S3_TOKEN" envDefault:""`
|
||||||
TgToken string `env:"TELEGRAM_TOKEN" envDefault:"7127966184:AAG1steOCH4wDvHRe9QcsXJPS4dWRyRYsqg"`
|
|
||||||
RedisHost string `env:"REDIS_HOST" envDefault:"localhost:6379"`
|
RedisHost string `env:"REDIS_HOST" envDefault:"localhost:6379"`
|
||||||
RedisPassword string `env:"REDIS_PASSWORD" envDefault:"admin"`
|
RedisPassword string `env:"REDIS_PASSWORD" envDefault:"admin"`
|
||||||
RedisDB int `env:"REDIS_DB" envDefault:"2"`
|
RedisDB int `env:"REDIS_DB" envDefault:"2"`
|
||||||
TgChatID int64 `env:"TELEGRAM_CHAT_ID" envDefault:"1001344671794"`
|
HTTPUrl string `env:"HTTP_URL" envDefault:"localhost:3000"`
|
||||||
HTTPHost string `env:"HTTP_HOST" envDefault:"localhost"`
|
TelegramToken string `env:"TELEGRAM_TOKEN" envDefault:"7127966184:AAG1steOCH4wDvHRe9QcsXJPS4dWRyRYsqg"`
|
||||||
HTTPPort string `env:"HTTP_PORT" envDefault:"3000"`
|
TelegramChannelID int64 `env:"TELEGRAM_CHANNEL_ID" envDefault:"1001344671794"`
|
||||||
|
ExternalCfg ExternalCfg
|
||||||
|
}
|
||||||
|
|
||||||
|
type ExternalCfg struct {
|
||||||
Database mongo.Configuration
|
Database mongo.Configuration
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,16 +1,15 @@
|
|||||||
package initialize
|
package initialize
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"github.com/minio/minio-go/v7"
|
"github.com/minio/minio-go/v7"
|
||||||
"github.com/minio/minio-go/v7/pkg/credentials"
|
"github.com/minio/minio-go/v7/pkg/credentials"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Minio(ctx context.Context, cfg Config) (*minio.Client, error) {
|
func Minio(cfg Config) (*minio.Client, error) {
|
||||||
conn, err := minio.New(cfg.MinioEndpoint,
|
conn, err := minio.New(cfg.S3Endpoint,
|
||||||
&minio.Options{
|
&minio.Options{
|
||||||
Creds: credentials.NewStaticV4(cfg.MinioAccessKey, cfg.MinioSecretKey, cfg.MinioToken),
|
Creds: credentials.NewStaticV4(cfg.S3AccessKey, cfg.S3SecretKey, cfg.S3Token),
|
||||||
Secure: false,
|
Secure: cfg.IsProd,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -12,7 +12,7 @@ func MongoDB(ctx context.Context, cfg Config) (*mongo.Database, error) {
|
|||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
mongoDeps := &mdb.ConnectDeps{
|
mongoDeps := &mdb.ConnectDeps{
|
||||||
Configuration: &cfg.Database,
|
Configuration: &cfg.ExternalCfg.Database,
|
||||||
Timeout: 10 * time.Second,
|
Timeout: 10 * time.Second,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ import (
|
|||||||
|
|
||||||
func NewTgBot(cfg Config) (*telebot.Bot, error) {
|
func NewTgBot(cfg Config) (*telebot.Bot, error) {
|
||||||
newBot, err := telebot.NewBot(telebot.Settings{
|
newBot, err := telebot.NewBot(telebot.Settings{
|
||||||
Token: cfg.TgToken,
|
Token: cfg.TelegramToken,
|
||||||
Verbose: false,
|
Verbose: false,
|
||||||
ParseMode: telebot.ModeHTML,
|
ParseMode: telebot.ModeHTML,
|
||||||
Poller: &telebot.LongPoller{
|
Poller: &telebot.LongPoller{
|
||||||
|
Loading…
Reference in New Issue
Block a user