/// <summary> /// Async factory method to build the instance of a K8sEnvironment. /// </summary> /// <returns></returns> public async Task <K8sEnvironment> CreateAsync(TimeSpan timeout) { K8sEnvironment instance = null; ILogger <K8sEnvironment> logger = null; try { using (IKubeHttpClient httpClient = _httpClientFactory.Create(_httpClientSettings)) using (K8sQueryClient queryClient = _k8sQueryClientFactory.Create(httpClient)) { string containerId = _httpClientSettings.ContainerId; if (await SpinWaitContainerReady(timeout, queryClient, containerId).ConfigureAwait(false)) { instance = new K8sEnvironment() { ContainerID = containerId }; K8sPod myPod = await queryClient.GetMyPodAsync().ConfigureAwait(false); instance.myPod = myPod; logger?.LogDebug(Invariant($"Getting container status of container-id: {containerId}")); instance.myContainerStatus = myPod.GetContainerStatus(containerId); IEnumerable <K8sReplicaSet> replicaSetList = await queryClient.GetReplicasAsync().ConfigureAwait(false); instance.myReplicaSet = myPod.GetMyReplicaSet(replicaSetList); if (instance.myReplicaSet != null) { IEnumerable <K8sDeployment> deploymentList = await queryClient.GetDeploymentsAsync().ConfigureAwait(false); instance.myDeployment = instance.myReplicaSet.GetMyDeployment(deploymentList); } if (instance.myPod != null) { IEnumerable <K8sNode> nodeList = await queryClient.GetNodesAsync().ConfigureAwait(false); string nodeName = instance.myPod.Spec.NodeName; if (!string.IsNullOrEmpty(nodeName)) { instance.myNode = nodeList.FirstOrDefault(node => !string.IsNullOrEmpty(node.Metadata?.Name) && node.Metadata.Name.Equals(nodeName, StringComparison.OrdinalIgnoreCase)); } } } else { logger?.LogError(Invariant($"Kubernetes info is not available within given time of {timeout.TotalMilliseconds} ms.")); } } return(instance); } catch (Exception ex) { logger?.LogCritical(ex.ToString()); return(null); } }
public async Task GetNodesAsyncShouldReturnsMultipleNodes() { var httpClientSettingsMock = GetKubeHttpClientSettingsProviderForTest(); var httpClientMock = new Mock <IKubeHttpClient>(); httpClientMock.Setup(httpClient => httpClient.Settings).Returns(httpClientSettingsMock.Object); HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(JsonConvert.SerializeObject(new K8sEntityList <K8sNode> { Items = new List <K8sNode> { new K8sNode() { Metadata = new K8sNodeMetadata() { Name = "N1" } }, new K8sNode() { Metadata = new K8sNodeMetadata() { Name = "N2" } } } })) }; httpClientMock.Setup(httpClient => httpClient.SendAsync(It.IsAny <HttpRequestMessage>())).Returns(Task.FromResult( response)); using (K8sQueryClient target = new K8sQueryClient(httpClientMock.Object)) { IEnumerable <K8sNode> result = await target.GetNodesAsync(); Assert.NotNull(result); Assert.Equal(2, result.Count()); Assert.Contains(result, p => p.Metadata.Name.Equals("N1")); Assert.Contains(result, p => p.Metadata.Name.Equals("N2")); } }
public async Task GetNodesAsyncShouldHitsTheUri() { var httpClientSettingsMock = GetKubeHttpClientSettingsProviderForTest(); var httpClientMock = new Mock <IKubeHttpClient>(); httpClientMock.Setup(httpClient => httpClient.Settings).Returns(httpClientSettingsMock.Object); HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(JsonConvert.SerializeObject(new K8sEntityList <K8sPod>())) }; httpClientMock.Setup(httpClient => httpClient.SendAsync(It.IsAny <HttpRequestMessage>())).Returns(Task.FromResult(response)); using (K8sQueryClient target = new K8sQueryClient(httpClientMock.Object)) { await target.GetNodesAsync(); } httpClientMock.Verify(mock => mock.SendAsync(It.Is <HttpRequestMessage>(m => m.RequestUri.AbsoluteUri.Equals("https://baseaddress/api/v1/nodes"))), Times.Once); }
/// <summary> /// Async factory method to build the instance of a K8sEnvironment. /// </summary> /// <returns></returns> public async Task <IK8sEnvironment> CreateAsync(DateTime timeoutAt) { K8sEnvironment instance = null; try { using (IKubeHttpClient httpClient = _httpClientFactory.Create(_httpClientSettings)) using (K8sQueryClient queryClient = _k8sQueryClientFactory.Create(httpClient)) { // TODO: See if there's better way to fetch the container id K8sPod myPod = await SpinWaitUntilGetPod(timeoutAt, queryClient).ConfigureAwait(false); if (myPod != null) { string containerId = null; if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { // For Windows, is there a way to fetch the current container id from within the container? containerId = myPod.Status.ContainerStatuses.First().ContainerID; } else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { // For Linux, container id could be fetched directly from cGroup. containerId = _httpClientSettings.ContainerId; } // ~ if (await SpinWaitContainerReady(timeoutAt, queryClient, containerId).ConfigureAwait(false)) { instance = new K8sEnvironment() { ContainerID = containerId }; instance.myPod = myPod; _logger.LogDebug(Invariant($"Getting container status of container-id: {containerId}")); instance.myContainerStatus = myPod.GetContainerStatus(containerId); IEnumerable <K8sReplicaSet> replicaSetList = await queryClient.GetReplicasAsync().ConfigureAwait(false); instance.myReplicaSet = myPod.GetMyReplicaSet(replicaSetList); if (instance.myReplicaSet != null) { IEnumerable <K8sDeployment> deploymentList = await queryClient.GetDeploymentsAsync().ConfigureAwait(false); instance.myDeployment = instance.myReplicaSet.GetMyDeployment(deploymentList); } if (instance.myPod != null) { IEnumerable <K8sNode> nodeList = await queryClient.GetNodesAsync().ConfigureAwait(false); string nodeName = instance.myPod.Spec.NodeName; if (!string.IsNullOrEmpty(nodeName)) { instance.myNode = nodeList.FirstOrDefault(node => !string.IsNullOrEmpty(node.Metadata?.Name) && node.Metadata.Name.Equals(nodeName, StringComparison.OrdinalIgnoreCase)); } } } else { _logger.LogError(Invariant($"Kubernetes info is not available before the timeout at {timeoutAt}.")); } } else { // MyPod is null, meaning query timed out. _logger.LogCritical("Fail to fetch the pod information in time. Kubernetes info will not be available for the telemetry."); return(null); } } return(instance); } catch (Exception ex) { _logger.LogCritical(ex.ToString()); return(null); } }