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);
}