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); } }
private async Task ResolveOwnerReferencesAsync(HttpClient httpClient, PodInfo podInfo, IReadOnlyList <OwnerReference> ownerReferences) { foreach (var ownerReference in ownerReferences) { await ResolveOwnerReferenceAsync(httpClient, podInfo, ownerReference); } }
////////////////////////////////////////////////////////////////////////// // 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; }
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); } }
////////////////////////////////////////////////////////////////////////// // 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; }