public async Task Get()

in src/WebUI/dotnet/WebPortal/Controllers/dlwsController.cs [214:411]


        public async Task<ActionResult> Get(string op)
        {
            var tuple = await processRestfulAPICommon();
            if (!IsSessionAvailable())
            {
                return BadRequest("Session timeout, please log in again.");
            }

            var ret = "invalid API call!";
            string url = "";
            var passwdLogin = tuple.Item1;
            if (!String.IsNullOrEmpty(tuple.Item2))
                return BadRequest(tuple.Item2);


            if (!User.Identity.IsAuthenticated && !passwdLogin)
            {
                return BadRequest("Unauthorized User, Please login!");
            }

            ViewData["Username"] = HttpContext.Session.GetString("Username");

            var cluster = HttpContext.Request.Query["cluster"];
            var authorizedClusters = JsonConvert.DeserializeObject<List<string>>(HttpContext.Session.GetString("AuthorizedClusters"));
            if (!authorizedClusters.Contains(cluster))
            {
                return BadRequest("Invalid cluster");
            }
            var restapi = Startup.Clusters[cluster].Restapi;

            switch (op)
            {
                case "GetVCs":
                    url = restapi + "/ListVCs?userName=" + HttpContext.Session.GetString("Email");
                    break;
                case "GetStorages":
                    url = restapi + "/ListStorages?vcName=" + HttpContext.Session.GetString("Team") + "&userName=" + HttpContext.Session.GetString("Email");
                    break;
                case "ListJobs":
                    url = restapi + "/ListJobs?vcName="+HttpContext.Session.GetString("Team")+"&jobOwner="+HttpContext.Session.GetString("Email") + "&userName=" + HttpContext.Session.GetString("Email");
                    if (HttpContext.Request.Query.ContainsKey("num"))
                    {
                        url += "&num=" + HttpContext.Request.Query["num"];
                    }
                    break;
                case "ListAllJobs":
                    if (HttpContext.Session.GetString("isAdmin").Equals("true"))
                    {
                        url = restapi + "/ListJobs?vcName=" + HttpContext.Session.GetString("Team") + "&jobOwner=all&userName=" + HttpContext.Session.GetString("Email");
                        if (HttpContext.Request.Query.ContainsKey("num"))
                        {
                            url += "&num=" + HttpContext.Request.Query["num"];
                        }
                    }
                    break;
                case "KillJob":
                    if (HttpContext.Request.Query.ContainsKey("jobId"))
                    {
                        url = restapi + "/KillJob?jobId=" + HttpContext.Request.Query["jobId"] + "&userName=" + HttpContext.Session.GetString("Email");
                    }
                    break;
                case "ApproveJob":
                    if (HttpContext.Request.Query.ContainsKey("jobId") && HttpContext.Session.GetString("isAdmin").Equals("true"))
                    {
                        url = restapi + "/ApproveJob?jobId=" + HttpContext.Request.Query["jobId"] + "&userName=" + HttpContext.Session.GetString("Email");
                    }
                    break;
                case "JobDetail":
                    if (HttpContext.Request.Query.ContainsKey("jobId"))
                    {
                        url = restapi + "/GetJobDetail?jobId=" + HttpContext.Request.Query["jobId"] + "&userName=" + HttpContext.Session.GetString("Email");
                    }
                    break;
                case "JobStatus":
                    if (HttpContext.Request.Query.ContainsKey("jobId"))
                    {
                        url = restapi + "/GetJobStatus?jobId=" + HttpContext.Request.Query["jobId"];
                    }
                    break;
                case "SubmitJob":
                    url = restapi + "/SubmitJob?";
                    foreach (var item in HttpContext.Request.Query)
                    {
                        //security check, user cannot append userName to the request url
                        if (item.Key.ToLower() != "username")
                        {
                            url += System.Text.Encodings.Web.UrlEncoder.Default.Encode(item.Key) + "=" +
                                   System.Text.Encodings.Web.UrlEncoder.Default.Encode(item.Value) + "&";
                        }
                    }
                    url += "userName=" + HttpContext.Session.GetString("Email") + "&";
                    url += "userId=" + HttpContext.Session.GetString("uid") + "&";
                    url += "vcName=" + HttpContext.Session.GetString("Team") + "&";
                    if (HttpContext.Request.Query.ContainsKey("runningasroot") &&
                        HttpContext.Request.Query["runningasroot"] == "1")
                    {
                        url += "containerUserId=0&";
                    }

                    var familyToken = Guid.NewGuid();

                    var newKey = _familyModel.Families.TryAdd(familyToken, new FamilyModel.FamilyData
                    {
                        ApiPath = restapi,
                        Email = HttpContext.Session.GetString("Email"),
                        UID = HttpContext.Session.GetString("uid")
                    });
                    if (!newKey)
                    {
                        ret = "Only 1 parent is allowed per family (maybe you tried to submit the same job on two threads?)";
                    }
                    url += $"familyToken={familyToken:N}&";
                    url += "isParent=1&";
                    break;
                case "GetClusterStatus":
                    url = restapi + "/GetClusterStatus?";
                    break;
                case "DeleteTemplate":
                    if (HttpContext.Request.Query.ContainsKey("name"))
                    {
                        var message = DeleteTemplateAsync(HttpContext.Request);
                        return Content("{ \"message\" : \"" + await message + "\"}");
                    }
                    break;
                case "GetTemplates":
                    var result = GetTemplatesAsync(HttpContext.Request.Query["type"]);
                    return Content(await result);
                case "GetDatabase":
                    var databaseJson = DownloadDatabase(HttpContext.Request);
                    return Content(await databaseJson);
                case "RunCommand":
                    if (HttpContext.Request.Query.ContainsKey("jobId") && HttpContext.Request.Query.ContainsKey("command"))
                    {
                        url = restapi + "/AddCommand?jobId=" + HttpContext.Request.Query["jobId"] + "&command=" + HttpContext.Request.Query["command"]
                             + "&userName=" + HttpContext.Session.GetString("Email");
                    }
                    break;
                case "GetCommands":
                    if (HttpContext.Request.Query.ContainsKey("jobId"))
                    {
                        url = restapi + "/GetCommands?jobId=" + HttpContext.Request.Query["jobId"] + "&userName=" + HttpContext.Session.GetString("Email");
                    }
                    break;
                case "GetEndpoints":
                    if (HttpContext.Request.Query.ContainsKey("jobId"))
                    {
                        url = restapi + "/endpoints?jobId=" + HttpContext.Request.Query["jobId"] + "&userName=" + HttpContext.Session.GetString("Email");
                    }
                    break;
                case "GetVC":
                    if (HttpContext.Request.Query.ContainsKey("vcName"))
                    {
                        url = restapi + "/GetVC?userName=" + HttpContext.Session.GetString("Email") + "&vcName=" + HttpContext.Request.Query["vcName"];
                    }
                    break;
            }

            if (url != "")
            {
                _logger.LogInformation("API call {0}", url);
                int counter = 3;
                bool success = false;
                while (counter > 0)
                {
                    try
                    {
                        using (var httpClient = new HttpClient())
                        {
                            var response1 = await httpClient.GetAsync(url);
                            var content = await response1.Content.ReadAsStringAsync();
                            ret = content;
                        }
                        counter = 0;
                        success = true;
                    }
                    catch (Exception e)
                    {
                        counter--;
                        _logger.LogInformation("API call fails {0},{1}", url, e.Message);
                        //TODO
                        //should add logger here
                    }
                }

                // if not success, try it again and return the restfulapi error as before. 
                if (!success)
                {

                    using (var httpClient = new HttpClient())
                    {
                        var response1 = await httpClient.GetAsync(url);
                        var content = await response1.Content.ReadAsStringAsync();
                        ret = content;
                    }
                }
            }
            return Content(ret);
        }