65 lines
1.5 KiB
Go
65 lines
1.5 KiB
Go
package provider
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"sort"
|
|
|
|
"proxy-pool/internal/platform/lifecycle"
|
|
)
|
|
|
|
var ErrInvalidFleet = errors.New("invalid Provider fleet")
|
|
|
|
type Fleet struct {
|
|
runtimes []*UpstreamRuntime
|
|
group *lifecycle.Group
|
|
}
|
|
|
|
func NewFleet(runtimes ...*UpstreamRuntime) (*Fleet, error) {
|
|
if len(runtimes) == 0 {
|
|
return nil, ErrInvalidFleet
|
|
}
|
|
seen := make(map[string]struct{}, len(runtimes))
|
|
owned := make([]*UpstreamRuntime, len(runtimes))
|
|
for index, runtime := range runtimes {
|
|
if runtime == nil || runtime.config.Provider.UpstreamID == "" {
|
|
return nil, ErrInvalidFleet
|
|
}
|
|
if _, exists := seen[runtime.config.Provider.UpstreamID]; exists {
|
|
return nil, ErrInvalidFleet
|
|
}
|
|
seen[runtime.config.Provider.UpstreamID] = struct{}{}
|
|
owned[index] = runtime
|
|
}
|
|
sort.Slice(owned, func(left, right int) bool {
|
|
return owned[left].ID() < owned[right].ID()
|
|
})
|
|
runners := make([]lifecycle.Runner, len(owned))
|
|
for index, runtime := range owned {
|
|
runners[index] = runtime
|
|
}
|
|
group, err := lifecycle.NewGroup(runners...)
|
|
if err != nil {
|
|
return nil, errors.Join(ErrInvalidFleet, err)
|
|
}
|
|
return &Fleet{runtimes: owned, group: group}, nil
|
|
}
|
|
|
|
func (fleet *Fleet) Run(ctx context.Context) error {
|
|
if fleet == nil || ctx == nil || len(fleet.runtimes) == 0 || fleet.group == nil {
|
|
return ErrInvalidFleet
|
|
}
|
|
return fleet.group.Run(ctx)
|
|
}
|
|
|
|
func (fleet *Fleet) IDs() []string {
|
|
if fleet == nil {
|
|
return nil
|
|
}
|
|
ids := make([]string, len(fleet.runtimes))
|
|
for index, runtime := range fleet.runtimes {
|
|
ids[index] = runtime.ID()
|
|
}
|
|
return ids
|
|
}
|