public void AzChangeFailureRateLiveControllerIntegrationTest()
        {
            //Arrange
            bool           getSampleData           = false;
            string         organization            = "samsmithnz";
            string         project                 = "SamLearnsAzure";
            string         branch                  = "refs/heads/master";
            string         buildName               = "SamLearnsAzure.CI";
            DevOpsPlatform targetDevOpsPlatform    = DevOpsPlatform.AzureDevOps;
            int            numberOfDays            = 30;
            int            maxNumberOfItems        = 20;
            ChangeFailureRateController controller = new ChangeFailureRateController(Configuration);

            //Act
            ChangeFailureRateModel model = controller.GetChangeFailureRate(getSampleData,
                                                                           targetDevOpsPlatform, organization, project, branch, buildName, numberOfDays, maxNumberOfItems);

            //Assert
            Assert.IsTrue(model != null);
            Assert.IsTrue(model.TargetDevOpsPlatform == targetDevOpsPlatform);
            Assert.IsTrue(model.DeploymentName == buildName);
            Assert.IsTrue(model.ChangeFailureRateMetric >= 0f);
            Assert.AreEqual(false, string.IsNullOrEmpty(model.ChangeFailureRateMetricDescription));
            Assert.AreEqual(numberOfDays, model.NumberOfDays);
            Assert.IsTrue(model.MaxNumberOfItems > 0);
            Assert.IsTrue(model.TotalItems > 0);
        }
        public void TimeToRestoreServiceDALiveIntegrationTest()
        {
            //Arrange
            bool             getSampleData        = false;
            TableStorageAuth tableStorageAuth     = Common.GenerateTableAuthorization(Configuration);
            string           resourceGroup        = "SamLearnsAzureProd";
            DevOpsPlatform   targetDevOpsPlatform = DevOpsPlatform.AzureDevOps;
            int numberOfDays     = 30;
            int maxNumberOfItems = 20;

            //Act
            MeanTimeToRestoreDA    da    = new MeanTimeToRestoreDA();
            MeanTimeToRestoreModel model = da.GetAzureMeanTimeToRestore(getSampleData, tableStorageAuth, targetDevOpsPlatform, resourceGroup, numberOfDays, maxNumberOfItems);

            //Assert
            Assert.IsTrue(model != null);
            Assert.IsTrue(model.TargetDevOpsPlatform == targetDevOpsPlatform);
            Assert.AreEqual(resourceGroup, model.ResourceGroup);
            Assert.IsTrue(model.MeanTimeToRestoreEvents.Count > 0);
            Assert.IsTrue(model.MTTRAverageDurationInHours > 0);
            Assert.IsTrue(model.MTTRAverageDurationDescription != "");
            Assert.AreEqual(numberOfDays, model.NumberOfDays);
            Assert.IsTrue(model.MaxNumberOfItems > 0);
            Assert.IsTrue(model.TotalItems > 0);
        }
        public void AzChangeFailureRateDAIntegrationTest()
        {
            //Arrange
            bool             getSampleData        = true;
            TableStorageAuth tableStorageAuth     = Common.GenerateTableAuthorization(Configuration);
            string           organization         = "samsmithnz";
            string           project              = "SamLearnsAzure";
            string           branch               = "refs/heads/master";
            string           buildName            = "SamLearnsAzure.CI";
            DevOpsPlatform   targetDevOpsPlatform = DevOpsPlatform.AzureDevOps;
            int numberOfDays     = 30;
            int maxNumberOfItems = 20;

            //Act
            ChangeFailureRateDA    da    = new ChangeFailureRateDA();
            ChangeFailureRateModel model = da.GetChangeFailureRate(getSampleData, tableStorageAuth,
                                                                   targetDevOpsPlatform, organization, project, branch, buildName, numberOfDays, maxNumberOfItems);

            //Assert
            Assert.IsTrue(model != null);
            Assert.IsTrue(model.TargetDevOpsPlatform == DevOpsPlatform.AzureDevOps);
            Assert.IsTrue(model.DeploymentName != "");
            Assert.IsTrue(model.ChangeFailureRateMetric > 0f);
            Assert.IsTrue(model.ChangeFailureRateBuildList.Count <= 20f);
            Assert.AreEqual(false, string.IsNullOrEmpty(model.ChangeFailureRateMetricDescription));
            Assert.AreNotEqual("Elite", model.ChangeFailureRateMetricDescription);
            Assert.AreEqual(numberOfDays, model.NumberOfDays);
            Assert.IsTrue(model.MaxNumberOfItems > 0);
            Assert.IsTrue(model.TotalItems > 0);
        }
        public void GHChangeFailureRateDAIntegrationTest()
        {
            //Arrange
            bool             getSampleData        = true;
            TableStorageAuth tableStorageAuth     = Common.GenerateTableAuthorization(Configuration);
            string           owner                = "samsmithnz";
            string           repo                 = "DevOpsMetrics";
            string           branch               = "master";
            string           workflowName         = "DevOpsMetrics CI/CD";
            DevOpsPlatform   targetDevOpsPlatform = DevOpsPlatform.GitHub;
            int numberOfDays     = 30;
            int maxNumberOfItems = 20;

            //Act
            ChangeFailureRateDA    da    = new ChangeFailureRateDA();
            ChangeFailureRateModel model = da.GetChangeFailureRate(getSampleData, tableStorageAuth,
                                                                   targetDevOpsPlatform, owner, repo, branch, workflowName, numberOfDays, maxNumberOfItems);

            //Assert
            Assert.IsTrue(model != null);
            Assert.IsTrue(model.TargetDevOpsPlatform == targetDevOpsPlatform);
            Assert.IsTrue(model.DeploymentName != "");
            Assert.IsTrue(model.ChangeFailureRateMetric > 0f);
            Assert.IsTrue(model.ChangeFailureRateBuildList.Count <= 20f);
            Assert.AreEqual(false, string.IsNullOrEmpty(model.ChangeFailureRateMetricDescription));
            Assert.AreNotEqual("Elite", model.ChangeFailureRateMetricDescription);
            Assert.AreEqual(numberOfDays, model.NumberOfDays);
            Assert.IsTrue(model.MaxNumberOfItems > 0);
            Assert.IsTrue(model.TotalItems > 0);
        }
        public void AzureMTTRSampleControllerIntegrationTest()
        {
            //Arrange
            bool           getSampleData           = true;
            string         resourceGroupName       = "SamLearnsAzureProd";
            DevOpsPlatform targetDevOpsPlatform    = DevOpsPlatform.AzureDevOps;
            int            numberOfDays            = 7;
            int            maxNumberOfItems        = 20;
            MeanTimeToRestoreController controller = new(base.Configuration);

            //Act
            MeanTimeToRestoreModel model = controller.GetAzureMeanTimeToRestore(getSampleData, targetDevOpsPlatform, resourceGroupName, numberOfDays, maxNumberOfItems);

            //Assert
            Assert.IsTrue(model != null);
            Assert.AreEqual(targetDevOpsPlatform, model.TargetDevOpsPlatform);
            Assert.AreEqual(resourceGroupName, model.ResourceGroup);
            Assert.IsTrue(model.MeanTimeToRestoreEvents.Count > 0);
            Assert.IsTrue(model.MeanTimeToRestoreEvents[0].Name == "Name1");
            Assert.IsTrue(model.MeanTimeToRestoreEvents[0].Resource == "Resource1");
            Assert.IsTrue(model.MeanTimeToRestoreEvents[0].Status == "Completed");
            Assert.IsTrue(model.MeanTimeToRestoreEvents[0].Url == "https://mttr.com");
            Assert.IsTrue(model.MeanTimeToRestoreEvents[0].StartTime > DateTime.MinValue);
            Assert.IsTrue(model.MeanTimeToRestoreEvents[0].EndTime > DateTime.MinValue);
            Assert.IsTrue(model.MeanTimeToRestoreEvents[0].ResourceGroup == resourceGroupName);
            Assert.IsTrue(model.MeanTimeToRestoreEvents[0].MTTRDurationInHours > 0f);
            Assert.IsTrue(model.MeanTimeToRestoreEvents[0].MTTRDurationPercent > 0f);
            Assert.IsTrue(model.MeanTimeToRestoreEvents[0].ItemOrder == 1);
            Assert.AreEqual(numberOfDays, model.NumberOfDays);
            Assert.IsTrue(model.MaxNumberOfItems > 0);
            Assert.IsTrue(model.TotalItems > 0);
        }
        public void AzureMTTRsAPIControllerIntegrationTest()
        {
            //Arrange
            bool           getSampleData           = false;
            string         resourceGroupName       = "SamLearnsAzureProd";
            DevOpsPlatform targetDevOpsPlatform    = DevOpsPlatform.AzureDevOps;
            int            numberOfDays            = 60;
            int            maxNumberOfItems        = 20;
            MeanTimeToRestoreController controller = new(base.Configuration);

            //Act
            MeanTimeToRestoreModel model = controller.GetAzureMeanTimeToRestore(getSampleData, targetDevOpsPlatform, resourceGroupName, numberOfDays, maxNumberOfItems);

            //Assert
            Assert.IsTrue(model != null);
            Assert.AreEqual(targetDevOpsPlatform, model.TargetDevOpsPlatform);
            Assert.AreEqual(resourceGroupName, model.ResourceGroup);
            Assert.IsTrue(model.MeanTimeToRestoreEvents.Count >= 0);
            if (model.MeanTimeToRestoreEvents.Count > 0)
            {
                Assert.IsTrue(model.MeanTimeToRestoreEvents[0].Name != "");
                Assert.IsTrue(model.MeanTimeToRestoreEvents[0].Resource != "");
                Assert.IsTrue(model.MeanTimeToRestoreEvents[0].Status != "");
                Assert.IsTrue(model.MeanTimeToRestoreEvents[0].Url != "");
                Assert.IsTrue(model.MeanTimeToRestoreEvents[0].StartTime >= DateTime.MinValue);
                Assert.IsTrue(model.MeanTimeToRestoreEvents[0].EndTime >= DateTime.MinValue);
                Assert.IsTrue(model.MeanTimeToRestoreEvents[0].ResourceGroup != "");
                Assert.IsTrue(model.MeanTimeToRestoreEvents[0].MTTRDurationInHours > 0f);
                Assert.IsTrue(model.MeanTimeToRestoreEvents[0].MTTRDurationPercent > 0f);
                Assert.IsTrue(model.MeanTimeToRestoreEvents[0].ItemOrder >= 1);
            }
            Assert.AreEqual(numberOfDays, model.NumberOfDays);
            Assert.IsTrue(model.MaxNumberOfItems >= 0);
            Assert.IsTrue(model.TotalItems >= 0);
        }
        public void GHChangeFailureRateLiveControllerIntegrationTest()
        {
            //Arrange
            bool           getSampleData           = false;
            string         owner                   = "samsmithnz";
            string         repo                    = "SamsFeatureFlags";
            string         branch                  = "master";
            string         workflowName            = "SamsFeatureFlags.CI/CD";
            DevOpsPlatform targetDevOpsPlatform    = DevOpsPlatform.GitHub;
            int            numberOfDays            = 7;
            int            maxNumberOfItems        = 20;
            ChangeFailureRateController controller = new ChangeFailureRateController(Configuration);

            //Act
            ChangeFailureRateModel model = controller.GetChangeFailureRate(getSampleData,
                                                                           targetDevOpsPlatform, owner, repo, branch, workflowName, numberOfDays, maxNumberOfItems);

            //Assert
            Assert.IsTrue(model != null);
            Assert.IsTrue(model.TargetDevOpsPlatform == targetDevOpsPlatform);
            Assert.IsTrue(model.DeploymentName == workflowName);
            Assert.IsTrue(model.ChangeFailureRateMetric >= 0f);
            Assert.AreEqual(false, string.IsNullOrEmpty(model.ChangeFailureRateMetricDescription));
            Assert.AreEqual(numberOfDays, model.NumberOfDays);
            Assert.IsTrue(model.MaxNumberOfItems > 0);
            Assert.IsTrue(model.TotalItems > 0);
        }
