/// <summary> /// Create a new Deployment /// </summary> /// <param name="username"></param> /// <param name="volumeMounts"></param> /// <param name="volumes"></param> /// <returns></returns> private KubectlPod CreateDeployment(KubectlPod k8srequest) { KubectlPod response = null; HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(AppSettings["K8S_API_URL_DEPL"]); webRequest.Method = "POST"; webRequest.ContentType = "application/json"; webRequest.Headers["Authorization"] = "Bearer " + AppSettings["K8S_API_TOKEN"]; string json = JsonSerializer.SerializeToString <KubectlPod>(k8srequest); using (var streamWriter = new StreamWriter(webRequest.GetRequestStream())) { streamWriter.Write(json); streamWriter.Flush(); streamWriter.Close(); using (var httpResponse = (HttpWebResponse)webRequest.GetResponse()) { using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { string result = streamReader.ReadToEnd(); response = JsonSerializer.DeserializeFromString <KubectlPod>(result); return(response); } } } }
protected string GetUserVncUrl(IfyContext context, User user, KubectlPod k8srequest) { var k8sFactory = new KubernetesFactory(context); //check if connection already exists and is still valid var type = "qgis"; var id = k8sFactory.GetVncIDForUser(context, user.Id, type); if (id != 0) { if (k8sFactory.ExistsGuacamoleConnection(id)) { return(k8sFactory.GetGuacamoleVncUrl(id)); } else { k8sFactory.DeleteVncIDForUser(context, user.Id, type); } } //check if pod already exists var pod = k8sFactory.GetPod(user.Username); //if not, we may create it (optional) if (pod == null && k8srequest != null) { pod = k8sFactory.CreateUserQgisEnvironment(user.Username, k8srequest); } //if exists, we save info on guacamole and return the url if (pod != null) { if (!k8sFactory.IsUserOnGuacamole(user.Username)) { k8sFactory.CreateUserOnGuacamole(user.Username); } int podID; if (!k8sFactory.IsPodOnGuacamole(pod.Identifier)) { podID = k8sFactory.CreateGuacamoleVncConnection(user.Username, pod.Identifier, pod.IP); } else { podID = k8sFactory.GetGuacamoleConnectionID(pod.Identifier); } if (!k8sFactory.ExistsGuacamoleUserConnectionPermission(podID, user.Username)) { k8sFactory.AddConnectionPermission(podID, user.Username); } k8sFactory.SetVncIDForUser(context, user.Id, podID, type); return(k8sFactory.GetGuacamoleVncUrl(podID)); } return(null); }
/// <summary> /// Create user QGIS environment /// </summary> /// <param name="username"></param> /// <param name="volumeMounts"></param> /// <param name="volumes"></param> /// <returns></returns> public KubectlPod CreateUserQgisEnvironment(string username, KubectlPod k8srequest) { //pvc var pvc = GetPvc(username); if (pvc == null) { pvc = CreatePvc(username); } //pod var pod = GetPod(username); if (pod == null) { pod = CreateDeployment(k8srequest); } int i = 0; int maxtry = int.Parse(AppSettings["K8S_DESCRIBE_MAX_TRY"]); int sleep = int.Parse(AppSettings["K8S_DESCRIBE_SLEEP_MS"]); string pvcstatus = pvc != null && pvc.status != null ? pvc.status.phase : K8sPodStatus.Pending; string podstatus = pod != null && pod.status != null ? pod.status.phase : K8sPodStatus.Pending; while (podstatus != K8sPodStatus.Running && pvcstatus != K8sPodStatus.Running && i++ <= maxtry) { if (pvcstatus != K8sPodStatus.Running) { pvc = GetPvc(username); if (pvc != null && pvc.status != null) { pvcstatus = pvc.status.phase; } } if (podstatus != K8sPodStatus.Running) { pod = GetPod(username); if (pod != null && pod.status != null) { podstatus = pod.status.phase; } } System.Threading.Thread.Sleep(sleep); } return(pod); }