Example #1
0
        public async Task <IPodInfo> CreatePodInfoAsync(OwnerReferencesResolve resolve)
        {
            using (var httpClient = CreateHttpClient())
            {
                // Endpoints:
                // /api/v1/namespaces/<Namespace>/pods/<PodName>
                // /apis/apps/v1/namespaces/<Namespace>/replicasets/<ReplicaSetName>
                // /apis/apps/v1/namespaces/<Namespace>/deployments/<DeploymentName>

                var podNamespace = Namespace;
                var podHostName  = HostName;

                var reader = await GetJsonAsync(httpClient, $"/api/v1/namespaces/{podNamespace}/pods/{podHostName}");

                var pod     = new Internal.Kubernetes.Pod(ref reader);
                var podInfo = new PodInfo(pod);

                if (resolve == OwnerReferencesResolve.All)
                {
                    await ResolveOwnerReferencesAsync(httpClient, podInfo, pod.Metadata.OwnerReferences);
                }

                return(podInfo);
            }
        }
Example #2
0
 private async Task ResolveOwnerReferencesAsync(HttpClient httpClient, PodInfo podInfo, IReadOnlyList <OwnerReference> ownerReferences)
 {
     foreach (var ownerReference in ownerReferences)
     {
         await ResolveOwnerReferenceAsync(httpClient, podInfo, ownerReference);
     }
 }
Example #3
0
        //////////////////////////////////////////////////////////////////////////
        // Verify Dlls
        //////////////////////////////////////////////////////////////////////////

        static void verifyDlls()
        {
            // get dirs
            string podDir = FileUtil.combine(Sys.m_homeDir, "lib", "fan");
            string tmpDir = FileUtil.combine(Sys.m_homeDir, "lib", "tmp");

            // check our tmp dir - cleaning up out-of-date DLL and PDB files
            if (Directory.Exists(tmpDir))
            {
                string[]  tmp  = Directory.GetFiles(tmpDir, "*.dll");
                Hashtable keep = new Hashtable();

                string   sysDll      = FileUtil.combine(Sys.m_homeDir, "lib", "dotnet", "sys.dll");
                DateTime sysModified = File.GetLastWriteTime(sysDll);

                if (debug)
                {
                    System.Console.WriteLine("\n sys  " + sysModified + "\n");
                    System.Console.WriteLine(pad(" pod", 15) + pad("action", 10) + pad("podTime", 25) + pad("dllTime", 25));
                    System.Console.WriteLine(pad(" ---", 15) + pad("------", 10) + pad("-------", 25) + pad("-------", 25));
                }

                for (int i = 0; i < tmp.Length; i++)
                {
                    string   dll         = tmp[i];
                    int      start       = dll.LastIndexOf("\\") + 1;
                    int      end         = dll.IndexOf(".");
                    string   name        = dll.Substring(start, end - start);
                    DateTime podModified = DateTime.MinValue;
                    DateTime dllModified = DateTime.MinValue;

                    // native get handled by pod
                    if (name.EndsWith("Native_"))
                    {
                        continue;
                    }

                    // check for pod
                    string pod = FileUtil.combine(podDir, name + ".pod");
                    if (File.Exists(pod))
                    {
                        // if the DLL is still up-to-date, just reuse it
                        podModified = File.GetLastWriteTime(pod);
                        dllModified = File.GetLastWriteTime(dll);
                        if (podModified < dllModified)
                        {
                            keep[name] = new PodInfo(Pod.find(name, false), dllModified);
                        }
                    }

                    if (debug)
                    {
                        PodInfo       info = keep[name] as PodInfo;
                        StringBuilder b    = new StringBuilder(pad(" " + name, 15));
                        b.Append(pad(keep[name] != null ? "[keep]" : "[delete]", 10));
                        if (podModified != DateTime.MinValue)
                        {
                            b.Append(pad(podModified.ToString(), 25));
                        }
                        if (dllModified != DateTime.MinValue)
                        {
                            b.Append(pad(dllModified.ToString(), 25));
                        }
                        System.Console.WriteLine(b);
                    }
                }

                if (debug)
                {
                    System.Console.WriteLine("");
                }

                // check pod dependencies
                string[] keys = new string[keep.Count];
                keep.Keys.CopyTo(keys, 0);
                for (int k = 0; k < keys.Length; k++)
                {
                    string  name = keys[k];
                    PodInfo info = keep[name] as PodInfo;

                    // check sys first
                    if (info.modified < sysModified)
                    {
                        keep.Remove(name);
                        if (debug)
                        {
                            System.Console.WriteLine(pad(" " + name, 15) + "[delete] due to sys");
                        }
                        continue;
                    }

                    // check for out-of-date depends
                    List depends = info.pod.depends();
                    for (int i = 0; i < depends.sz(); i++)
                    {
                        Depend d = depends.get(i) as Depend;
                        string n = d.name();
                        if (n == "sys")
                        {
                            continue; // skip sys
                        }
                        if (keep[n] == null)
                        {
                            keep.Remove(name);
                            if (debug)
                            {
                                System.Console.WriteLine(pad(" " + name, 15) + "[delete] due to " + n);
                            }
                            break;
                        }
                    }
                }

                if (debug)
                {
                    if (keep.Count > 0)
                    {
                        System.Console.WriteLine("");
                        foreach (string key in keep.Keys)
                        {
                            System.Console.WriteLine(" [keep]  " + key);
                        }
                    }
                    System.Console.WriteLine("");
                }

                // delete out-of-date
                for (int i = 0; i < tmp.Length; i++)
                {
                    string dll   = tmp[i];
                    int    start = dll.LastIndexOf("\\") + 1;
                    int    end   = dll.IndexOf(".");
                    string name  = dll.Substring(start, end - start);
                    string pdb   = FileUtil.combine(tmpDir, name + ".pdb");

                    // native get handled by pod
                    if (name.EndsWith("Native_"))
                    {
                        name = name.Substring(0, name.Length - "Native_".Length);
                    }

                    // if keep, skip
                    if (keep[name] != null)
                    {
                        continue;
                    }

                    // nuke it!
                    if (debug)
                    {
                        System.Console.WriteLine(" [delete]  " + tmp[i]);
                        if (File.Exists(pdb))
                        {
                            System.Console.WriteLine(" [delete]  " + pdb);
                        }
                    }
                    File.Delete(dll);
                    File.Delete(pdb);
                }

                if (debug)
                {
                    System.Console.WriteLine("");
                }
            }

            // mark env as initialized
            isInit = true;
        }
