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

Add dbHostCheck entity to the store #1085

Merged
merged 9 commits into from Mar 25, 2024
59 changes: 0 additions & 59 deletions api/autopilot.go
Expand Up @@ -2,8 +2,6 @@ package api

import (
"errors"
"fmt"
"strings"

"go.sia.tech/core/types"
"go.sia.tech/renterd/hostdb"
Expand Down Expand Up @@ -136,65 +134,8 @@ type (
Usable bool `json:"usable"`
UnusableReasons []string `json:"unusableReasons"`
}

HostGougingBreakdown struct {
ContractErr string `json:"contractErr"`
DownloadErr string `json:"downloadErr"`
GougingErr string `json:"gougingErr"`
PruneErr string `json:"pruneErr"`
UploadErr string `json:"uploadErr"`
}

HostScoreBreakdown struct {
Age float64 `json:"age"`
Collateral float64 `json:"collateral"`
Interactions float64 `json:"interactions"`
StorageRemaining float64 `json:"storageRemaining"`
Uptime float64 `json:"uptime"`
Version float64 `json:"version"`
Prices float64 `json:"prices"`
}
)

func (sb HostScoreBreakdown) String() string {
return fmt.Sprintf("Age: %v, Col: %v, Int: %v, SR: %v, UT: %v, V: %v, Pr: %v", sb.Age, sb.Collateral, sb.Interactions, sb.StorageRemaining, sb.Uptime, sb.Version, sb.Prices)
}

func (hgb HostGougingBreakdown) Gouging() bool {
for _, err := range []string{
hgb.ContractErr,
hgb.DownloadErr,
hgb.GougingErr,
hgb.PruneErr,
hgb.UploadErr,
} {
if err != "" {
return true
}
}
return false
}

func (hgb HostGougingBreakdown) String() string {
var reasons []string
for _, errStr := range []string{
hgb.ContractErr,
hgb.DownloadErr,
hgb.GougingErr,
hgb.PruneErr,
hgb.UploadErr,
} {
if errStr != "" {
reasons = append(reasons, errStr)
}
}
return strings.Join(reasons, ";")
}

func (sb HostScoreBreakdown) Score() float64 {
return sb.Age * sb.Collateral * sb.Interactions * sb.StorageRemaining * sb.Uptime * sb.Version * sb.Prices
}

func (c AutopilotConfig) Validate() error {
if c.Hosts.MaxDowntimeHours > 99*365*24 {
return ErrMaxDowntimeHoursTooHigh
Expand Down
82 changes: 82 additions & 0 deletions api/host.go
Expand Up @@ -4,6 +4,7 @@ import (
"errors"
"fmt"
"net/url"
"strings"

"go.sia.tech/core/types"
"go.sia.tech/renterd/hostdb"
Expand All @@ -23,6 +24,10 @@ var (
// ErrHostNotFound is returned when a host can't be retrieved from the
// database.
ErrHostNotFound = errors.New("host doesn't exist in hostdb")

// ErrHostInfoNotFound is returned when host info can't be retrieved from
// the database.
ErrHostInfoNotFound = errors.New("host info doesn't exist in hostdb")
)

type (
Expand Down Expand Up @@ -109,3 +114,80 @@ func (opts HostsForScanningOptions) Apply(values url.Values) {
values.Set("lastScan", TimeRFC3339(opts.MaxLastScan).String())
}
}

type (
HostInfo struct {
Host hostdb.Host `json:"host"`
Gouging HostGougingBreakdown `json:"gouging"`
Score HostScoreBreakdown `json:"score"`
Usability HostUsabilityBreakdown `json:"usability"`
}

HostGougingBreakdown struct {
ContractErr string `json:"contractErr"`
DownloadErr string `json:"downloadErr"`
GougingErr string `json:"gougingErr"`
PruneErr string `json:"pruneErr"`
UploadErr string `json:"uploadErr"`
}

HostScoreBreakdown struct {
Age float64 `json:"age"`
Collateral float64 `json:"collateral"`
Interactions float64 `json:"interactions"`
StorageRemaining float64 `json:"storageRemaining"`
Uptime float64 `json:"uptime"`
Version float64 `json:"version"`
Prices float64 `json:"prices"`
}

HostUsabilityBreakdown struct {
Blocked bool `json:"blocked"`
Offline bool `json:"offline"`
LowScore bool `json:"lowScore"`
RedundantIP bool `json:"redundantIP"`
Gouging bool `json:"gouging"`
NotAcceptingContracts bool `json:"notAcceptingContracts"`
NotAnnounced bool `json:"notAnnounced"`
NotCompletingScan bool `json:"notCompletingScan"`
}
)

func (sb HostScoreBreakdown) String() string {
return fmt.Sprintf("Age: %v, Col: %v, Int: %v, SR: %v, UT: %v, V: %v, Pr: %v", sb.Age, sb.Collateral, sb.Interactions, sb.StorageRemaining, sb.Uptime, sb.Version, sb.Prices)
}

func (hgb HostGougingBreakdown) Gouging() bool {
for _, err := range []string{
hgb.ContractErr,
hgb.DownloadErr,
hgb.GougingErr,
hgb.PruneErr,
hgb.UploadErr,
} {
if err != "" {
return true
}
}
return false
}

func (hgb HostGougingBreakdown) String() string {
var reasons []string
for _, errStr := range []string{
hgb.ContractErr,
hgb.DownloadErr,
hgb.GougingErr,
hgb.PruneErr,
hgb.UploadErr,
} {
if errStr != "" {
reasons = append(reasons, errStr)
}
}
return strings.Join(reasons, ";")
}

func (sb HostScoreBreakdown) Score() float64 {
return sb.Age * sb.Collateral * sb.Interactions * sb.StorageRemaining * sb.Uptime * sb.Version * sb.Prices
}