Пример #8
0
        public async Task <IActionResult> UpdateChangeFailureRate(string ProjectIdSelected, int CompletionPercentSelected, int NumberOfDaysSelected)
        {
            ServiceApiClient serviceApiClient = new ServiceApiClient(Configuration);

            //Get a list of settings
            List <AzureDevOpsSettings> azureDevOpsSettings = await serviceApiClient.GetAzureDevOpsSettings();

            List <GitHubSettings> githubSettings = await serviceApiClient.GetGitHubSettings();

            //Create project items from each setting and add it to a project list.
            DevOpsPlatform targetDevOpsPlatform   = DevOpsPlatform.Unknown;
            string         organization_owner     = "";
            string         project_repo           = "";
            string         repository             = "";
            string         buildName_workflowName = "";

            foreach (AzureDevOpsSettings item in azureDevOpsSettings)
            {
                if (item.RowKey == ProjectIdSelected)
                {
                    targetDevOpsPlatform   = DevOpsPlatform.AzureDevOps;
                    organization_owner     = item.Organization;
                    project_repo           = item.Project;
                    repository             = item.Repository;
                    buildName_workflowName = item.BuildName;
                }
            }
            foreach (GitHubSettings item in githubSettings)
            {
                if (item.RowKey == ProjectIdSelected)
                {
                    targetDevOpsPlatform   = DevOpsPlatform.GitHub;
                    organization_owner     = item.Owner;
                    project_repo           = item.Repo;
                    repository             = "";
                    buildName_workflowName = item.WorkflowName;
                }
            }

            //Update the change failure rate with the % distribution
            if (organization_owner != "" && project_repo != "" && buildName_workflowName != "")
            {
                await serviceApiClient.UpdateChangeFailureRate(organization_owner, project_repo, buildName_workflowName, CompletionPercentSelected, NumberOfDaysSelected);
            }

            //Redirect to the correct project page to see the changes
            if (targetDevOpsPlatform == DevOpsPlatform.AzureDevOps)
            {
                return(RedirectToAction("Project", "Home", new { rowKey = organization_owner + "_" + project_repo + "_" + repository + "_" + buildName_workflowName }));
            }
            else if (targetDevOpsPlatform == DevOpsPlatform.GitHub)
            {
                return(RedirectToAction("Project", "Home", new { rowKey = organization_owner + "_" + project_repo + "_" + buildName_workflowName }));
            }
            else
            {
                return(RedirectToAction("Index", "Home"));
            }
        }
        public ChangeFailureRateModel GetChangeFailureRate(bool getSampleData,
                                                           DevOpsPlatform targetDevOpsPlatform, string organization_owner, string project_repo, string branch, string buildName_workflowName,
                                                           int numberOfDays, int maxNumberOfItems)
        {
            TableStorageConfiguration tableStorageConfig = Common.GenerateTableStorageConfiguration(Configuration);
            ChangeFailureRateDA       da    = new();
            ChangeFailureRateModel    model = da.GetChangeFailureRate(getSampleData, tableStorageConfig, targetDevOpsPlatform,
                                                                      organization_owner, project_repo, branch, buildName_workflowName,
                                                                      numberOfDays, maxNumberOfItems);

            return(model);
        }
        public MeanTimeToRestoreModel GetAzureMeanTimeToRestore(bool getSampleData,
                                                                DevOpsPlatform targetDevOpsPlatform, string resourceGroup,
                                                                int numberOfDays, int maxNumberOfItems)
        {
            TableStorageConfiguration tableStorageConfig = Common.GenerateTableStorageConfiguration(Configuration);
            MeanTimeToRestoreDA       da    = new();
            MeanTimeToRestoreModel    model = da.GetAzureMeanTimeToRestore(getSampleData, tableStorageConfig,
                                                                           targetDevOpsPlatform, resourceGroup,
                                                                           numberOfDays, maxNumberOfItems);

            return(model);
        }
