static void Main(string[] args) { bool invalidInput = false; // read options var argsOption = new ArgsOption(); _ = Parser.Default.ParseArguments <ArgsOption> (args) .WithParsed(options => argsOption = options) .WithNotParsed(error => { invalidInput = true; Util.Log($"error occurs: {error}"); }); if (invalidInput) { return; } // parse agent config file AgentConfig agentConfig = new AgentConfig(); JobConfig jobConfig = new JobConfig(); //List<string> hosts = new List<string>(); if (argsOption.AgentConfigFile != null && argsOption.JobConfigFile != null) { var configLoader = new ConfigLoader(); agentConfig = configLoader.Load <AgentConfig> (argsOption.AgentConfigFile); jobConfig = configLoader.Load <JobConfig> (argsOption.JobConfigFile); Util.Log("finish loading config"); } var errCode = 0; var result = ""; AzureManager azureManager = null; BenchmarkVmBuilder vmBuilder = null; if (argsOption.ExtensionScriptDir == null) { azureManager = new AzureManager(); vmBuilder = new BenchmarkVmBuilder(agentConfig); } var resourceGroupName = ""; var signalrServiceName = ""; switch (argsOption.Step) { case "CreateSignalr": (errCode, result) = ShellHelper.CreateSignalrService(argsOption, 10); break; case "DeleteSignalr": (errCode, result) = ShellHelper.DeleteSignalr(argsOption); break; case "CreateAllAgentVMs": vmBuilder.CreateAgentVmsCore(); break; case "DeleteAllAgentVMs": azureManager.DeleteResourceGroup(vmBuilder.GroupName); break; case "CreateAppServerVm": vmBuilder.CreateAppServerVmCore(); break; case "CreateDogfoodSignalr": if (argsOption.ExtensionScriptDir == null) { Util.Log("extension scripts directory is not specified, so this function does not work"); } else { var destFile = System.IO.Path.Combine(argsOption.ExtensionScriptDir, "utils.sh"); if (argsOption.UtilsFilePath != null) { System.IO.File.Copy(argsOption.UtilsFilePath, destFile, true); } var postfix = Util.GenRandPrefix(); resourceGroupName = Util.GenResourceGroupName(postfix); signalrServiceName = Util.GenSignalRServiceName(postfix); var connectionString = DogfoodSignalROps.CreateDogfoodSignalRService(argsOption.ExtensionScriptDir, argsOption.Location, resourceGroupName, signalrServiceName, "Basic_DS2", argsOption.SignalRUnit); if (connectionString != null) { Util.Log($"Connection string is {connectionString} under resource group {resourceGroupName}"); } } break; case "DeleteDogfoodSignalr": if (argsOption.ExtensionScriptDir == null) { Util.Log("extension scripts directory is not specified, so this function does not work"); } else { if (argsOption.SignalRService == null || argsOption.ResourceGroup == null) { Util.Log("Please specify SignalR Service name and Resource Group you want to delete"); } else { var destFile = System.IO.Path.Combine(argsOption.ExtensionScriptDir, "utils.sh"); if (argsOption.UtilsFilePath != null) { System.IO.File.Copy(argsOption.UtilsFilePath, destFile, true); } DogfoodSignalROps.DeleteDogfoodSignalRService(argsOption.ExtensionScriptDir, argsOption.ResourceGroup, argsOption.SignalRService); } } break; case "RegisterDogfoodCloud": if (argsOption.ExtensionScriptDir == null) { Util.Log("extension scripts directory is not specified, so this function does not work"); } else { DogfoodSignalROps.RegisterDogfoodCloud(argsOption.ExtensionScriptDir); } break; case "UnregisterDogfoodCloud": if (argsOption.ExtensionScriptDir == null) { Util.Log("extension scripts directory is not specified, so this function does not work"); } else { DogfoodSignalROps.UnregisterDogfoodCloud(argsOption.ExtensionScriptDir); } break; case "debugmaclocal": { var repoRoot = "/Users/albertxavier/workspace/signalr_auto_test_framework"; // create agent & appserver vms agentConfig.AppServer = "localhost"; agentConfig.Slaves = new List <string> (); agentConfig.Slaves.Add("localhost"); // genrate host list var hosts = new List <string> (); hosts.Add(agentConfig.AppServer); agentConfig.Slaves.ForEach(slv => hosts.Add(slv)); hosts.Add(agentConfig.Master); // TODO: check if ssh success Task.Delay(20 * 1000).Wait(); var types = jobConfig.ServiceTypeList; var isSelfHost = true; if (jobConfig.ServiceTypeList == null || jobConfig.ServiceTypeList.Count == 0) { types = jobConfig.SignalrUnit; isSelfHost = false; } int indType = 0; foreach (var serviceType in types) { var unit = 1; unit = Convert.ToInt32(serviceType.Substring(4)); foreach (var transportType in jobConfig.TransportTypeList) { foreach (var hubProtocol in jobConfig.HubProtocolList) { foreach (var scenario in jobConfig.ScenarioList) { (int connectionBase, int connectionIncreaseStep, int connectionLength) = GetConnectionConfig(scenario, jobConfig, indType); (int groupNumBase, int groupNumStep, int groupNumLength) = GetGroupNumConfig(scenario, jobConfig, indType); for (var connection = connectionBase; connection < connectionBase + connectionIncreaseStep * jobConfig.ConnectionLength; connection += connectionIncreaseStep) { for (var groupNum = groupNumBase; groupNum < groupNumBase + groupNumStep * groupNumLength; groupNum += groupNumStep) { RunJob(serviceType, transportType, hubProtocol, scenario, connection, groupNum, jobConfig, agentConfig, argsOption, hosts, repoRoot, serverUrl: "localhost", useLocalSignalR: "false", waitTime: TimeSpan.FromSeconds(5)); } } } } } indType++; } break; } case "All": default: { // create agent & appserver vms while (true) { try { var createResourceTasks = new List <Task> (); createResourceTasks.Add(vmBuilder.CreateAppServerVm()); createResourceTasks.Add(vmBuilder.CreateAgentVms()); Task.WhenAll(createResourceTasks).Wait(); } catch (Exception ex) { Util.Log($"creating VMs Exception: {ex}"); Util.Log($"delete all vms"); azureManager.DeleteResourceGroup(vmBuilder.GroupName); azureManager.DeleteResourceGroup(vmBuilder.AppSvrGroupName); Util.Log($"going to retry creating vms in 1s"); Task.Delay(1000).Wait(); continue; } break; } agentConfig.AppServer = vmBuilder.AppSvrDomainName(); agentConfig.Slaves = new List <string> (); for (var i = 0; i < agentConfig.SlaveVmCount; i++) { agentConfig.Slaves.Add(vmBuilder.SlaveDomainName(i)); } // genrate host list var hosts = new List <string> (); hosts.Add(agentConfig.AppServer); agentConfig.Slaves.ForEach(slv => hosts.Add(slv)); hosts.Add(agentConfig.Master); // TODO: check if ssh success Task.Delay(20 * 1000).Wait(); (errCode, result) = ShellHelper.KillAllDotnetProcess(hosts, agentConfig, argsOption); (errCode, result) = ShellHelper.GitCloneRepo(hosts, agentConfig, argsOption.Commit, argsOption.Branch); var types = jobConfig.ServiceTypeList; var isSelfHost = true; if (jobConfig.ServiceTypeList == null || jobConfig.ServiceTypeList.Count == 0) { types = jobConfig.SignalrUnit; isSelfHost = false; } int indType = 0; foreach (var serviceType in types) { var unit = 1; unit = Convert.ToInt32(serviceType.Substring(4)); // create signalr service if (argsOption.AzureSignalrConnectionString == null || argsOption.AzureSignalrConnectionString == "") { while (true) { try { var createSignalrR = Task.Run(() => { (errCode, argsOption.AzureSignalrConnectionString) = ShellHelper.CreateSignalrService(argsOption, unit); }); Task.WhenAll(createSignalrR).Wait(); } catch (Exception ex) { Util.Log($"Creating SignalR Exception: {ex}"); Util.Log($"deleting all signalr services"); (errCode, result) = ShellHelper.DeleteSignalr(argsOption); // TODO what if delete fail Util.Log($"going to retry creating signalr service in 1s"); Task.Delay(1000).Wait(); continue; } break; } } foreach (var transportType in jobConfig.TransportTypeList) { foreach (var hubProtocol in jobConfig.HubProtocolList) { foreach (var scenario in jobConfig.ScenarioList) { (int connectionBase, int connectionIncreaseStep, int connectionLength) = GetConnectionConfig(scenario, jobConfig, indType); (int groupNumBase, int groupNumStep, int groupNumLength) = GetGroupNumConfig(scenario, jobConfig, indType); for (var connection = connectionBase; connection < connectionBase + connectionIncreaseStep * connectionLength; connection += connectionIncreaseStep) { for (var groupNum = groupNumBase; groupNum < groupNumBase + groupNumStep * groupNumLength; groupNum += groupNumStep) { RunJob(serviceType, transportType, hubProtocol, scenario, connection, groupNum, jobConfig, agentConfig, argsOption, hosts, repoRoot: "~/signalr_auto_test_framework", serverUrl: vmBuilder.AppSvrDomainName(), argsOption.UseLocalSignalR, waitTime: TimeSpan.FromSeconds(20)); } } } } } indType++; if (argsOption.UseLocalSignalR == "true" || argsOption.AzureSignalrConnectionString == null || argsOption.AzureSignalrConnectionString == "") { (errCode, result) = ShellHelper.DeleteSignalr(argsOption); } //(errCode, result) = ShellHelper.DeleteSignalr(argsOption); } //(errCode, result) = ShellHelper.GenerateAllReports(hosts, agentConfig); //azureManager.DeleteResourceGroup(vmBuilder.GroupName); //azureManager.DeleteResourceGroup(vmBuilder.AppSvrGroupName); break; } } }