Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Provider checker API #6047

Closed
wants to merge 6 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 23 additions & 5 deletions ci/packages/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,31 @@ import (
"github.com/rs/zerolog/log"
)

// BuildProvChecker builds myst binary with provider checker API. Like go tool, it supports cross-platform build with env vars: GOOS, GOARCH.
func BuildProvChecker() error {
logconfig.Bootstrap()
if err := buildBinary(path.Join("cmd", "mysterium_node", "mysterium_node.go"), "myst", true); err != nil {
return err
}
if err := copyConfig("myst"); err != nil {
return err
}
if err := buildBinary(path.Join("cmd", "supervisor", "supervisor.go"), "myst_supervisor", false); err != nil {
return err
}
return nil
}

// Build builds the project. Like go tool, it supports cross-platform build with env vars: GOOS, GOARCH.
func Build() error {
logconfig.Bootstrap()
if err := buildBinary(path.Join("cmd", "mysterium_node", "mysterium_node.go"), "myst"); err != nil {
if err := buildBinary(path.Join("cmd", "mysterium_node", "mysterium_node.go"), "myst", false); err != nil {
return err
}
if err := copyConfig("myst"); err != nil {
return err
}
if err := buildBinary(path.Join("cmd", "supervisor", "supervisor.go"), "myst_supervisor"); err != nil {
if err := buildBinary(path.Join("cmd", "supervisor", "supervisor.go"), "myst_supervisor", false); err != nil {
return err
}
return nil
Expand All @@ -67,7 +82,7 @@ func buildCrossBinary(os, arch string) error {
return sh.Run("bin/build_xgo", os+"/"+arch)
}

func buildBinary(source, target string) error {
func buildBinary(source, target string, provChecker bool) error {
targetOS, ok := os.LookupEnv("GOOS")
if !ok {
targetOS = runtime.GOOS
Expand All @@ -76,10 +91,10 @@ func buildBinary(source, target string) error {
if !ok {
targetArch = runtime.GOARCH
}
return buildBinaryFor(source, target, targetOS, targetArch, nil, false)
return buildBinaryFor(source, target, targetOS, targetArch, nil, false, provChecker)
}

func buildBinaryFor(source, target, targetOS, targetArch string, extraEnvs map[string]string, buildStatic bool) error {
func buildBinaryFor(source, target, targetOS, targetArch string, extraEnvs map[string]string, buildStatic, provChecker bool) error {
log.Info().Msgf("Building %s -> %s %s/%s", source, target, targetOS, targetArch)

buildDir, err := filepath.Abs(path.Join("build", target))
Expand All @@ -100,6 +115,9 @@ func buildBinaryFor(source, target, targetOS, targetArch string, extraEnvs map[s
if buildStatic {
flags = append(flags, "-a", "-tags", "netgo")
}
if provChecker {
flags = append(flags, "-tags", "prov_checker")
}

if targetOS == "windows" {
target += ".exe"
Expand Down
4 changes: 2 additions & 2 deletions ci/packages/package.go
Original file line number Diff line number Diff line change
Expand Up @@ -380,15 +380,15 @@ func packageStandalone(binaryPath, os, arch string, extraEnvs map[string]string)
if os == "linux" {
filename := path.Base(binaryPath)
binaryPath = path.Join("build", filename, filename)
err = buildBinaryFor(path.Join("cmd", "mysterium_node", "mysterium_node.go"), filename, os, arch, extraEnvs, true)
err = buildBinaryFor(path.Join("cmd", "mysterium_node", "mysterium_node.go"), filename, os, arch, extraEnvs, true, false)
} else {
err = buildCrossBinary(os, arch)
}
if err != nil {
return err
}

err = buildBinaryFor(path.Join("cmd", "supervisor", "supervisor.go"), "myst_supervisor", os, arch, extraEnvs, true)
err = buildBinaryFor(path.Join("cmd", "supervisor", "supervisor.go"), "myst_supervisor", os, arch, extraEnvs, true, false)
if err != nil {
return err
}
Expand Down
95 changes: 50 additions & 45 deletions cmd/bootstrap.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,55 +45,60 @@ func (di *Dependencies) bootstrapTequilapi(nodeOptions node.Options, listener ne
}
tequilaApiClient := tequilapi_client.NewClient(nodeOptions.TequilapiAddress, nodeOptions.TequilapiPort)

handlers := []func(engine *gin.Engine) error{
func(e *gin.Engine) error {
if err := tequilapi_endpoints.AddRoutesForSSE(e, di.StateKeeper, di.EventBus); err != nil {
return err
}
return nil
},
func(e *gin.Engine) error {
if config.GetBool(config.FlagPProfEnable) {
tequilapi_endpoints.AddRoutesForPProf(e)
}
return nil
},
func(e *gin.Engine) error {
e.GET("/healthcheck", tequilapi_endpoints.HealthCheckEndpointFactory(time.Now, os.Getpid).HealthCheck)
return nil
},
tequilapi_endpoints.AddRouteForStop(utils.SoftKiller(di.Shutdown)),
tequilapi_endpoints.AddRoutesForAuthentication(di.Authenticator, di.JWTAuthenticator, di.SSOMystnodes),
tequilapi_endpoints.AddRoutesForIdentities(di.IdentityManager, di.IdentitySelector, di.IdentityRegistry, di.ConsumerBalanceTracker, di.AddressProvider, di.HermesChannelRepository, di.BCHelper, di.Transactor, di.BeneficiaryProvider, di.IdentityMover, di.BeneficiaryAddressStorage, di.HermesMigrator),
tequilapi_endpoints.AddRoutesForConnection(di.MultiConnectionManager, di.StateKeeper, di.ProposalRepository, di.IdentityRegistry, di.EventBus, di.AddressProvider),
tequilapi_endpoints.AddRoutesForSessions(di.SessionStorage),
tequilapi_endpoints.AddRoutesForConnectionLocation(di.IPResolver, di.LocationResolver, di.LocationResolver),
tequilapi_endpoints.AddRoutesForProposals(di.ProposalRepository, di.PricingHelper, di.LocationResolver, di.FilterPresetStorage, di.NATProber),
tequilapi_endpoints.AddRoutesForService(di.ServicesManager, services.JSONParsersByType, di.ProposalRepository, tequilaApiClient),
tequilapi_endpoints.AddRoutesForAccessPolicies(di.HTTPClient, config.GetString(config.FlagAccessPolicyAddress)),
tequilapi_endpoints.AddRoutesForNAT(di.StateKeeper, di.NATProber),
tequilapi_endpoints.AddRoutesForNodeUI(versionmanager.NewVersionManager(di.UIServer, di.HTTPClient, di.uiVersionConfig)),
tequilapi_endpoints.AddRoutesForNode(di.NodeStatusTracker, di.NodeStatsTracker),
tequilapi_endpoints.AddRoutesForTransactor(di.IdentityRegistry, di.Transactor, di.Affiliator, di.HermesPromiseSettler, di.SettlementHistoryStorage, di.AddressProvider, di.BeneficiaryProvider, di.BeneficiarySaver, di.PilvytisAPI),
tequilapi_endpoints.AddRoutesForAffiliator(di.Affiliator),
tequilapi_endpoints.AddRoutesForConfig,
tequilapi_endpoints.AddRoutesForMMN(di.MMN, di.SSOMystnodes, di.Authenticator),
tequilapi_endpoints.AddRoutesForFeedback(di.Reporter),
tequilapi_endpoints.AddRoutesForConnectivityStatus(di.SessionConnectivityStatusStorage),
tequilapi_endpoints.AddRoutesForDocs,
tequilapi_endpoints.AddRoutesForCurrencyExchange(di.PilvytisAPI),
tequilapi_endpoints.AddRoutesForPilvytis(di.PilvytisAPI, di.PilvytisOrderIssuer, di.LocationResolver),
tequilapi_endpoints.AddRoutesForTerms,
tequilapi_endpoints.AddEntertainmentRoutes(entertainment.NewEstimator(
config.FlagPaymentPriceGiB.Value,
config.FlagPaymentPriceHour.Value,
)),
tequilapi_endpoints.AddRoutesForValidator,
}
if nodeOptions.ProvChecker {
handlers = append(handlers, tequilapi_endpoints.AddRoutesForConnectionDiag(di.MultiConnectionDiagManager, di.StateKeeper, di.ProposalRepository, di.IdentityRegistry, di.EventBus, di.EventBus, di.AddressProvider, di.IdentitySelector, nodeOptions))
}

return tequilapi.NewServer(
listener,
nodeOptions,
di.JWTAuthenticator,
[]func(engine *gin.Engine) error{
func(e *gin.Engine) error {
if err := tequilapi_endpoints.AddRoutesForSSE(e, di.StateKeeper, di.EventBus); err != nil {
return err
}
return nil
},
func(e *gin.Engine) error {
if config.GetBool(config.FlagPProfEnable) {
tequilapi_endpoints.AddRoutesForPProf(e)
}
return nil
},
func(e *gin.Engine) error {
e.GET("/healthcheck", tequilapi_endpoints.HealthCheckEndpointFactory(time.Now, os.Getpid).HealthCheck)
return nil
},
tequilapi_endpoints.AddRouteForStop(utils.SoftKiller(di.Shutdown)),
tequilapi_endpoints.AddRoutesForAuthentication(di.Authenticator, di.JWTAuthenticator, di.SSOMystnodes),
tequilapi_endpoints.AddRoutesForIdentities(di.IdentityManager, di.IdentitySelector, di.IdentityRegistry, di.ConsumerBalanceTracker, di.AddressProvider, di.HermesChannelRepository, di.BCHelper, di.Transactor, di.BeneficiaryProvider, di.IdentityMover, di.BeneficiaryAddressStorage, di.HermesMigrator),
tequilapi_endpoints.AddRoutesForConnection(di.MultiConnectionManager, di.StateKeeper, di.ProposalRepository, di.IdentityRegistry, di.EventBus, di.AddressProvider),
tequilapi_endpoints.AddRoutesForSessions(di.SessionStorage),
tequilapi_endpoints.AddRoutesForConnectionLocation(di.IPResolver, di.LocationResolver, di.LocationResolver),
tequilapi_endpoints.AddRoutesForProposals(di.ProposalRepository, di.PricingHelper, di.LocationResolver, di.FilterPresetStorage, di.NATProber),
tequilapi_endpoints.AddRoutesForService(di.ServicesManager, services.JSONParsersByType, di.ProposalRepository, tequilaApiClient),
tequilapi_endpoints.AddRoutesForAccessPolicies(di.HTTPClient, config.GetString(config.FlagAccessPolicyAddress)),
tequilapi_endpoints.AddRoutesForNAT(di.StateKeeper, di.NATProber),
tequilapi_endpoints.AddRoutesForNodeUI(versionmanager.NewVersionManager(di.UIServer, di.HTTPClient, di.uiVersionConfig)),
tequilapi_endpoints.AddRoutesForNode(di.NodeStatusTracker, di.NodeStatsTracker),
tequilapi_endpoints.AddRoutesForTransactor(di.IdentityRegistry, di.Transactor, di.Affiliator, di.HermesPromiseSettler, di.SettlementHistoryStorage, di.AddressProvider, di.BeneficiaryProvider, di.BeneficiarySaver, di.PilvytisAPI),
tequilapi_endpoints.AddRoutesForAffiliator(di.Affiliator),
tequilapi_endpoints.AddRoutesForConfig,
tequilapi_endpoints.AddRoutesForMMN(di.MMN, di.SSOMystnodes, di.Authenticator),
tequilapi_endpoints.AddRoutesForFeedback(di.Reporter),
tequilapi_endpoints.AddRoutesForConnectivityStatus(di.SessionConnectivityStatusStorage),
tequilapi_endpoints.AddRoutesForDocs,
tequilapi_endpoints.AddRoutesForCurrencyExchange(di.PilvytisAPI),
tequilapi_endpoints.AddRoutesForPilvytis(di.PilvytisAPI, di.PilvytisOrderIssuer, di.LocationResolver),
tequilapi_endpoints.AddRoutesForTerms,
tequilapi_endpoints.AddEntertainmentRoutes(entertainment.NewEstimator(
config.FlagPaymentPriceGiB.Value,
config.FlagPaymentPriceHour.Value,
)),
tequilapi_endpoints.AddRoutesForValidator,
},
handlers,
)
}

Expand Down
40 changes: 34 additions & 6 deletions cmd/di.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,8 +150,9 @@ type Dependencies struct {

EventBus eventbus.EventBus

MultiConnectionManager connection.MultiManager
ConnectionRegistry *connection.Registry
MultiConnectionManager connection.MultiManager
MultiConnectionDiagManager connection.DiagManager
ConnectionRegistry *connection.Registry

ServicesManager *service.Manager
ServiceRegistry *service.Registry
Expand Down Expand Up @@ -287,7 +288,7 @@ func (di *Dependencies) Bootstrap(nodeOptions node.Options) error {
return err
}

if err := di.bootstrapQualityComponents(nodeOptions.Quality); err != nil {
if err := di.bootstrapQualityComponents(nodeOptions.Quality, nodeOptions); err != nil {
return err
}

Expand All @@ -299,6 +300,7 @@ func (di *Dependencies) Bootstrap(nodeOptions node.Options) error {
if err = di.handleConnStateChange(); err != nil {
return err
}

if err := di.Node.Start(); err != nil {
return err
}
Expand Down Expand Up @@ -581,6 +583,7 @@ func (di *Dependencies) bootstrapNodeComponents(nodeOptions node.Options, tequil
di.bootstrapBeneficiarySaver(nodeOptions)

di.ConnectionRegistry = connection.NewRegistry()

di.MultiConnectionManager = connection.NewMultiConnectionManager(func() connection.Manager {
return connection.NewManager(
pingpong.ExchangeFactoryFunc(
Expand All @@ -607,6 +610,31 @@ func (di *Dependencies) bootstrapNodeComponents(nodeOptions node.Options, tequil
)
})

if nodeOptions.ProvChecker {
di.MultiConnectionDiagManager = connection.NewDiagManager(
pingpong.ExchangeFactoryFunc(
di.Keystore,
di.SignerFactory,
di.ConsumerTotalsStorage,
di.AddressProvider,
di.EventBus,
nodeOptions.Payments.ConsumerDataLeewayMegabytes,
),
di.ConnectionRegistry.CreateConnection,
di.EventBus,
di.IPResolver,
di.LocationResolver,
connection.DefaultConfig(),
config.GetDuration(config.FlagStatsReportInterval),
connection.NewValidator(
di.ConsumerBalanceTracker,
di.IdentityManager,
),
di.P2PDialer,
di.allowTrustedDomainBypassTunnel,
di.disallowTrustedDomainBypassTunnel,
)
}
di.NATProber = natprobe.NewNATProber(di.MultiConnectionManager, di.EventBus)

di.LogCollector = logconfig.NewCollector(&logconfig.CurrentLogOptions)
Expand Down Expand Up @@ -655,7 +683,7 @@ func (di *Dependencies) bootstrapNodeComponents(nodeOptions node.Options, tequil
sleepNotifier := sleep.NewNotifier(di.MultiConnectionManager, di.EventBus)
sleepNotifier.Subscribe()

di.Node = NewNode(di.MultiConnectionManager, tequilapiHTTPServer, di.EventBus, di.UIServer, sleepNotifier)
di.Node = NewNode(di.MultiConnectionManager, di.MultiConnectionDiagManager, tequilapiHTTPServer, di.EventBus, di.UIServer, sleepNotifier)

return nil
}
Expand Down Expand Up @@ -883,7 +911,7 @@ func (di *Dependencies) bootstrapIdentityComponents(options node.Options) error
return nil
}

func (di *Dependencies) bootstrapQualityComponents(options node.OptionsQuality) (err error) {
func (di *Dependencies) bootstrapQualityComponents(options node.OptionsQuality, nodeOptions node.Options) (err error) {
if err := di.AllowURLAccess(options.Address); err != nil {
return err
}
Expand Down Expand Up @@ -1065,7 +1093,7 @@ func (di *Dependencies) handleConnStateChange() error {

latestState := connectionstate.NotConnected
return di.EventBus.SubscribeAsync(connectionstate.AppTopicConnectionState, func(e connectionstate.AppEventConnectionState) {
if config.GetBool(config.FlagProxyMode) || config.GetBool(config.FlagDVPNMode) {
if config.GetBool(config.FlagProxyMode) || config.GetBool(config.FlagDVPNMode) || config.GetBool(config.FlagProvCheckerMode) {
return // Proxy mode doesn't establish system wide tunnels, no reconnect required.
}

Expand Down
26 changes: 15 additions & 11 deletions cmd/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,23 +42,27 @@ type SleepNotifier interface {
}

// NewNode function creates new Mysterium node by given options
func NewNode(connectionManager connection.MultiManager, tequilapiServer tequilapi.APIServer, publisher Publisher, uiServer UIServer, notifier SleepNotifier) *Node {
func NewNode(connectionManager connection.MultiManager, connectionDiagManager connection.DiagManager, tequilapiServer tequilapi.APIServer, publisher Publisher, uiServer UIServer, notifier SleepNotifier) *Node {
return &Node{
connectionManager: connectionManager,
httpAPIServer: tequilapiServer,
publisher: publisher,
uiServer: uiServer,
sleepNotifier: notifier,
connectionManager: connectionManager,
connectionDiagManager: connectionDiagManager,

httpAPIServer: tequilapiServer,
publisher: publisher,
uiServer: uiServer,
sleepNotifier: notifier,
}
}

// Node represent entrypoint for Mysterium node with top level components
type Node struct {
connectionManager connection.MultiManager
httpAPIServer tequilapi.APIServer
publisher Publisher
uiServer UIServer
sleepNotifier SleepNotifier
connectionManager connection.MultiManager
connectionDiagManager connection.DiagManager

httpAPIServer tequilapi.APIServer
publisher Publisher
uiServer UIServer
sleepNotifier SleepNotifier
}

// Start starts Mysterium node (Tequilapi service, fetches location)
Expand Down
9 changes: 9 additions & 0 deletions config/flags_network.go
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,13 @@ var (
Usage: "DNS listen port for services",
Value: 11253,
}

// FlagProvCheckerDatabaseDSN sets DNS for checker API database
FlagProvCheckerDatabaseDSN = cli.StringFlag{
Name: "checker.dsn",
Usage: "Database DSN for provider checker",
Value: "",
}
)

// RegisterFlagsNetwork function register network flags to flag list
Expand All @@ -179,6 +186,7 @@ func RegisterFlagsNetwork(flags *[]cli.Flag) {
&FlagPortCheckServers,
&FlagStatsReportInterval,
&FlagDNSListenPort,
&FlagProvCheckerDatabaseDSN,
)
}

Expand All @@ -203,6 +211,7 @@ func ParseFlagsNetwork(ctx *cli.Context) {
Current.ParseStringFlag(ctx, FlagPortCheckServers)
Current.ParseDurationFlag(ctx, FlagStatsReportInterval)
Current.ParseIntFlag(ctx, FlagDNSListenPort)
Current.ParseStringFlag(ctx, FlagProvCheckerDatabaseDSN)
}

// BlockchainNetwork defines a blockchain network
Expand Down
10 changes: 10 additions & 0 deletions config/flags_node.go
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,13 @@ var (
Value: false,
}

// FlagProvCheckerMode allows running node under current user as a provider checker agent.
FlagProvCheckerMode = cli.BoolFlag{
Name: "provchecker",
Usage: "",
Value: false,
}

// FlagUserspace allows running a node without privileged permissions.
FlagUserspace = cli.BoolFlag{
Name: "userspace",
Expand Down Expand Up @@ -349,6 +356,7 @@ func RegisterFlagsNode(flags *[]cli.Flag) error {
&FlagUserMode,
&FlagDVPNMode,
&FlagProxyMode,
&FlagProvCheckerMode,
&FlagUserspace,
&FlagVendorID,
&FlagLauncherVersion,
Expand Down Expand Up @@ -411,6 +419,8 @@ func ParseFlagsNode(ctx *cli.Context) {
Current.ParseBoolFlag(ctx, FlagUserMode)
Current.ParseBoolFlag(ctx, FlagDVPNMode)
Current.ParseBoolFlag(ctx, FlagProxyMode)
Current.ParseBoolFlag(ctx, FlagProvCheckerMode)

Current.ParseBoolFlag(ctx, FlagUserspace)
Current.ParseStringFlag(ctx, FlagVendorID)
Current.ParseStringFlag(ctx, FlagLauncherVersion)
Expand Down
Loading