Пример #11
0
        public void MeanTimeToRestoreDAIntegrationTest()
        {
            //Arrange
            bool getSampleData = true;
            TableStorageConfiguration tableStorageConfig = Common.GenerateTableAuthorization(base.Configuration);
            string         resourceGroup        = "DevOpsMetricsTestRG";
            DevOpsPlatform targetDevOpsPlatform = DevOpsPlatform.AzureDevOps;
            int            numberOfDays         = 30;
            int            maxNumberOfItems     = 20;

            //Act
            MeanTimeToRestoreDA    da    = new();
            MeanTimeToRestoreModel model = da.GetAzureMeanTimeToRestore(getSampleData, tableStorageConfig, targetDevOpsPlatform, resourceGroup, numberOfDays, maxNumberOfItems);

            //Assert
            Assert.IsTrue(model != null);
            Assert.IsTrue(model.TargetDevOpsPlatform == targetDevOpsPlatform);
            Assert.AreEqual(resourceGroup, model.ResourceGroup);
            Assert.IsTrue(model.MeanTimeToRestoreEvents.Count > 0);
            Assert.IsTrue(model.MTTRAverageDurationInHours > 0);
            Assert.AreEqual(numberOfDays, model.NumberOfDays);
            Assert.IsTrue(model.MaxNumberOfItems > 0);
            Assert.IsTrue(model.TotalItems > 0);
        }
