static async Task <List <Pod> > GetPods(IKubernetes client, string clusterName, int timeoutSeconds) { V1PodList pods; var newList = new List <Pod>(); try { var task = client.ListPodForAllNamespacesAsync(); if (await Task.WhenAny(task, Task.Delay(timeoutSeconds * 1000)) == task) { pods = await task; } else { Console.WriteLine($"Ignoring cluster: '{clusterName}': Timeout."); return(newList); } } catch (Exception ex) when(ex is TaskCanceledException || ex is HttpOperationException || ex is HttpRequestException) { Console.WriteLine($"Ignoring cluster: '{clusterName}': {ex.Message}"); return(newList); } foreach (var pod in pods.Items) { var newPod = new Pod(); newPod.Name = pod.Metadata.Name; newPod.Namespace = pod.Metadata.NamespaceProperty; newPod.Cluster = clusterName; newPod.Annotations = pod.Annotations()?.ToDictionary(t => t.Key, t => t.Value) ?? new Dictionary <string, string>(); newPod.Labels = pod.Labels()?.ToDictionary(t => t.Key, t => t.Value) ?? new Dictionary <string, string>(); newPod.Status = new Status { Message = pod.Status.Message, Reason = pod.Status.Reason, StartTime = pod.Status.StartTime ?? new DateTime(), ContainerStatuses = pod.Status.ContainerStatuses?.Select(cs => new ContainerStatus { ContainerID = cs.ContainerID, Image = cs.Image, ImageID = cs.ImageID, Name = cs.Name, Ready = cs.Ready, RestartCount = cs.RestartCount, Started = cs.Started ?? false, State = new State { StateRunning = new StateRunning { StartedAt = cs.State.Running?.StartedAt ?? new DateTime() }, StateTerminated = new StateTerminated { ContainerID = cs.State.Terminated?.ContainerID ?? string.Empty, ExitCode = cs.State.Terminated?.ExitCode ?? 0, FinishedAt = cs.State.Terminated?.FinishedAt ?? new DateTime(), Message = cs.State.Terminated?.Message ?? string.Empty, Reason = cs.State.Terminated?.Reason ?? string.Empty, StartedAt = cs.State.Terminated?.StartedAt ?? new DateTime() }, StateWaiting = new StateWaiting { Message = cs.State.Waiting?.Message ?? string.Empty, Reason = cs.State.Waiting?.Reason ?? string.Empty } } })?.ToArray() ?? new ContainerStatus[] { } }; newPod.Containers = pod.Spec.Containers.Select(c => new Container { Args = c.Args?.Select(a => a)?.ToArray() ?? new string[] { }, Command = c.Command?.Select(c => c)?.ToArray() ?? new string[] { }, Image = c.Image, Name = c.Name, WorkingDir = c.WorkingDir }).ToArray(); newList.Add(newPod); } return(newList); }
private static Pod ExcludeContainers(Pod pod, string[] excludeContainers) { pod.Containers = pod.Containers.Where(c => !excludeContainers.Any(ec => c.Name.Contains(ec, StringComparison.OrdinalIgnoreCase))).ToArray(); return(pod); }