public void ResourcesTestMethod() { DirectoryInfo _targetDirectory = null; try { string _path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), m_TestPath); _targetDirectory = new DirectoryInfo(_path); int _installedFiles = 0; Assert.IsFalse(_targetDirectory.Exists, "The test directory already exist before test starting"); ContainerResources.ExampleSolutionInstallation(m_TestPath, (x, y) => { Console.WriteLine($"{y}: {x}"); _installedFiles++; }); Assert.AreEqual <int>(20, _installedFiles); _targetDirectory.Refresh(); Assert.IsTrue(_targetDirectory.Exists); Assert.AreEqual <int>(3, _targetDirectory.GetFiles().Length, "Expected 2 solutions and plug-in"); Assert.AreEqual <int>(2, _targetDirectory.GetDirectories().Length, "Expected only 2 solutions folders"); } catch (Exception) { throw; } finally { _targetDirectory.Delete(true); _targetDirectory.Refresh(); Assert.IsFalse(_targetDirectory.Exists); } }
public static void ConfigTest(TestContext context) { if (Directory.Exists(_dataPath)) { Directory.Delete(_dataPath); } ContainerResources.ExampleSolutionInstallation(Path.Combine((Directory.GetCurrentDirectory()), _dataPath), (x, y) => Console.WriteLine(x)); }
public static void ConfigTest(TestContext context) { console.Add(Directory.GetCurrentDirectory()); if (Directory.Exists(m_ExamplePath)) { Directory.Delete(m_ExamplePath, true); } ContainerResources.ExampleSolutionInstallation(m_ExamplePath, (x, y) => console.Add(x)); }
/// <summary> /// Verifies that all pod container specifications include resource requests and limits. /// </summary> /// <param name="clusterLogin">Specifies the target cluster login.</param> /// <param name="k8s">Specifies the cluster's Kubernertes client.</param> /// <param name="details">Optionally specifies that status should be written to STDOUT when there's no errors.</param> /// <returns><c>true</c> when there are no problems, <c>false</c> otherwise.</returns> /// <returns></returns> public static async Task <bool> CheckResourcesAsync(ClusterLogin clusterLogin, IKubernetes k8s, bool details = false) { Covenant.Requires <ArgumentNullException>(clusterLogin != null, nameof(clusterLogin)); Covenant.Requires <ArgumentNullException>(k8s != null, nameof(k8s)); Console.WriteLine(); Console.WriteLine("==============================================================================="); Console.WriteLine("Checking container resources..."); // Build a dictionary that maps the a pod reference [namespace/pod-owner-name] // to a list of resource information for each container in the pod. var podRefToContainerResources = new Dictionary <string, List <ContainerResources> >(StringComparer.InvariantCulture); foreach (var @namespace in (await k8s.ListNamespaceAsync()).Items) { foreach (var pod in (await k8s.ListNamespacedPodAsync(@namespace.Metadata.Name)).Items) { var podRef = await GetOwnerIdAsync(k8s, pod); var containers = new List <ContainerResources>(); foreach (var containerSpec in pod.Spec.Containers) { var containerResources = new ContainerResources() { ContainerImage = containerSpec.Image }; if (containerSpec.Resources != null) { if (containerSpec.Resources.Requests != null) { containerResources.RequestCpu = GetResourceQuantity("cpu", containerSpec.Resources.Requests); } if (containerSpec.Resources.Requests != null) { containerResources.RequestMemory = GetResourceQuantity("memory", containerSpec.Resources.Requests); } if (containerSpec.Resources.Limits != null) { containerResources.LimitCpu = GetResourceQuantity("cpu", containerSpec.Resources.Requests); } if (containerSpec.Resources.Limits != null) { containerResources.LimitMemory = GetResourceQuantity("memory", containerSpec.Resources.Requests); } } containers.Add(containerResources); } podRefToContainerResources[podRef] = containers; } } var badPodSpecCount = podRefToContainerResources.Values.Count(containers => containers.Any(resources => resources.Error)); if (badPodSpecCount > 0 || details) { if (badPodSpecCount > 0) { Console.WriteLine(); Console.WriteLine($"ERROR: [{badPodSpecCount}] pod deployments have containers without resource requests and/or limits."); Console.WriteLine(); } else { Console.WriteLine(); } foreach (var item in podRefToContainerResources .OrderBy(item => item.Key)) { var containers = item.Value; var error = containers.Any(container => container.Error); var errorMarker = error ? "-->" : " "; if (error || details) { Console.WriteLine($"{errorMarker} {item.Key}"); } foreach (var container in containers) { var requestCpu = container.RequestCpu != null?container.RequestCpu.ToString() : "NULL"; var requestMemory = container.RequestMemory != null?container.RequestMemory.ToString() : "NULL"; var limitCpu = container.LimitCpu != null?container.LimitCpu.ToString() : "NULL"; var limitMemory = container.LimitMemory != null?container.LimitMemory.ToString() : "NULL"; var containerError = container.RequestCpu == null || container.RequestMemory == null || container.LimitCpu == null || container.LimitMemory == null; var errorContainerMarker = containerError ? "-->" : " "; if (containerError || details) { Console.WriteLine($" {errorContainerMarker} {container.ContainerImage} [request-cpu={requestCpu}] [request-memory={requestMemory}] [limit-cpu={limitCpu}] [limit-memory={limitMemory}]"); } } } } else { Console.WriteLine(); Console.WriteLine($"OK: Container resources are set correctly."); } return(badPodSpecCount > 0); }