Пример #12
0
        public async Task <MeanTimeToRestoreModel> GetAzureMeanTimeToRestore(bool getSampleData, DevOpsPlatform targetDevOpsPlatform, string resourceGroup, int numberOfDays, int maxNumberOfItems)
        {
            string url = $"/api/MeanTimeToRestore/GetAzureMeanTimeToRestore?getSampleData={getSampleData}&targetDevOpsPlatform={targetDevOpsPlatform}&resourceGroup={resourceGroup}&numberOfDays={numberOfDays}&maxNumberOfItems={maxNumberOfItems}";

            try
            {
                return(await GetResponse <MeanTimeToRestoreModel>(Client, url));
            }
            catch (Exception ex)
            {
                return(new MeanTimeToRestoreModel
                {
                    ResourceGroup = resourceGroup,
                    TargetDevOpsPlatform = targetDevOpsPlatform,
                    MTTRAverageDurationDescription = "None",
                    Exception = ex,
                    ExceptionUrl = url
                });
            }
        }
Пример #13
0
        public ChangeFailureRateModel GetChangeFailureRate(bool getSampleData, TableStorageAuth tableStorageAuth,
                                                           DevOpsPlatform targetDevOpsPlatform, string organization_owner, string project_repo, string branch, string buildName_workflowName,
                                                           int numberOfDays, int maxNumberOfItems)
        {
            ListUtility <ChangeFailureRateBuild> utility = new ListUtility <ChangeFailureRateBuild>();
            ChangeFailureRate changeFailureRate          = new ChangeFailureRate();

            if (getSampleData == false)
            {
                //Gets a list of change failure rate builds from Azure storage
                AzureTableStorageDA           daTableStorage = new AzureTableStorageDA();
                Newtonsoft.Json.Linq.JArray   list           = daTableStorage.GetTableStorageItems(tableStorageAuth, tableStorageAuth.TableChangeFailureRate, daTableStorage.CreateBuildWorkflowPartitionKey(organization_owner, project_repo, buildName_workflowName));
                List <ChangeFailureRateBuild> initialBuilds  = JsonConvert.DeserializeObject <List <ChangeFailureRateBuild> >(list.ToString());

                //Build the date list and then generate the change failure rate metric
                List <ChangeFailureRateBuild>         builds   = new List <ChangeFailureRateBuild>();
                List <KeyValuePair <DateTime, bool> > dateList = new List <KeyValuePair <DateTime, bool> >();
                float maxBuildDuration = 0f;
                foreach (ChangeFailureRateBuild item in initialBuilds)
                {
                    if (item.Branch == branch && item.StartTime > DateTime.Now.AddDays(-numberOfDays))
                    {
                        //Special branch for Azure DevOps to construct the Url to each build
                        if (targetDevOpsPlatform == DevOpsPlatform.AzureDevOps)
                        {
                            item.Url = $"https://dev.azure.com/{organization_owner}/{project_repo}/_build/results?buildId={item.Id}&view=results";
                        }
                        builds.Add(item);
                    }
                }

                //then build the calcuation
                foreach (ChangeFailureRateBuild item in builds)
                {
                    KeyValuePair <DateTime, bool> newItem = new KeyValuePair <DateTime, bool>(item.StartTime, item.DeploymentWasSuccessful);
                    dateList.Add(newItem);
                }
                //calculate the metric on all of the results
                float changeFailureRateMetric = changeFailureRate.ProcessChangeFailureRate(dateList, numberOfDays);

                //Filter the results to return the last n (maxNumberOfItems)
                List <ChangeFailureRateBuild> uiBuilds = utility.GetLastNItems(builds, maxNumberOfItems);
                foreach (ChangeFailureRateBuild item in uiBuilds)
                {
                    if (item.BuildDuration > maxBuildDuration)
                    {
                        maxBuildDuration = item.BuildDuration;
                    }
                }
                //We need to do some post processing and loop over the list a couple times to find the max build duration, construct a usable url, and calculate a build duration percentage
                foreach (ChangeFailureRateBuild item in uiBuilds)
                {
                    float interiumResult = ((item.BuildDuration / maxBuildDuration) * 100f);
                    item.BuildDurationPercent = Scaling.ScaleNumberToRange(interiumResult, 0, 100, 20, 100);
                }

                ChangeFailureRateModel model = new ChangeFailureRateModel
                {
                    TargetDevOpsPlatform               = targetDevOpsPlatform,
                    DeploymentName                     = buildName_workflowName,
                    ChangeFailureRateBuildList         = uiBuilds,
                    ChangeFailureRateMetric            = changeFailureRateMetric,
                    ChangeFailureRateMetricDescription = changeFailureRate.GetChangeFailureRateRating(changeFailureRateMetric),
                    NumberOfDays     = numberOfDays,
                    MaxNumberOfItems = uiBuilds.Count,
                    TotalItems       = builds.Count
                };
                return(model);
            }
            else
            {
                //Get sample data
                List <ChangeFailureRateBuild> sampleBuilds = utility.GetLastNItems(GetSampleBuilds(), maxNumberOfItems);
                ChangeFailureRateModel        model        = new ChangeFailureRateModel
                {
                    TargetDevOpsPlatform               = targetDevOpsPlatform,
                    DeploymentName                     = buildName_workflowName,
                    ChangeFailureRateBuildList         = sampleBuilds,
                    ChangeFailureRateMetric            = 2f / 10f,
                    ChangeFailureRateMetricDescription = changeFailureRate.GetChangeFailureRateRating(2f / 10f),
                    NumberOfDays     = numberOfDays,
                    MaxNumberOfItems = sampleBuilds.Count,
                    TotalItems       = sampleBuilds.Count
                };
                return(model);
            }
        }