Example #4
0
        private async Task ResolveOwnerReferenceAsync(HttpClient httpClient, PodInfo podInfo, OwnerReference ownerReference)
        {
            JsonReader    reader;
            IMetaV1Object?obj = default;

            switch (ownerReference.Kind)
            {
            case "StatefulSet" when ownerReference.ApiVersion == "apps/v1":
                reader = await GetJsonAsync(httpClient, $"/apis/apps/v1/namespaces/{podInfo.Namespace}/statefulsets/{ownerReference.Name}");

                var statefulSet = new StatefulSet(ref reader);
                obj = statefulSet;
                podInfo.StatefulSet = new StatefulSetInfo(statefulSet);
                break;

            case "DaemonSet" when ownerReference.ApiVersion == "apps/v1":
                reader = await GetJsonAsync(httpClient, $"/apis/apps/v1/namespaces/{podInfo.Namespace}/daemonsets/{ownerReference.Name}");

                var daemonSet = new DaemonSet(ref reader);
                obj = daemonSet;
                podInfo.DaemonSet = new DaemonSetInfo(daemonSet);
                break;

            case "ReplicaSet" when ownerReference.ApiVersion == "apps/v1":
                reader = await GetJsonAsync(httpClient, $"/apis/apps/v1/namespaces/{podInfo.Namespace}/replicasets/{ownerReference.Name}");

                var replicaSet = new ReplicaSet(ref reader);
                obj = replicaSet;
                podInfo.ReplicaSet = new ReplicaSetInfo(replicaSet);
                break;

            case "Deployment" when ownerReference.ApiVersion == "apps/v1":
                reader = await GetJsonAsync(httpClient, $"/apis/apps/v1/namespaces/{podInfo.Namespace}/deployments/{ownerReference.Name}");

                var deployment = new Deployment(ref reader);
                obj = deployment;
                podInfo.Deployment = new DeploymentInfo(deployment);
                break;

            case "Job" when ownerReference.ApiVersion == "batch/v1":
                reader = await GetJsonAsync(httpClient, $"/apis/batch/v1/namespaces/{podInfo.Namespace}/jobs/{ownerReference.Name}");

                var job = new Job(ref reader);
                obj         = job;
                podInfo.Job = new JobInfo(job);
                break;

            case "CronJob" when ownerReference.ApiVersion == "batch/v1beta1":
                reader = await GetJsonAsync(httpClient, $"/apis/{ownerReference.ApiVersion}/namespaces/{podInfo.Namespace}/cronjobs/{ownerReference.Name}");

                var cronJob = new CronJob(ref reader);
                obj             = cronJob;
                podInfo.CronJob = new CronJobInfo(cronJob);
                break;
            }

            if (obj != null)
            {
                await ResolveOwnerReferencesAsync(httpClient, podInfo, obj.Metadata.OwnerReferences);
            }
        }
