private (ComputeType type, object dep) DetectVMType(ARMSubscription arm, RDFESubscription rdfe) { var armDep = AnalyzeARMDeployment(arm); if (armDep == null) { var paasDep = AnalyseRDFEDeployment(rdfe); if (paasDep == null) { return(ComputeType.Unknown, null); } else { return(ComputeType.PaaS, paasDep); } } else { switch (armDep.Type) { case Constants.AnalyzerARMDeploymentIaaSType: return(ComputeType.IaaS, armDep); case Constants.AnalyzerARMDeploymentVMSSType: return(ComputeType.VMSS, armDep); default: return(ComputeType.Unknown, null); } } }
private (ARMSubscription arm, RDFESubscription rdfe) CallARMAndRDFE(bool checkARM = true, bool checkRDFE = true) { // TODO analyse ARM and REDFE in parallel ARMSubscription arm = checkARM ? AnalyzeARMSubscription(SubscriptionId, this.ResourceGroupName) : null; RDFESubscription rdfe = checkRDFE ? AnalyzeRDFESubscription(SubscriptionId) : null; return(arm, rdfe); }
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); }
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 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(); } }