Пример #14
0
        public async Task <ChangeFailureRateModel> GetChangeFailureRate(bool getSampleData, DevOpsPlatform targetDevOpsPlatform, string organization_owner, string project_repo, string branch, string buildName_workflowName, int numberOfDays, int maxNumberOfItems)
        {
            string url = $"/api/ChangeFailureRate/GetChangeFailureRate?getSampleData={getSampleData}&targetDevOpsPlatform={targetDevOpsPlatform}&organization_owner={organization_owner}&project_repo={project_repo}&branch={branch}&buildName_workflowName={buildName_workflowName}&numberOfDays={numberOfDays}&maxNumberOfItems={maxNumberOfItems}";

            try
            {
                return(await GetResponse <ChangeFailureRateModel>(Client, url));
            }
            catch (Exception ex)
            {
                return(new ChangeFailureRateModel
                {
                    DeploymentName = buildName_workflowName,
                    TargetDevOpsPlatform = targetDevOpsPlatform,
                    ChangeFailureRateMetricDescription = "None",
                    Exception = ex,
                    ExceptionUrl = url
                });
            }
        }
Пример #15
0
        public MeanTimeToRestoreModel GetAzureMeanTimeToRestore(bool getSampleData,
                                                                TableStorageConfiguration tableStorageConfig,
                                                                DevOpsPlatform targetDevOpsPlatform, string resourceGroup,
                                                                int numberOfDays, int maxNumberOfItems)
        {
            ListUtility <MeanTimeToRestoreEvent> utility = new ListUtility <MeanTimeToRestoreEvent>();

            if (getSampleData == false)
            {
                //If the user didn't specify a resource group, it comes in as null and causes havoc. Setting it as "" helps, it
                if (resourceGroup == null)
                {
                    resourceGroup = "";
                }

                //Pull the events from the table storage
                AzureTableStorageDA         daTableStorage = new AzureTableStorageDA();
                Newtonsoft.Json.Linq.JArray list           = daTableStorage.GetTableStorageItemsFromStorage(tableStorageConfig, tableStorageConfig.TableMTTR, resourceGroup);
                List <AzureAlert>           alerts         = new List <AzureAlert>();
                foreach (JToken item in list)
                {
                    alerts.Add(
                        new AzureAlert
                    {
                        name = item["data"]["context"]["name"].ToString(),
                        resourceGroupName = item["data"]["context"]["resourceGroupName"].ToString(),
                        resourceName      = item["data"]["context"]["resourceName"].ToString(),
                        status            = item["data"]["status"].ToString(),
                        timestamp         = DateTime.Parse(item["data"]["context"]["timestamp"].ToString())
                    });
                }
                //sort the events by timestamp
                alerts = alerts.OrderBy(o => o.timestamp).ToList();

                //Compile the events,  looking for pairs, using the ordered data, and name, resource group name and resource name
                List <MeanTimeToRestoreEvent> events = new List <MeanTimeToRestoreEvent>();

                //Loop through first finding the activated alerts
                int i = 0;
                List <AzureAlert> startingAlerts = alerts.Where(o => o.status == "Activated").ToList();
                foreach (AzureAlert item in startingAlerts)
                {
                    if (item.timestamp > DateTime.Now.AddDays(-numberOfDays))
                    {
                        i++;
                        MeanTimeToRestoreEvent newEvent = new MeanTimeToRestoreEvent
                        {
                            Name          = item.name,
                            Resource      = item.resourceName,
                            ResourceGroup = item.resourceGroupName,
                            StartTime     = item.timestamp,
                            Status        = "inProgress",
                            ItemOrder     = i
                        };
                        events.Add(newEvent);
                    }
                }

                //Now loop through again, looking for the deactivated matching pair
                float             maxEventDuration = 0;
                List <AzureAlert> endingAlerts     = alerts.Where(o => o.status == "Deactivated").ToList();
                foreach (MeanTimeToRestoreEvent item in events)
                {
                    //Search for the next matching deactivated alert
                    int foundItemIndex = -1;
                    for (int j = 0; j <= endingAlerts.Count - 1; j++)
                    {
                        if (endingAlerts[j].name == item.Name &&
                            endingAlerts[j].resourceName == item.Resource &&
                            endingAlerts[j].resourceGroupName == item.ResourceGroup &&
                            endingAlerts[j].timestamp > item.StartTime)
                        {
                            item.EndTime   = endingAlerts[j].timestamp;
                            item.Status    = "completed";
                            foundItemIndex = j;
                            break;
                        }
                    }
                    if (foundItemIndex >= 0)
                    {
                        //Remove the found item from the list, so we don't use it again.
                        endingAlerts.RemoveAt(foundItemIndex);
                        if (item.MTTRDurationInHours > maxEventDuration)
                        {
                            maxEventDuration = item.MTTRDurationInHours;
                        }
                    }
                }

                //Calculate the MTTR metric
                MeanTimeToRestore mttr = new MeanTimeToRestore();
                List <KeyValuePair <DateTime, TimeSpan> > dateList = ConvertEventsToDateList(events);
                float averageMTTR = mttr.ProcessMeanTimeToRestore(dateList, numberOfDays);

                //Calculate the SLA metric
                SLA   slaMetric = new SLA();
                float sla       = slaMetric.ProcessSLA(dateList, numberOfDays);

                //Filter the list for the UI, and sort the final list (May not be needed due to the initial sort on the starting alerts)
                List <MeanTimeToRestoreEvent> uiEvents = utility.GetLastNItems(events, maxNumberOfItems);
                uiEvents = uiEvents.OrderBy(o => o.StartTime).ToList();

                //Finally, process the percent calculation
                foreach (MeanTimeToRestoreEvent item in uiEvents)
                {
                    float interiumResult = ((item.MTTRDurationInHours / maxEventDuration) * 100f);
                    item.MTTRDurationPercent = Scaling.ScaleNumberToRange(interiumResult, 0, 100, 20, 100);
                }

                //Pull together the results into a single model
                MeanTimeToRestoreModel model = new MeanTimeToRestoreModel
                {
                    TargetDevOpsPlatform           = targetDevOpsPlatform,
                    ResourceGroup                  = resourceGroup,
                    MeanTimeToRestoreEvents        = uiEvents,
                    MTTRAverageDurationInHours     = averageMTTR,
                    MTTRAverageDurationDescription = mttr.GetMeanTimeToRestoreRating(averageMTTR),
                    NumberOfDays     = numberOfDays,
                    MaxNumberOfItems = uiEvents.Count,
                    TotalItems       = events.Count,
                    SLA            = sla,
                    SLADescription = slaMetric.GetSLARating(sla)
                };
                return(model);
            }
            else
            {
                //Get sample data
                MeanTimeToRestore                         mttr         = new MeanTimeToRestore();
                List <MeanTimeToRestoreEvent>             sampleEvents = GetSampleMTTREvents(resourceGroup);
                List <KeyValuePair <DateTime, TimeSpan> > dateList     = ConvertEventsToDateList(sampleEvents);
                float averageMTTR            = mttr.ProcessMeanTimeToRestore(dateList, numberOfDays);
                SLA   slaMetric              = new SLA();
                float sla                    = slaMetric.ProcessSLA(dateList, numberOfDays);
                MeanTimeToRestoreModel model = new MeanTimeToRestoreModel
                {
                    TargetDevOpsPlatform           = targetDevOpsPlatform,
                    ResourceGroup                  = resourceGroup,
                    MeanTimeToRestoreEvents        = sampleEvents,
                    MTTRAverageDurationInHours     = averageMTTR,
                    MTTRAverageDurationDescription = mttr.GetMeanTimeToRestoreRating(averageMTTR),
                    NumberOfDays     = numberOfDays,
                    MaxNumberOfItems = sampleEvents.Count,
                    TotalItems       = sampleEvents.Count,
                    SLA            = sla,
                    SLADescription = slaMetric.GetSLARating(sla)
                };
                return(model);
            }
        }