Example #5
0
File: Tool.cs Project: nomit007/f4
        //////////////////////////////////////////////////////////////////////////
        // Verify Dlls
        //////////////////////////////////////////////////////////////////////////
        static void verifyDlls()
        {
            // get dirs
              string podDir = FileUtil.combine(Sys.m_homeDir, "lib", "fan");
              string tmpDir = FileUtil.combine(Sys.m_homeDir, "lib", "tmp");

              // check our tmp dir - cleaning up out-of-date DLL and PDB files
              if (Directory.Exists(tmpDir))
              {
            string[] tmp = Directory.GetFiles(tmpDir, "*.dll");
            Hashtable keep = new Hashtable();

            string sysDll = FileUtil.combine(Sys.m_homeDir, "lib", "dotnet", "sys.dll");
            DateTime sysModified = File.GetLastWriteTime(sysDll);

            if (debug)
            {
              System.Console.WriteLine("\n sys  " + sysModified + "\n");
              System.Console.WriteLine(pad(" pod", 15) + pad("action", 10) + pad("podTime", 25) + pad("dllTime", 25));
              System.Console.WriteLine(pad(" ---", 15) + pad("------", 10) + pad("-------", 25) + pad("-------", 25));
            }

            for (int i=0; i<tmp.Length; i++)
            {
              string dll  = tmp[i];
              int start   = dll.LastIndexOf("\\")+1;
              int end     = dll.IndexOf(".");
              string name = dll.Substring(start, end-start);
              DateTime podModified = DateTime.MinValue;
              DateTime dllModified = DateTime.MinValue;

              // native get handled by pod
              if (name.EndsWith("Native_")) continue;

              // check for pod
              string pod  = FileUtil.combine(podDir, name+".pod");
              if (File.Exists(pod))
              {
            // if the DLL is still up-to-date, just reuse it
            podModified = File.GetLastWriteTime(pod);
            dllModified = File.GetLastWriteTime(dll);
            if (podModified < dllModified)
              keep[name] = new PodInfo(Pod.find(name, false), dllModified);
              }

              if (debug)
              {
            PodInfo info = keep[name] as PodInfo;
            StringBuilder b = new StringBuilder(pad(" "+name, 15));
            b.Append(pad(keep[name] != null ? "[keep]" : "[delete]", 10));
            if (podModified != DateTime.MinValue) b.Append(pad(podModified.ToString(), 25));
            if (dllModified != DateTime.MinValue) b.Append(pad(dllModified.ToString(), 25));
            System.Console.WriteLine(b);
              }
            }

            if (debug) System.Console.WriteLine("");

            // check pod dependencies
            string[] keys = new string[keep.Count];
            keep.Keys.CopyTo(keys, 0);
            for (int k=0; k<keys.Length; k++)
            {
              string name = keys[k];
              PodInfo info = keep[name] as PodInfo;

              // check sys first
              if (info.modified < sysModified)
              {
            keep.Remove(name);
            if (debug) System.Console.WriteLine(pad(" "+name,15)+"[delete] due to sys");
            continue;
              }

              // check for out-of-date depends
              List depends = info.pod.depends();
              for (int i=0; i<depends.sz(); i++)
              {
            Depend d = depends.get(i) as Depend;
            string n = d.name();
            if (n == "sys") continue; // skip sys
            if (keep[n] == null)
            {
              keep.Remove(name);
              if (debug) System.Console.WriteLine(pad(" "+name,15)+"[delete] due to " + n);
              break;
            }
              }
            }

            if (debug)
            {
              if (keep.Count > 0)
              {
            System.Console.WriteLine("");
            foreach (string key in keep.Keys)
              System.Console.WriteLine(" [keep]  " + key);
              }
              System.Console.WriteLine("");
            }

            // delete out-of-date
            for (int i=0; i<tmp.Length; i++)
            {
              string dll  = tmp[i];
              int start   = dll.LastIndexOf("\\")+1;
              int end     = dll.IndexOf(".");
              string name = dll.Substring(start, end-start);
              string pdb  = FileUtil.combine(tmpDir, name+".pdb");

              // native get handled by pod
              if (name.EndsWith("Native_"))
            name = name.Substring(0, name.Length-"Native_".Length);

              // if keep, skip
              if (keep[name] != null) continue;

              // nuke it!
              if (debug)
              {
            System.Console.WriteLine(" [delete]  " + tmp[i]);
            if (File.Exists(pdb)) System.Console.WriteLine(" [delete]  " + pdb);
              }
              File.Delete(dll);
              File.Delete(pdb);
            }

            if (debug) System.Console.WriteLine("");
              }

              // mark env as initialized
              isInit = true;
        }