146 lines
4.5 KiB
Go
146 lines
4.5 KiB
Go
package config
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"os"
|
|
"strconv"
|
|
|
|
"github.com/joho/godotenv"
|
|
"github.com/sethvargo/go-envconfig"
|
|
"github.com/wormhole-foundation/wormhole-explorer/common/client/alert"
|
|
"github.com/wormhole-foundation/wormhole-explorer/common/domain"
|
|
)
|
|
|
|
const defaultMaxHealthTimeSeconds = 60
|
|
|
|
// p2p network configuration constants.
|
|
const (
|
|
// mainnet p2p config.
|
|
MainNetP2ppNetworkID = "/wormhole/mainnet/2"
|
|
MainNetP2pBootstrap = "/dns4/wormhole-mainnet-v2-bootstrap.certus.one/udp/8999/quic/p2p/12D3KooWQp644DK27fd3d4Km3jr7gHiuJJ5ZGmy8hH4py7fP4FP7"
|
|
MainNetP2pPort uint = 8999
|
|
|
|
// testnet p2p config.
|
|
TestNetP2ppNetworkID = "/wormhole/testnet/2/1"
|
|
TestNetP2pBootstrap = "/dns4/wormhole-testnet-v2-bootstrap.certus.one/udp/8999/quic/p2p/12D3KooWAkB9ynDur1Jtoa97LBUp8RXdhzS5uHgAfdTquJbrbN7i,/dns4/t-guardian-01.nodes.stable.io/udp/8999/quic/p2p/12D3KooWCW3LGUtkCVkHZmVSZHzL3C4WRKWfqAiJPz1NR7dT9Bxh,/dns4/t-guardian-02.nodes.stable.io/udp/8999/quic/p2p/12D3KooWJXA6goBCiWM8ucjzc4jVUBSqL9Rri6UpjHbkMPErz5zK"
|
|
TestNetP2pPort uint = 8999
|
|
|
|
// devnet p2p config.
|
|
DevNetP2ppNetworkID = "/wormhole/dev"
|
|
DevNetP2pBootstrap = "/dns4/guardian-0.guardian/udp/8999/quic/p2p/12D3KooWL3XJ9EMCyZvmmGXL2LMiVBtrVa2BuESsJiXkSj7333Jw"
|
|
DevNetP2pPort uint = 8999
|
|
)
|
|
|
|
// P2pNetworkConfig config struct.
|
|
type P2pNetworkConfig struct {
|
|
Enviroment string
|
|
P2pNetworkID string
|
|
P2pBootstrap string
|
|
}
|
|
|
|
// GetP2pNetwork get p2p network config.
|
|
func GetP2pNetwork() (*P2pNetworkConfig, error) {
|
|
|
|
p2pEnviroment := os.Getenv("P2P_NETWORK")
|
|
|
|
switch p2pEnviroment {
|
|
case domain.P2pMainNet:
|
|
return &P2pNetworkConfig{domain.P2pMainNet, MainNetP2ppNetworkID, MainNetP2pBootstrap}, nil
|
|
case domain.P2pTestNet:
|
|
return &P2pNetworkConfig{domain.P2pTestNet, TestNetP2ppNetworkID, TestNetP2pBootstrap}, nil
|
|
case domain.P2pDevNet:
|
|
return &P2pNetworkConfig{domain.P2pDevNet, DevNetP2ppNetworkID, DevNetP2pBootstrap}, nil
|
|
default:
|
|
return nil, fmt.Errorf(`invalid P2P_NETWORK enviroment variable: "%s"`, p2pEnviroment)
|
|
}
|
|
}
|
|
|
|
// GetPprofEnabled get if pprof is enabled.
|
|
func GetPprofEnabled() bool {
|
|
strPprofEnable := os.Getenv("PPROF_ENABLED")
|
|
pprofEnabled, _ := strconv.ParseBool(strPprofEnable)
|
|
return pprofEnabled
|
|
}
|
|
|
|
// GetMaxHealthTimeSeconds get MaxHealthTimeSeconds env value.
|
|
func GetMaxHealthTimeSeconds() int64 {
|
|
var maxHealthTimeSeconds int
|
|
strMaxHealthTimeSeconds := os.Getenv("MAX_HEALTH_TIME_SECONDS")
|
|
maxHealthTimeSeconds, err := strconv.Atoi(strMaxHealthTimeSeconds)
|
|
if err != nil {
|
|
maxHealthTimeSeconds = defaultMaxHealthTimeSeconds
|
|
}
|
|
return int64(maxHealthTimeSeconds)
|
|
}
|
|
|
|
// GetEnvironment get environment.
|
|
func GetEnvironment() string {
|
|
return os.Getenv("ENVIRONMENT")
|
|
}
|
|
|
|
// GetAlertConfig get alert config.
|
|
func GetAlertConfig() (alert.AlertConfig, error) {
|
|
return alert.AlertConfig{
|
|
Environment: GetEnvironment(),
|
|
Enabled: getAlertEnabled(),
|
|
ApiKey: getAlertApiKey(),
|
|
}, nil
|
|
}
|
|
|
|
// getAlertEnabled get if alert is enabled.
|
|
func getAlertEnabled() bool {
|
|
strAlertEnabled := os.Getenv("ALERT_ENABLED")
|
|
alertEnabled, err := strconv.ParseBool(strAlertEnabled)
|
|
if err != nil {
|
|
alertEnabled = false
|
|
}
|
|
return alertEnabled
|
|
}
|
|
|
|
// getAlertApiKey get alert api key.
|
|
func getAlertApiKey() string {
|
|
return os.Getenv("ALERT_API_KEY")
|
|
}
|
|
|
|
// GetMetricsEnabled get if metrics is enabled.
|
|
func GetMetricsEnabled() bool {
|
|
strMetricsEnabled := os.Getenv("METRICS_ENABLED")
|
|
metricsEnabled, err := strconv.ParseBool(strMetricsEnabled)
|
|
if err != nil {
|
|
metricsEnabled = false
|
|
}
|
|
return metricsEnabled
|
|
}
|
|
|
|
func GetPrefix() string {
|
|
p2pNetwork, err := GetP2pNetwork()
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
prefix := p2pNetwork.Enviroment + "-" + GetEnvironment()
|
|
return prefix
|
|
}
|
|
|
|
type Configuration struct {
|
|
ObservationsChannelSize int `env:"OBSERVATIONS_CHANNEL_SIZE,required"`
|
|
VaasChannelSize int `env:"VAAS_CHANNEL_SIZE,required"`
|
|
HeartbeatsChannelSize int `env:"HEARTBEATS_CHANNEL_SIZE,required"`
|
|
GovernorConfigChannelSize int `env:"GOVERNOR_CONFIG_CHANNEL_SIZE,required"`
|
|
GovernorStatusChannelSize int `env:"GOVERNOR_STATUS_CHANNEL_SIZE,required"`
|
|
ApiPort uint `env:"API_PORT,required"`
|
|
P2pPort uint `env:"P2P_PORT,required"`
|
|
}
|
|
|
|
// New creates a configuration with the values from .env file and environment variables.
|
|
func New(ctx context.Context) (*Configuration, error) {
|
|
_ = godotenv.Load(".env", "../.env")
|
|
|
|
var configuration Configuration
|
|
if err := envconfig.Process(ctx, &configuration); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &configuration, nil
|
|
}
|