Пример #16
0
        //Return a sample dataset to help with testing
        private List <PullRequestModel> CreatePullRequestsSample(DevOpsPlatform targetDevOpsPlatform)
        {
            List <PullRequestModel> prs = new List <PullRequestModel>();

            string url;

            if (targetDevOpsPlatform == DevOpsPlatform.AzureDevOps)
            {
                url = $"https://dev.azure.com/testOrganization/testProject/_git/testRepo/pullrequest/123";
            }
            else if (targetDevOpsPlatform == DevOpsPlatform.GitHub)
            {
                url = $"https://github.com/testOwner/testRepo/pull/123";
            }
            else
            {
                url = "";
            }

            PullRequestModel pr1 = new PullRequestModel
            {
                PullRequestId   = "123",
                Branch          = "branch1",
                BuildCount      = 1,
                Commits         = CreateCommitsSample(1),
                DurationPercent = 33,
                StartDateTime   = DateTime.Now.AddDays(-7),
                EndDateTime     = DateTime.Now.AddDays(-7).AddHours(1),
                Url             = url
            };

            prs.Add(pr1);
            prs.Add(pr1);
            prs.Add(pr1);
            prs.Add(pr1);
            prs.Add(pr1);
            PullRequestModel pr2 = new PullRequestModel
            {
                PullRequestId   = "124",
                Branch          = "branch2",
                BuildCount      = 3,
                Commits         = CreateCommitsSample(3),
                DurationPercent = 100,
                StartDateTime   = DateTime.Now.AddDays(-7),
                EndDateTime     = DateTime.Now.AddDays(-5),
                Url             = url
            };

            prs.Add(pr2);
            prs.Add(pr2);
            prs.Add(pr2);
            prs.Add(pr2);
            prs.Add(pr2);
            prs.Add(pr2);
            prs.Add(pr2);
            prs.Add(pr2);
            prs.Add(pr2);
            prs.Add(pr2);

            PullRequestModel pr3 = new PullRequestModel
            {
                PullRequestId   = "126",
                Branch          = "branch3",
                BuildCount      = 2,
                Commits         = CreateCommitsSample(2),
                DurationPercent = 66,
                StartDateTime   = DateTime.Now.AddDays(-7),
                EndDateTime     = DateTime.Now.AddDays(-6),
                Url             = url
            };

            prs.Add(pr3);
            prs.Add(pr3);
            prs.Add(pr3);
            prs.Add(pr3);
            prs.Add(pr3);
            prs.Add(pr3);

            return(prs);
        }
