(client *http.Client, namespaces []string, apiUrl url.URL)
| 376 | } |
| 377 | |
| 378 | func fetchMultiNamespaceResource(client *http.Client, namespaces []string, apiUrl url.URL) (*NamespaceResourceContainer, error) { |
| 379 | wg := &sync.WaitGroup{} |
| 380 | var mergedContainer NamespaceResourceContainer |
| 381 | var responses []*http.Response |
| 382 | var es []error |
| 383 | for i := range namespaces { |
| 384 | wg.Add(1) |
| 385 | ns := namespaces[i] |
| 386 | go func() { |
| 387 | newUrl := apiUrl |
| 388 | newUrl.Path = addUrlNamespace(apiUrl.Path, ns) |
| 389 | resp, err := client.Get(newUrl.String()) |
| 390 | if err != nil { |
| 391 | es = append(es, err) |
| 392 | wg.Done() |
| 393 | return |
| 394 | } |
| 395 | responses = append(responses, resp) |
| 396 | wg.Done() |
| 397 | }() |
| 398 | |
| 399 | } |
| 400 | wg.Wait() |
| 401 | var forbidden int |
| 402 | var forbiddenMessage []string |
| 403 | for i := range responses { |
| 404 | r := responses[i] |
| 405 | body, err := ioutil.ReadAll(r.Body) |
| 406 | if err != nil { |
| 407 | return nil, err |
| 408 | } |
| 409 | if r.StatusCode != http.StatusOK { |
| 410 | if r.StatusCode == http.StatusForbidden { |
| 411 | forbidden++ |
| 412 | forbiddenMessage = append(forbiddenMessage, string(body)) |
| 413 | continue |
| 414 | } else { |
| 415 | return nil, errors.New(string(body)) |
| 416 | } |
| 417 | } |
| 418 | var nc NamespaceResourceContainer |
| 419 | if err := json.Unmarshal(body, &nc); err != nil { |
| 420 | return nil, err |
| 421 | } |
| 422 | mergedContainer.TypeMeta = nc.TypeMeta |
| 423 | mergedContainer.ListMeta = nc.ListMeta |
| 424 | mergedContainer.Items = append(mergedContainer.Items, nc.Items...) |
| 425 | } |
| 426 | if len(namespaces) == 1 && forbidden == 1 { |
| 427 | return nil, errors.New(strings.Join(forbiddenMessage, "")) |
| 428 | } |
| 429 | return &mergedContainer, nil |
| 430 | } |
| 431 | |
| 432 | func (h *Handler) generateTLSTransport(c *v1Cluster.Cluster, profile session.UserProfile) (http.RoundTripper, error) { |
| 433 | if profile.IsAdministrator { |
no test coverage detected