private void ExecuteAllActionsForVMSS(ARMDeployment dep) { int instanceId = TryConvertInstanceNameToInstanceId(this.VMName); // TODO instead of using 0, take 5 random and use them instanceId = instanceId == -1 ? 0 : instanceId; Task <string> modelTask = null; SALsA.GetInstance(Id).ICM.QueueICMDiscussion(dep.ToString()); SALsA.GetInstance(Id).TaskManager.AddTask( BlobStorageUtility.SaveAndSendBlobTask(Constants.AnalyzerConsoleSerialOutputFilename, GenevaActions.GetVMConsoleSerialLogs(Id, dep, instanceId), Id), BlobStorageUtility.SaveAndSendBlobTask(Constants.AnalyzerVMScreenshotOutputFilename, GenevaActions.GetVMConsoleScreenshot(Id, dep, instanceId), Id), BlobStorageUtility.SaveAndSendBlobTask(Constants.AnalyzerVMModelAndViewOutputFilename, modelTask = GenevaActions.GetVMModelAndInstanceView(Id, dep, instanceId), Id), BlobStorageUtility.SaveAndSendBlobTask(Constants.AnalyzerInspectIaaSDiskOutputFilename, GenevaActions.InspectIaaSDiskForARMVM(Id, dep, instanceId), Id) ); var rawInfo = LogContainerId(modelTask, Id); if (rawInfo != null) { GlobalInfo.Update( new Guid(rawInfo.ContainerId), new Guid(rawInfo.NodeId), rawInfo.Cluster ); SALsA.GetInstance(Id).TaskManager.AddTask( BlobStorageUtility.SaveAndSendBlobTask(Constants.AnalyzerNodeDiagnosticsFilename, GenevaActions.GetNodeDiagnosticsFilesByContainerId(Id, GlobalInfo), Id) ); } }
/* * private bool AnalyzeHost() * { * var currentICM = SALsA.GetInstance(Id).ICM; * var title = currentICM.CurrentICM.Title; * var isHostIssue = Regex.Match(title, @"HostGAPlugin.*Cluster.*Node.*(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(\}){0,1}", RegexOptions.IgnoreCase).Success; * if (isHostIssue) * { * var splitTitle = title.ToLowerInvariant().Replace(" :", ":").Replace(": ", ":").Replace(",", " ").Replace(".", " ").Replace("nodeid", "node").Split(' '); * splitTitle = Array.FindAll(splitTitle, s => s.Contains(":")); * var dict = splitTitle.ToDictionary( * k => k.Split(':')[0], * e => e.Split(':')[1] * ); * var cluster = dict["cluster"]; * var nodeid = dict["node"]; * var creationTime = currentICM.CurrentICM.CreateDate; * var startTime = creationTime.AddHours(-12); * var endTime = new DateTime(Math.Min(creationTime.AddHours(+12).Ticks, DateTime.UtcNow.Ticks)); * SALsA.GetInstance(Id).TaskManager.AddTask( * Utility.SaveAndSendBlobTask(Constants.AnalyzerHostGAPluginFilename, * GenevaActions.GetNodeDiagnosticsFiles(Id, cluster, nodeid, startTime.ToString("s"), endTime.ToString("s")), Id) * ); * } * return isHostIssue; * } */ private void ExecuteAllActionsForIaaS(ARMDeployment dep) { Task <string> modelTask = null; SALsA.GetInstance(Id).ICM.QueueICMDiscussion(dep.ToString()); SALsA.GetInstance(Id).TaskManager.AddTask( BlobStorageUtility.SaveAndSendBlobTask(Constants.AnalyzerConsoleSerialOutputFilename, GenevaActions.GetVMConsoleSerialLogs(Id, dep), Id), BlobStorageUtility.SaveAndSendBlobTask(Constants.AnalyzerVMScreenshotOutputFilename, GenevaActions.GetVMConsoleScreenshot(Id, dep), Id), BlobStorageUtility.SaveAndSendBlobTask(Constants.AnalyzerVMModelAndViewOutputFilename, modelTask = GenevaActions.GetVMModelAndInstanceView(Id, dep), Id), BlobStorageUtility.SaveAndSendBlobTask(Constants.AnalyzerInspectIaaSDiskOutputFilename, GenevaActions.InspectIaaSDiskForARMVM(Id, dep), Id) ); var rawInfo = LogContainerId(modelTask, Id); if (rawInfo != null) { GlobalInfo.Update( new Guid(rawInfo.ContainerId), new Guid(rawInfo.NodeId), rawInfo.Cluster ); var startTime = SALsA.GetInstance(Id).ICM.ICMImpactStartTime().AddHours(-12); var endTime = new DateTime(Math.Min(startTime.AddHours(+24).Ticks, DateTime.UtcNow.Ticks)); SALsA.GetInstance(Id).TaskManager.AddTask( BlobStorageUtility.SaveAndSendBlobTask(Constants.AnalyzerNodeDiagnosticsFilename, GenevaActions.GetNodeDiagnosticsFilesByContainerId(Id, GlobalInfo), Id) ); } }
// TODO : make sovereign cloud available public static async Task <string> GetVMModelAndInstanceView(int icm, ARMDeployment deployment, int id) { Log.Information("Calling GenevaAction GetVMModelAndInstanceView of id:{0} with params {1}", id, deployment); var model = await GetVMView(icm, deployment, Constants.GetVMInfoOptionsVMSS[0], id); var instanceview = await GetVMView(icm, deployment, Constants.GetVMInfoOptionsVMSS[1], id); return(Utility.Beautify(Utility.JsonToObject <dynamic>(String.Format("{{\"VM Model\":{0},\"VM InstanceView\":{1}}}", model, instanceview)))); }
public static async Task Run([QueueTrigger(ARM_REQUEST_QUEUE)] ARMDeployment armDeployment, [Table(PARAM_TABLE, PARAM_PARTITION_KEY, PARAM_TOKEN_ROW)] Parameter accessToken, ILogger log) { ServiceLocator.BuildServiceProvider(log, accessToken.Value); var azureManager = ServiceLocator.GetRequiredService <IAzureManager>(); var results = await azureManager.DeployARMTemplateAsync(armDeployment); log.LogInformation($"C# Queue trigger DeployARMConfiguration processed: {armDeployment}"); log.LogInformation($"{armDeployment.Name} deployed!"); }
private ARMSubscription AnalyzeARMSubscriptionResult(string json) { var armSubscription = Utility.JsonToObject <ARMSubscriptionRaw>(json); if (armSubscription.value == null) { return(null); } var armAnalysed = new Dictionary <string, ARMDeployment>(); foreach (var deployment in armSubscription.value) { try { //"id": "/subscriptions/{sub}/resourceGroups/{rg}/providers/{provider}/{type}/{name}", var id = deployment.id.Split('/'); if (!Constants.AnalyszerARMDeploymentTypes.Contains(deployment.type.Split('/')[1])) { continue; } var dep = new ARMDeployment { Subscriptions = SubscriptionId.ToString(), ResourceGroups = id[4], Location = Constants.CRPRegions.Where(x => String.Equals(x, deployment.location, StringComparison.OrdinalIgnoreCase)).FirstOrDefault(), Name = deployment.name.Contains("/") ? deployment.name.Split('/')[0] : deployment.name, Type = deployment.type.Split('/')[1] }; if (String.IsNullOrEmpty(dep.Location)) { dep.Location = deployment.location; } if (!armAnalysed.ContainsKey(dep.Name)) { armAnalysed[dep.Name] = dep; } if (deployment.type.Split('/').Last() == Constants.AnalyzerARMDeploymentExtensionType) { armAnalysed[dep.Name].Extensions.Add(id.Last());; } } catch (Exception) { Log.Warning("Unable to get or analyse the ARM deployment {0}", deployment); continue; } } var deployments = new ARMSubscription() { deployments = armAnalysed.Values.Cast <ARMDeployment>().ToList() }; return(deployments); }
public static void Main(string[] args) { ARMDeployment deployment = new ARMDeployment("test", "scus"); //deployment.Deploy("01_KeyVault", "keyVault"); //deployment.Deploy("02a_VirtualNetwork", "vnet"); deployment.Deploy("03_AppInsights", "app-insights"); //deployment.Deploy("04_SQL", "sql"); //deployment.Deploy("04_SQLAlwaysOn", "sql"); //deployment.Deploy("05_ServiceBus", "servicebus"); //deployment.Deploy("20_ContainerRegistry", "registry"); //update sslCertificateThumbprint, clientCertificateThumbprints, vaultCertificates in parameters file before running //deployment.Deploy("21_Fabric", "fabric"); //Invoke-ServiceFabricEncryptText -CertStore -CertThumbprint "<thumbprint>" -Text "mysecret" -StoreLocation CurrentUser -StoreName My }
private ARMDeployment AnalyzeARMDeployment(ARMSubscription arm) { if (arm == null) { return(null); } ARMDeployment dep = new ARMDeployment(); try { ARMDeployment[] armDeps = arm.deployments.Where(x => x.Name.ToLower().Contains(this.VMName.ToLower()) || this.VMName.ToLower().Contains(x.Name.ToLower()) ).ToArray(); string VMName = TryConvertInstanceNameToVMName(this.VMName); if (armDeps.Length > 1) { var smallArmDeps = arm.deployments.Where(x => x.Name.ToLower() == VMName.ToLower() || x.Name.ToLower() == this.VMName.ToLower() ).ToArray(); if (smallArmDeps != null) { armDeps = smallArmDeps; } } if (armDeps.Length > 1) { Log.Error("Found more than one VM named {0} in RessourceGroup {1}, will take the first one.{2}{3}", VMName, ResourceGroupName, Environment.NewLine, armDeps); } if (armDeps.Length > 0) { dep = armDeps.First(); } else { // Probably paaS dep = null; } } catch { // Probably paaS dep = null; } return(dep); }
public async Task <IDeployment> DeployARMTemplateAsync(ARMDeployment armDeployment) { log.LogInformation("Starting deployment of {0} from Uri {1}", armDeployment.Name, armDeployment.TemplateUri.AbsoluteUri); var azure = GetAzureClient(); await CreateResourceGroupIfNotExistsAsync(armDeployment.ResourceGroup); var deployment = await azure.Deployments.Define(armDeployment.Name) .WithExistingResourceGroup(armDeployment.ResourceGroup.Name) .WithTemplateLink(armDeployment.TemplateUri.AbsoluteUri, armDeployment.TemplateContentVersion) .WithParameters(armDeployment.TemplateParametersJson) .WithMode(DeploymentMode.Complete) .CreateAsync(); return(deployment); }
public static Task <string> GetVMView(int icm, ARMDeployment deployment, string option) { Log.Information("Calling GenevaAction GetVMModelAndInstanceView of option:{0} with params {1}", option, deployment); var param = new GenevaOperations.GetVMModelAndInstanceView { smecrpregion = deployment.Location, smeresourcegroupnameparameter = deployment.ResourceGroups, smevmnameparameter = deployment.Name, wellknownsubscriptionid = deployment.Subscriptions, smegetvmoptionparameter = option }; var actionParam = Utility.JsonToObject <Dictionary <string, string> >(Utility.ObjectToJson(param)); var task = new GenevaAction(icm, Constants.GetVMInfoExtensionName, Constants.GetVMInfoOperationName, actionParam).GetOperationResultOutputAsync(icm); return(Task.Run(() => ( task.Result ))); }
// TODO : make sovereign cloud available public static Task <Image> GetVMConsoleScreenshot(int icm, ARMDeployment deployment) { Log.Information("Calling GenevaAction with params {0}", deployment); var param = new GenevaOperations.GetVMConsoleScreenshot { smecrpregion = deployment.Location, smeresourcegroupnameparameter = deployment.ResourceGroups, smevmnameparameter = deployment.Name, wellknownsubscriptionid = deployment.Subscriptions }; var actionParam = Utility.JsonToObject <Dictionary <string, string> >(Utility.ObjectToJson(param)); var task = new GenevaAction(icm, Constants.GetVMConsoleScreenshotExtensionName, Constants.GetVMConsoleScreenshotOperationName, actionParam).GetOperationFileOutputAsync(icm); // VMConsoleSerialLog contain only one file, compressed in a zip. return(Task.Run(() => ( task.Result != null ? Image.FromStream(Utility.ExtractZip(task.Result).Entries.Where(x => x.Name != "").First().Open()) : null ))); }
// TODO : make sovereign cloud available public static Task <String> GetVMConsoleSerialLogs(int icm, ARMDeployment deployment, int id) { Log.Information("Calling GetVMConsoleSerialLogs of id:{0} with params {1}", id, deployment); var param = new GenevaOperations.GetVMConsoleSerialLogsVMSS { smecrpregion = deployment.Location, smeresourcegroupnameparameter = deployment.ResourceGroups, smevirtualmachinescalesetnameparameter = deployment.Name, wellknownsubscriptionid = deployment.Subscriptions, smevirtualmachinescalesetvminstanceidparameter = id }; var actionParam = Utility.JsonToObject <Dictionary <string, string> >(Utility.ObjectToJson(param)); var task = new GenevaAction(icm, Constants.GetVMConsoleSerialLogsExtensionName, Constants.GetVMSSConsoleSerialLogsOperationName, actionParam).GetOperationFileOutputAsync(icm); // VMConsoleSerialLog contain only one file, compressed in a zip. return(Task.Run(() => ( task.Result != null ? new StreamReader(Utility.ExtractZip(task.Result).Entries.Where(x => x.Name != "").First().Open(), System.Text.Encoding.UTF8).ReadToEnd() : "N/A" ))); }
// TODO : make sovereign cloud available public static Task <Stream> InspectIaaSDiskForARMVM(int icm, ARMDeployment deployment) { var param = new GenevaOperations.InspectIaaSDiskForARMVM { smecrpregion = deployment.Location, smeresourcegroupname = deployment.ResourceGroups, smevmname = deployment.Name, wellknownscopedsubscriptionid = deployment.Subscriptions, smelogextractmode = Constants.InspectIaaSDiskForARMVMMode, smeskiptostep = Constants.InspectIaaSDiskForARMVMStep, smetimeoutinmins = Constants.InspectIaaSDiskForARMVMTimeout }; Log.Information("Calling InspectIaaSDiskForARMVM with params {0}", param); var actionParam = Utility.JsonToObject <Dictionary <string, string> >(Utility.ObjectToJson(param)); var task = new GenevaAction(icm, Constants.InspectIaaSDiskForARMVMExtensionName, Constants.InspectIaaSDiskForARMVMOperationName, actionParam).GetOperationFileOutputAsync(icm); // VMConsoleSerialLog contain only one file, compressed in a zip. return(Task.Run(() => ( task.Result ))); }
public Analyzer(int Id, object manualRun) { this.IsCustomRun = true; this.Id = Id; StartTime = SALsA.GetInstance(Id).ICM.CurrentICM.CreateDate; Log.Information("Received ManualRun order type {0} with param {1} : ", manualRun.GetType(), Utility.ObjectToJson(manualRun)); if (manualRun.GetType() == typeof(ManualRun_ICM)) { ManualRun_ICM manualArm = (ManualRun_ICM)manualRun; SubscriptionId = manualArm.SubscriptionID; ResourceGroupName = manualArm.ResourceGroupName; VMName = manualArm.VMName; AnalyzerInternal(); } else if (manualRun.GetType() == typeof(ManualRun_IID)) { ManualRun_IID manualIID = (ManualRun_IID)manualRun; SubscriptionId = manualIID.SubscriptionID; ResourceGroupName = manualIID.ResourceGroupName; VMName = manualIID.VMName; ARMDeployment dep = null; int instanceId = -1; if (String.IsNullOrEmpty(manualIID.Region)) { Log.Information("Calling automatic ARM VMdetection. No Region parameter provided."); ARMSubscription arm = AnalyzeARMSubscription(SubscriptionId, this.ResourceGroupName); dep = AnalyzeARMDeployment(arm); instanceId = TryConvertInstanceNameToInstanceId(this.VMName); } else { dep = new ARMDeployment(); dep.Name = manualIID.VMName; dep.Subscriptions = manualIID.SubscriptionID.ToString(); dep.ResourceGroups = manualIID.ResourceGroupName; dep.Location = manualIID.Region; instanceId = manualIID.Instance; } if (instanceId < 0) { Log.Information("No Instance ID detected. Assuming this is a normal single IaaS VM"); SALsA.GetInstance(Id).TaskManager.AddTask( BlobStorageUtility.SaveAndSendBlobTask( Constants.AnalyzerInspectIaaSDiskOutputFilename, GenevaActions.InspectIaaSDiskForARMVM(Id, dep), Id)); } else { Log.Information("No Instance ID detected. Assuming this is a normal single IaaS VM"); SALsA.GetInstance(Id).TaskManager.AddTask( BlobStorageUtility.SaveAndSendBlobTask( Constants.AnalyzerInspectIaaSDiskOutputFilename, GenevaActions.InspectIaaSDiskForARMVM(Id, dep, instanceId), Id)); } } else if (manualRun.GetType() == typeof(ManualRun_RDFE_Fabric)) { var rdfe = (ManualRun_RDFE_Fabric)manualRun; var vmInfo = new ShortRDFERoleInstance { ContainerID = new Guid(rdfe.ContainerID), Fabric = rdfe.FabricCluster, NodeId = new Guid(rdfe.NodeId) }; BlobStorageUtility.SaveAndSendBlobTask(Constants.AnalyzerNodeDiagnosticsFilename, GenevaActions.GetNodeDiagnosticsFilesByContainerId(Id, vmInfo), Id).Wait(); } else if (manualRun.GetType() == typeof(ManualRun_RDFE_Tenant)) { var rdfe = (ManualRun_RDFE_Tenant)manualRun; var vmInfo = new ShortRDFERoleInstance { Fabric = rdfe.FabricCluster, DeploymentId = rdfe.DeploymentID, InstanceName = rdfe.RoleInstanceName }; BlobStorageUtility.SaveAndSendBlobTask(Constants.AnalyzerNodeDiagnosticsFilename, GenevaActions.GetNodeDiagnosticsFilesByDeploymentIdorVMName(Id, vmInfo), Id).Wait(); } }