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 }