added validate config cmd for heruvym

This commit is contained in:
Pasha 2024-12-02 15:12:52 +03:00 committed by skeris
parent 10001152e4
commit 4f5e84fd98
7 changed files with 211 additions and 25 deletions

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
}

@ -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
}
type InfoSvcStarted struct {}
type InfoSvcStarted struct{}
func Run(ctx context.Context, cfg initialize.Config, build Build) error {
var logger *zap.Logger
var err error
if cfg.LoggerDevMode {
if cfg.IsProd {
logger, err = zap.NewProduction(zapOptions...)
if err != nil {
return err
@ -75,7 +75,7 @@ func Run(ctx context.Context, cfg initialize.Config, build Build) error {
return err
}
minioClient, err := initialize.Minio(ctx, cfg)
minioClient, err := initialize.Minio(cfg)
if err != nil {
logger.Error("Error initializing Minio", zap.Error(err))
return err
@ -108,7 +108,7 @@ func Run(ctx context.Context, cfg initialize.Config, build Build) error {
Reps: repositories,
RedisClient: redisClient,
Notifier: tgBot,
TgChatID: int64(cfg.TgChatID),
TgChatID: cfg.TelegramChannelID,
HLogger: hlogger,
ZapLogger: logger,
})
@ -121,7 +121,7 @@ func Run(ctx context.Context, cfg initialize.Config, build Build) error {
})
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))
cancel()
}

@ -8,18 +8,21 @@ import (
)
type Config struct {
LoggerDevMode bool `env:"BB_IS_PROD" envDefault:"false"`
MinioEndpoint string `env:"BB_MINIO_EP" envDefault:"localhost:9000"`
MinioAccessKey string `env:"BB_MINIO_AK" envDefault:"minioadmin"`
MinioSecretKey string `env:"BB_MINIO_SK" envDefault:"minioadmin"`
MinioToken string `env:"BB_MINIO_TOKEN" envDefault:""`
TgToken string `env:"TELEGRAM_TOKEN" envDefault:"7127966184:AAG1steOCH4wDvHRe9QcsXJPS4dWRyRYsqg"`
IsProd bool `env:"IS_PROD" envDefault:"false"`
S3Endpoint string `env:"S3_ENDPOINT" envDefault:"localhost:9000"`
S3AccessKey string `env:"S3_ACCESS_KEY" envDefault:"minioadmin"`
S3SecretKey string `env:"S3_SECRET_KEY" envDefault:"minioadmin"`
S3Token string `env:"S3_TOKEN" envDefault:""`
RedisHost string `env:"REDIS_HOST" envDefault:"localhost:6379"`
RedisPassword string `env:"REDIS_PASSWORD" envDefault:"admin"`
RedisDB int `env:"REDIS_DB" envDefault:"2"`
TgChatID int64 `env:"TELEGRAM_CHAT_ID" envDefault:"1001344671794"`
HTTPHost string `env:"HTTP_HOST" envDefault:"localhost"`
HTTPPort string `env:"HTTP_PORT" envDefault:"3000"`
HTTPUrl string `env:"HTTP_URL" envDefault:"localhost:3000"`
TelegramToken string `env:"TELEGRAM_TOKEN" envDefault:"7127966184:AAG1steOCH4wDvHRe9QcsXJPS4dWRyRYsqg"`
TelegramChannelID int64 `env:"TELEGRAM_CHANNEL_ID" envDefault:"1001344671794"`
ExternalCfg ExternalCfg
}
type ExternalCfg struct {
Database mongo.Configuration
}

@ -1,16 +1,15 @@
package initialize
import (
"context"
"github.com/minio/minio-go/v7"
"github.com/minio/minio-go/v7/pkg/credentials"
)
func Minio(ctx context.Context, cfg Config) (*minio.Client, error) {
conn, err := minio.New(cfg.MinioEndpoint,
func Minio(cfg Config) (*minio.Client, error) {
conn, err := minio.New(cfg.S3Endpoint,
&minio.Options{
Creds: credentials.NewStaticV4(cfg.MinioAccessKey, cfg.MinioSecretKey, cfg.MinioToken),
Secure: false,
Creds: credentials.NewStaticV4(cfg.S3AccessKey, cfg.S3SecretKey, cfg.S3Token),
Secure: cfg.IsProd,
},
)
if err != nil {

@ -12,7 +12,7 @@ func MongoDB(ctx context.Context, cfg Config) (*mongo.Database, error) {
defer cancel()
mongoDeps := &mdb.ConnectDeps{
Configuration: &cfg.Database,
Configuration: &cfg.ExternalCfg.Database,
Timeout: 10 * time.Second,
}

@ -7,7 +7,7 @@ import (
func NewTgBot(cfg Config) (*telebot.Bot, error) {
newBot, err := telebot.NewBot(telebot.Settings{
Token: cfg.TgToken,
Token: cfg.TelegramToken,
Verbose: false,
ParseMode: telebot.ModeHTML,
Poller: &telebot.LongPoller{