Example #1
0
        /// <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);
                    }
                }
            }
        }
Example #2
0
        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);
        }
Example #3
0
        /// <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);
        }