Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
 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));
 }
Esempio n. 3
0
 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));
 }
Esempio n. 4
0
        /// <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);
        }