Пример #17
0
        public async Task <ChangeFailureRateModel> GetChangeFailureRate(bool getSampleData, DevOpsPlatform targetDevOpsPlatform, string organization_owner, string project_repo, string branch, string buildName_workflowName, int numberOfDays, int maxNumberOfItems)
        {
            string url = $"/api/ChangeFailureRate/GetChangeFailureRate?getSampleData={getSampleData}&targetDevOpsPlatform={targetDevOpsPlatform}&organization_owner={organization_owner}&project_repo={project_repo}&branch={branch}&buildName_workflowName={buildName_workflowName}&numberOfDays={numberOfDays}&maxNumberOfItems={maxNumberOfItems}";

            return(await GetResponse <ChangeFailureRateModel>(Client, url));
        }
Пример #18
0
        public async Task <MeanTimeToRestoreModel> GetAzureMeanTimeToRestore(bool getSampleData, DevOpsPlatform targetDevOpsPlatform, string resourceGroup, int numberOfDays, int maxNumberOfItems)
        {
            string url = $"/api/MeanTimeToRestore/GetAzureMeanTimeToRestore?getSampleData={getSampleData}&targetDevOpsPlatform={targetDevOpsPlatform}&resourceGroup={resourceGroup}&numberOfDays={numberOfDays}&maxNumberOfItems={maxNumberOfItems}";

            return(await GetResponse <MeanTimeToRestoreModel>(Client, url));
        }