package external import ( "log" "sync" "time" appPkg "coopcloud.tech/abra/pkg/app" "coopcloud.tech/abra/pkg/client" "coopcloud.tech/abra/pkg/config" "github.com/stretchr/testify/mock" ) type ServerPackage interface { GetReachableServers(apps []appPkg.App) (map[string]bool, error) } type AbraServerPackage struct{} func (a *AbraServerPackage) GetReachableServers(apps []appPkg.App) (map[string]bool, error) { // servers that are unreachable.. reachable := make(map[string]bool) servers, err := config.ReadServerNames() if err != nil { return nil, err } start := time.Now() reachableCh := make(chan string) //errCh := make(chan error) var wg sync.WaitGroup wg.Add(len(servers)) for _, server := range servers { // check if its unreachable.. // this connection is retried, so takes 10 seconds per connection // TODO: figure out a way to make this faster // this is retried every server and connection so it really should be quicker go func(server string) { defer wg.Done() timeout := client.WithTimeout(3) if _, err := client.New(server, timeout); err != nil { //errCh <- err } else { reachableCh <- server } }(server) } go func() { for server := range reachableCh { reachable[server] = true } }() wg.Wait() elapsed := time.Since(start) log.Printf("Checking server availability took %s", elapsed) return reachable, nil } type MockServerPackage struct { mock.Mock } func (a *MockServerPackage) GetReachableServers(apps []appPkg.App) (map[string]bool, error) { callArgs := []interface{}{} for _, arg := range apps { callArgs = append(callArgs, arg) } args := a.Called(callArgs...) return args.Get(0).(map[string]bool), args.Error(1) }