public void ListIncidentsTest() { var expectedIncidentsResponse = new IncidentListResponse() { Value = new List <Incident>() { new Incident() { ActivatedTime = DateTime.Parse("2014-08-01T00:00:00Z"), IsActive = false, Name = "i1", ResolvedTime = DateTime.Parse("2014-08-01T00:00:00Z"), RuleName = "r1" } } }; string listIncidentsContent = @"{ 'value': [{ 'activatedTime': '2014-08-01T00:00:00Z', 'isActive': false, 'name': 'i1', 'resolvedTime': '2014-08-01T00:00:00Z', 'ruleName': 'r1' }] }"; HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(listIncidentsContent) }; var handler = new RecordedDelegatingHandler(response); var insightsClient = GetInsightsManagementClient(handler); IncidentListResponse actualIncidents = insightsClient.AlertOperations.ListIncidentsForRule( resourceGroupName: "rg1", ruleName: "r1"); AreEqual(expectedIncidentsResponse.Value, actualIncidents.Value); }
/// <param name='ruleId'> /// The rule id. /// </param> /// <param name='isActive'> /// A boolean to retrieve only active or resolved incidents. /// </param> /// <param name='cancellationToken'> /// Cancellation token. /// </param> /// <returns> /// The List incidents operation response. /// </returns> public async System.Threading.Tasks.Task <Microsoft.WindowsAzure.Management.Monitoring.Alerts.Models.IncidentListResponse> ListForRuleAsync(string ruleId, bool isActive, CancellationToken cancellationToken) { // Validate if (ruleId == null) { throw new ArgumentNullException("ruleId"); } // Tracing bool shouldTrace = CloudContext.Configuration.Tracing.IsEnabled; string invocationId = null; if (shouldTrace) { invocationId = Tracing.NextInvocationId.ToString(); Dictionary <string, object> tracingParameters = new Dictionary <string, object>(); tracingParameters.Add("ruleId", ruleId); tracingParameters.Add("isActive", isActive); Tracing.Enter(invocationId, this, "ListForRuleAsync", tracingParameters); } // Construct URL string url = new Uri(this.Client.BaseUri, "/").ToString() + this.Client.Credentials.SubscriptionId + "/services/monitoring/alertrules/" + ruleId + "/alertincidents?"; url = url + "$filter=IsActive eq " + Uri.EscapeUriString(isActive.ToString().ToLower()); // Create HTTP transport objects HttpRequestMessage httpRequest = null; try { httpRequest = new HttpRequestMessage(); httpRequest.Method = HttpMethod.Get; httpRequest.RequestUri = new Uri(url); // Set Headers httpRequest.Headers.Add("Accept", "application/json"); httpRequest.Headers.Add("x-ms-version", "2013-10-01"); // Set Credentials cancellationToken.ThrowIfCancellationRequested(); await this.Client.Credentials.ProcessHttpRequestAsync(httpRequest, cancellationToken).ConfigureAwait(false); // Send Request HttpResponseMessage httpResponse = null; try { if (shouldTrace) { Tracing.SendRequest(invocationId, httpRequest); } cancellationToken.ThrowIfCancellationRequested(); httpResponse = await this.Client.HttpClient.SendAsync(httpRequest, cancellationToken).ConfigureAwait(false); if (shouldTrace) { Tracing.ReceiveResponse(invocationId, httpResponse); } HttpStatusCode statusCode = httpResponse.StatusCode; if (statusCode != HttpStatusCode.OK) { cancellationToken.ThrowIfCancellationRequested(); CloudException ex = CloudException.Create(httpRequest, null, httpResponse, await httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false), CloudExceptionType.Json); if (shouldTrace) { Tracing.Error(invocationId, ex); } throw ex; } // Create Result IncidentListResponse result = null; // Deserialize Response cancellationToken.ThrowIfCancellationRequested(); string responseContent = await httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false); result = new IncidentListResponse(); JToken responseDoc = JToken.Parse(responseContent); if (responseDoc != null && responseDoc.Type != JTokenType.Null) { JToken valueArray = responseDoc["Value"]; if (valueArray != null && valueArray.Type != JTokenType.Null) { foreach (JToken valueValue in (JArray)valueArray) { Incident incidentInstance = new Incident(); result.Value.Add(incidentInstance); JToken idValue = valueValue["Id"]; if (idValue != null && idValue.Type != JTokenType.Null) { string idInstance = (string)idValue; incidentInstance.Id = idInstance; } JToken ruleIdValue = valueValue["RuleId"]; if (ruleIdValue != null && ruleIdValue.Type != JTokenType.Null) { string ruleIdInstance = (string)ruleIdValue; incidentInstance.RuleId = ruleIdInstance; } JToken isActiveValue = valueValue["IsActive"]; if (isActiveValue != null && isActiveValue.Type != JTokenType.Null) { bool isActiveInstance = (bool)isActiveValue; incidentInstance.IsActive = isActiveInstance; } JToken activatedTimeValue = valueValue["ActivatedTime"]; if (activatedTimeValue != null && activatedTimeValue.Type != JTokenType.Null) { DateTime activatedTimeInstance = (DateTime)activatedTimeValue; incidentInstance.ActivatedTime = activatedTimeInstance; } JToken resolvedTimeValue = valueValue["ResolvedTime"]; if (resolvedTimeValue != null && resolvedTimeValue.Type != JTokenType.Null) { DateTime resolvedTimeInstance = (DateTime)resolvedTimeValue; incidentInstance.ResolvedTime = resolvedTimeInstance; } } } } result.StatusCode = statusCode; if (httpResponse.Headers.Contains("x-ms-request-id")) { result.RequestId = httpResponse.Headers.GetValues("x-ms-request-id").FirstOrDefault(); } if (shouldTrace) { Tracing.Exit(invocationId, result); } return(result); } finally { if (httpResponse != null) { httpResponse.Dispose(); } } } finally { if (httpRequest != null) { httpRequest.Dispose(); } } }
/// <param name='ruleId'> /// Required. The rule id. /// </param> /// <param name='isActive'> /// Required. A boolean to retrieve only active or resolved incidents. /// </param> /// <param name='cancellationToken'> /// Cancellation token. /// </param> /// <returns> /// The List incidents operation response. /// </returns> public async Task <IncidentListResponse> ListForRuleAsync(string ruleId, bool isActive, CancellationToken cancellationToken) { // Validate if (ruleId == null) { throw new ArgumentNullException("ruleId"); } // Tracing bool shouldTrace = TracingAdapter.IsEnabled; string invocationId = null; if (shouldTrace) { invocationId = TracingAdapter.NextInvocationId.ToString(); Dictionary <string, object> tracingParameters = new Dictionary <string, object>(); tracingParameters.Add("ruleId", ruleId); tracingParameters.Add("isActive", isActive); TracingAdapter.Enter(invocationId, this, "ListForRuleAsync", tracingParameters); } // Construct URL string url = "/" + (this.Client.Credentials.SubscriptionId == null ? "" : Uri.EscapeDataString(this.Client.Credentials.SubscriptionId)) + "/services/monitoring/alertrules/" + Uri.EscapeDataString(ruleId) + "/alertincidents?"; bool appendFilter = true; appendFilter = false; url = url + "$filter=IsActive eq " + Uri.EscapeDataString(isActive.ToString().ToLower()); string baseUrl = this.Client.BaseUri.AbsoluteUri; // Trim '/' character from the end of baseUrl and beginning of url. if (baseUrl[baseUrl.Length - 1] == '/') { baseUrl = baseUrl.Substring(0, baseUrl.Length - 1); } if (url[0] == '/') { url = url.Substring(1); } url = baseUrl + "/" + url; url = url.Replace(" ", "%20"); // Create HTTP transport objects HttpRequestMessage httpRequest = null; try { httpRequest = new HttpRequestMessage(); httpRequest.Method = HttpMethod.Get; httpRequest.RequestUri = new Uri(url); // Set Headers httpRequest.Headers.Add("Accept", "application/json"); httpRequest.Headers.Add("x-ms-version", "2013-10-01"); // Set Credentials cancellationToken.ThrowIfCancellationRequested(); await this.Client.Credentials.ProcessHttpRequestAsync(httpRequest, cancellationToken).ConfigureAwait(false); // Send Request HttpResponseMessage httpResponse = null; try { if (shouldTrace) { TracingAdapter.SendRequest(invocationId, httpRequest); } cancellationToken.ThrowIfCancellationRequested(); httpResponse = await this.Client.HttpClient.SendAsync(httpRequest, cancellationToken).ConfigureAwait(false); if (shouldTrace) { TracingAdapter.ReceiveResponse(invocationId, httpResponse); } HttpStatusCode statusCode = httpResponse.StatusCode; if (statusCode != HttpStatusCode.OK) { cancellationToken.ThrowIfCancellationRequested(); CloudException ex = CloudException.Create(httpRequest, null, httpResponse, await httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false)); if (shouldTrace) { TracingAdapter.Error(invocationId, ex); } throw ex; } // Create Result IncidentListResponse result = null; // Deserialize Response if (statusCode == HttpStatusCode.OK) { cancellationToken.ThrowIfCancellationRequested(); string responseContent = await httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false); result = new IncidentListResponse(); JToken responseDoc = null; if (string.IsNullOrEmpty(responseContent) == false) { responseDoc = JToken.Parse(responseContent); } if (responseDoc != null && responseDoc.Type != JTokenType.Null) { JToken valueArray = responseDoc["Value"]; if (valueArray != null && valueArray.Type != JTokenType.Null) { foreach (JToken valueValue in ((JArray)valueArray)) { Incident incidentInstance = new Incident(); result.Value.Add(incidentInstance); JToken idValue = valueValue["Id"]; if (idValue != null && idValue.Type != JTokenType.Null) { string idInstance = ((string)idValue); incidentInstance.Id = idInstance; } JToken ruleIdValue = valueValue["RuleId"]; if (ruleIdValue != null && ruleIdValue.Type != JTokenType.Null) { string ruleIdInstance = ((string)ruleIdValue); incidentInstance.RuleId = ruleIdInstance; } JToken isActiveValue = valueValue["IsActive"]; if (isActiveValue != null && isActiveValue.Type != JTokenType.Null) { bool isActiveInstance = ((bool)isActiveValue); incidentInstance.IsActive = isActiveInstance; } JToken activatedTimeValue = valueValue["ActivatedTime"]; if (activatedTimeValue != null && activatedTimeValue.Type != JTokenType.Null) { DateTime activatedTimeInstance = ((DateTime)activatedTimeValue); incidentInstance.ActivatedTime = activatedTimeInstance; } JToken resolvedTimeValue = valueValue["ResolvedTime"]; if (resolvedTimeValue != null && resolvedTimeValue.Type != JTokenType.Null) { DateTime resolvedTimeInstance = ((DateTime)resolvedTimeValue); incidentInstance.ResolvedTime = resolvedTimeInstance; } } } } } result.StatusCode = statusCode; if (httpResponse.Headers.Contains("x-ms-request-id")) { result.RequestId = httpResponse.Headers.GetValues("x-ms-request-id").FirstOrDefault(); } if (shouldTrace) { TracingAdapter.Exit(invocationId, result); } return(result); } finally { if (httpResponse != null) { httpResponse.Dispose(); } } } finally { if (httpRequest != null) { httpRequest.Dispose(); } } }
public void AlertRuleCrudTest() { var handler = new RecordedDelegatingHandler() { }; using (UndoContext context = UndoContext.Current) { context.Start(); var alertsClient = GetAlertsClient(handler); // provision a hosted service to consume by the test case string newServiceName = TestUtilities.GenerateName("cs"); var deploymentStatus = ProvisionHostedService(newServiceName); var deployment = deploymentStatus.Deployments.FirstOrDefault(); var id = HttpMockServer.GetVariable("RuleID", Guid.NewGuid().ToString()); Assert.NotNull(deployment); // now the actual test case Rule newRule = new Rule { Name = TestUtilities.GenerateName("rule"), Description = "rule description", Id = id, IsEnabled = false, Condition = new ThresholdRuleCondition { Operator = ConditionOperator.GreaterThanOrEqual, Threshold = 80.0, WindowSize = TimeSpan.FromMinutes(5), DataSource = new RuleMetricDataSource { MetricName = "Percentage CPU", ResourceId = string.Format("/hostedservices/{0}/deployments/{1}/roles/{2}", newServiceName, deployment.Name, deployment.Roles.FirstOrDefault().RoleName), MetricNamespace = MetricNamespace.None } } }; newRule.Actions.Add(new RuleEmailAction()); // Create the rule AzureOperationResponse createRuleResponse = alertsClient.Rules.CreateOrUpdate(new RuleCreateOrUpdateParameters { Rule = newRule }); Assert.Equal(HttpStatusCode.Created, createRuleResponse.StatusCode); Console.WriteLine("Created alert rule {0}", newRule.Name); // Retrieve the rule RuleGetResponse getRuleResponse = alertsClient.Rules.Get(newRule.Id); Assert.Equal(HttpStatusCode.OK, getRuleResponse.StatusCode); Assert.True(AreEquivalent(newRule, getRuleResponse.Rule), "The retrieved rule is not equivalent to the original rule"); // Get incidents for the rule IncidentListResponse incidentListResponse = alertsClient.Incidents.ListForRule(newRule.Id, true); Assert.Equal(HttpStatusCode.OK, incidentListResponse.StatusCode); Assert.False(incidentListResponse.Any(), string.Format("There should be no active incident for the rule [{0}].", newRule.Name)); // Validate rule is included by list operation RuleListResponse listRulesResponse = alertsClient.Rules.List(); Assert.Equal(HttpStatusCode.OK, getRuleResponse.StatusCode); Assert.True(listRulesResponse.Value.Any(), "The alertClient.Rules.List() call returned an empty collection of alert rules"); Assert.True(listRulesResponse.Value.Any(rc => rc.Id.Equals(newRule.Id)), "The newly created rule is not in present in the collection of rules returned by alertClient.Rules.List()"); // Update and validate the rule Rule updatedRule = newRule; updatedRule.Description = "updated description"; ((ThresholdRuleCondition)(updatedRule.Condition)).Threshold = 60.0; AzureOperationResponse updateRuleResponse = alertsClient.Rules.CreateOrUpdate(new RuleCreateOrUpdateParameters { Rule = updatedRule }); Assert.Equal(HttpStatusCode.OK, updateRuleResponse.StatusCode); getRuleResponse = alertsClient.Rules.Get(newRule.Id); Assert.Equal(HttpStatusCode.OK, getRuleResponse.StatusCode); Assert.True(AreEquivalent(updatedRule, getRuleResponse.Rule), "The retrieved rule is not equivalent to the updated rule"); // Delete the rule AzureOperationResponse deleteResponse = alertsClient.Rules.Delete(newRule.Id); Assert.Equal(HttpStatusCode.OK, deleteResponse.StatusCode); // Validate the rule was deleted Assert.Throws <CloudException>(() => alertsClient.Rules.Get(newRule.Id)); listRulesResponse = alertsClient.Rules.List(); Assert.Equal(HttpStatusCode.OK, getRuleResponse.StatusCode); if (listRulesResponse.Value.Count > 0) { var foundDeletedRule = listRulesResponse.Value.Any(rc => rc.Id.Equals(newRule.Id)); Assert.False(foundDeletedRule, string.Format("Rule [{0}] is found after its deletion.", newRule.Name)); } } }
public void ListIncidentsTest() { var expectedIncidentsResponse = new IncidentListResponse() { Value = new List<Incident>() { new Incident() { ActivatedTime = DateTime.Parse("2014-08-01T00:00:00Z"), IsActive = false, Name = "i1", ResolvedTime = DateTime.Parse("2014-08-01T00:00:00Z"), RuleName = "r1" } } }; string listIncidentsContent = @"{ 'value': [{ 'activatedTime': '2014-08-01T00:00:00Z', 'isActive': false, 'name': 'i1', 'resolvedTime': '2014-08-01T00:00:00Z', 'ruleName': 'r1' }] }"; HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(listIncidentsContent) }; var handler = new RecordedDelegatingHandler(response); var insightsClient = GetInsightsManagementClient(handler); IncidentListResponse actualIncidents = insightsClient.AlertOperations.ListIncidentsForRule( resourceGroupName: "rg1", ruleName: "r1"); AreEqual(expectedIncidentsResponse.Value, actualIncidents.Value); }