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); }
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); }
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); }
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 }); } }
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); } }
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 }); } }
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); } }
//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); }
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)); }
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)); }