Ejemplo n.º 1
0
        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)
                    );
            }
        }
Ejemplo n.º 2
0
        /*
         * 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)
                    );
            }
        }
Ejemplo n.º 3
0
        // 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))));
        }
Ejemplo n.º 4
0
        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!");
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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
        }
Ejemplo n.º 7
0
        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);
        }
Ejemplo n.º 9
0
        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
                                )));
        }
Ejemplo n.º 10
0
        // 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
                                )));
        }
Ejemplo n.º 11
0
        // 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"
                                )));
        }
Ejemplo n.º 12
0
        // 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
                                )));
        }
Ejemplo n.º 13
0
        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();
            }
        }