Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
// license information.
//

using System;
using Microsoft.AzureStack.Management.InfrastructureInsights.Admin;
using Microsoft.AzureStack.Management.InfrastructureInsights.Admin.Models;
using Xunit;
Expand Down Expand Up @@ -142,6 +143,50 @@ public void TestGetAllAlerts() {
});
}

[Fact]
public void TestRepairAlert()
{
RunTest((client) => {
bool done = false;
var regions = client.RegionHealths.List(ResourceGroupName);
Common.MapOverIPage(regions, client.RegionHealths.ListNext, (regionHealth) => {
if (!done)
{
var regionName = ExtractName(regionHealth.Name);
var alerts = client.Alerts.List(ResourceGroupName, regionName);
Common.MapOverIPage(alerts, client.Alerts.ListNext, (alert) => {
if (!done && alert.HasValidRemediationAction.GetValueOrDefault())
{
var alertName = ExtractName(alert.AlertId);
var exceptionThrown = false;
try
{
client.Alerts.Repair(ResourceGroupName, regionName, alertName);
}
catch(Exception)
{
exceptionThrown = true;
}
finally
{
if (alert.State.Equals("Active"))
{
Assert.False(exceptionThrown);
}
else
{
Assert.True(exceptionThrown);
}
}

done = true;
}

});
}
});
});
}


[Fact(Skip ="Causes RP to crash.")]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -695,6 +695,215 @@ internal AlertsOperations(InfrastructureInsightsAdminClient client)
return _result;
}

/// <summary>
/// Repairs an alert.
/// </summary>
/// <param name='resourceGroupName'>
/// The name of the resource group.
/// </param>
/// <param name='location'>
/// Name of the region
/// </param>
/// <param name='alertName'>
/// Name of the alert.
/// </param>
/// <param name='customHeaders'>
/// The headers that will be added to request.
/// </param>
/// <param name='cancellationToken'>
/// The cancellation token.
/// </param>
public async Task<AzureOperationResponse> RepairWithHttpMessagesAsync(string resourceGroupName, string location, string alertName, Dictionary<string, List<string>> customHeaders = null, CancellationToken cancellationToken = default(CancellationToken))
{
// Send request
AzureOperationResponse _response = await BeginRepairWithHttpMessagesAsync(resourceGroupName, location, alertName, customHeaders, cancellationToken).ConfigureAwait(false);
return await Client.GetPostOrDeleteOperationResultAsync(_response, customHeaders, cancellationToken).ConfigureAwait(false);
}

/// <summary>
/// Repairs an alert.
/// </summary>
/// <param name='resourceGroupName'>
/// The name of the resource group.
/// </param>
/// <param name='location'>
/// Name of the region
/// </param>
/// <param name='alertName'>
/// Name of the alert.
/// </param>
/// <param name='customHeaders'>
/// Headers that will be added to request.
/// </param>
/// <param name='cancellationToken'>
/// The cancellation token.
/// </param>
/// <exception cref="CloudException">
/// Thrown when the operation returned an invalid status code
/// </exception>
/// <exception cref="ValidationException">
/// Thrown when a required parameter is null
/// </exception>
/// <exception cref="System.ArgumentNullException">
/// Thrown when a required parameter is null
/// </exception>
/// <return>
/// A response object containing the response body and response headers.
/// </return>
public async Task<AzureOperationResponse> BeginRepairWithHttpMessagesAsync(string resourceGroupName, string location, string alertName, Dictionary<string, List<string>> customHeaders = null, CancellationToken cancellationToken = default(CancellationToken))
{
if (Client.SubscriptionId == null)
{
throw new ValidationException(ValidationRules.CannotBeNull, "this.Client.SubscriptionId");
}
if (resourceGroupName == null)
{
throw new ValidationException(ValidationRules.CannotBeNull, "resourceGroupName");
}
if (location == null)
{
throw new ValidationException(ValidationRules.CannotBeNull, "location");
}
if (alertName == null)
{
throw new ValidationException(ValidationRules.CannotBeNull, "alertName");
}
if (Client.ApiVersion == null)
{
throw new ValidationException(ValidationRules.CannotBeNull, "this.Client.ApiVersion");
}
// Tracing
bool _shouldTrace = ServiceClientTracing.IsEnabled;
string _invocationId = null;
if (_shouldTrace)
{
_invocationId = ServiceClientTracing.NextInvocationId.ToString();
Dictionary<string, object> tracingParameters = new Dictionary<string, object>();
tracingParameters.Add("resourceGroupName", resourceGroupName);
tracingParameters.Add("location", location);
tracingParameters.Add("alertName", alertName);
tracingParameters.Add("cancellationToken", cancellationToken);
ServiceClientTracing.Enter(_invocationId, this, "BeginRepair", tracingParameters);
}
// Construct URL
var _baseUrl = Client.BaseUri.AbsoluteUri;
var _url = new System.Uri(new System.Uri(_baseUrl + (_baseUrl.EndsWith("/") ? "" : "/")), "subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.InfrastructureInsights.Admin/regionHealths/{location}/alerts/{alertName}/repair").ToString();
_url = _url.Replace("{subscriptionId}", System.Uri.EscapeDataString(Client.SubscriptionId));
_url = _url.Replace("{resourceGroupName}", System.Uri.EscapeDataString(resourceGroupName));
_url = _url.Replace("{location}", System.Uri.EscapeDataString(location));
_url = _url.Replace("{alertName}", System.Uri.EscapeDataString(alertName));
List<string> _queryParameters = new List<string>();
if (Client.ApiVersion != null)
{
_queryParameters.Add(string.Format("api-version={0}", System.Uri.EscapeDataString(Client.ApiVersion)));
}
if (_queryParameters.Count > 0)
{
_url += (_url.Contains("?") ? "&" : "?") + string.Join("&", _queryParameters);
}
// Create HTTP transport objects
var _httpRequest = new HttpRequestMessage();
HttpResponseMessage _httpResponse = null;
_httpRequest.Method = new HttpMethod("POST");
_httpRequest.RequestUri = new System.Uri(_url);
// Set Headers
if (Client.GenerateClientRequestId != null && Client.GenerateClientRequestId.Value)
{
_httpRequest.Headers.TryAddWithoutValidation("x-ms-client-request-id", System.Guid.NewGuid().ToString());
}
if (Client.AcceptLanguage != null)
{
if (_httpRequest.Headers.Contains("accept-language"))
{
_httpRequest.Headers.Remove("accept-language");
}
_httpRequest.Headers.TryAddWithoutValidation("accept-language", Client.AcceptLanguage);
}


if (customHeaders != null)
{
foreach(var _header in customHeaders)
{
if (_httpRequest.Headers.Contains(_header.Key))
{
_httpRequest.Headers.Remove(_header.Key);
}
_httpRequest.Headers.TryAddWithoutValidation(_header.Key, _header.Value);
}
}

// Serialize Request
string _requestContent = null;
// Set Credentials
if (Client.Credentials != null)
{
cancellationToken.ThrowIfCancellationRequested();
await Client.Credentials.ProcessHttpRequestAsync(_httpRequest, cancellationToken).ConfigureAwait(false);
}
// Send Request
if (_shouldTrace)
{
ServiceClientTracing.SendRequest(_invocationId, _httpRequest);
}
cancellationToken.ThrowIfCancellationRequested();
_httpResponse = await Client.HttpClient.SendAsync(_httpRequest, cancellationToken).ConfigureAwait(false);
if (_shouldTrace)
{
ServiceClientTracing.ReceiveResponse(_invocationId, _httpResponse);
}
HttpStatusCode _statusCode = _httpResponse.StatusCode;
cancellationToken.ThrowIfCancellationRequested();
string _responseContent = null;
if ((int)_statusCode != 200 && (int)_statusCode != 202)
{
var ex = new CloudException(string.Format("Operation returned an invalid status code '{0}'", _statusCode));
try
{
_responseContent = await _httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false);
CloudError _errorBody = Rest.Serialization.SafeJsonConvert.DeserializeObject<CloudError>(_responseContent, Client.DeserializationSettings);
if (_errorBody != null)
{
ex = new CloudException(_errorBody.Message);
ex.Body = _errorBody;
}
}
catch (JsonException)
{
// Ignore the exception
}
ex.Request = new HttpRequestMessageWrapper(_httpRequest, _requestContent);
ex.Response = new HttpResponseMessageWrapper(_httpResponse, _responseContent);
if (_httpResponse.Headers.Contains("x-ms-request-id"))
{
ex.RequestId = _httpResponse.Headers.GetValues("x-ms-request-id").FirstOrDefault();
}
if (_shouldTrace)
{
ServiceClientTracing.Error(_invocationId, ex);
}
_httpRequest.Dispose();
if (_httpResponse != null)
{
_httpResponse.Dispose();
}
throw ex;
}
// Create Result
var _result = new AzureOperationResponse();
_result.Request = _httpRequest;
_result.Response = _httpResponse;
if (_httpResponse.Headers.Contains("x-ms-request-id"))
{
_result.RequestId = _httpResponse.Headers.GetValues("x-ms-request-id").FirstOrDefault();
}
if (_shouldTrace)
{
ServiceClientTracing.Exit(_invocationId, _result);
}
return _result;
}

/// <summary>
/// Returns the list of all alerts in a given region.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,92 @@ public static Alert Close(this IAlertsOperations operations, string resourceGrou
}
}

/// <summary>
/// Repairs an alert.
/// </summary>
/// <param name='operations'>
/// The operations group for this extension method.
/// </param>
/// <param name='resourceGroupName'>
/// The name of the resource group.
/// </param>
/// <param name='location'>
/// Name of the region
/// </param>
/// <param name='alertName'>
/// Name of the alert.
/// </param>
public static void Repair(this IAlertsOperations operations, string resourceGroupName, string location, string alertName)
{
operations.RepairAsync(resourceGroupName, location, alertName).GetAwaiter().GetResult();
}

/// <summary>
/// Repairs an alert.
/// </summary>
/// <param name='operations'>
/// The operations group for this extension method.
/// </param>
/// <param name='resourceGroupName'>
/// The name of the resource group.
/// </param>
/// <param name='location'>
/// Name of the region
/// </param>
/// <param name='alertName'>
/// Name of the alert.
/// </param>
/// <param name='cancellationToken'>
/// The cancellation token.
/// </param>
public static async Task RepairAsync(this IAlertsOperations operations, string resourceGroupName, string location, string alertName, CancellationToken cancellationToken = default(CancellationToken))
{
(await operations.RepairWithHttpMessagesAsync(resourceGroupName, location, alertName, null, cancellationToken).ConfigureAwait(false)).Dispose();
}

/// <summary>
/// Repairs an alert.
/// </summary>
/// <param name='operations'>
/// The operations group for this extension method.
/// </param>
/// <param name='resourceGroupName'>
/// The name of the resource group.
/// </param>
/// <param name='location'>
/// Name of the region
/// </param>
/// <param name='alertName'>
/// Name of the alert.
/// </param>
public static void BeginRepair(this IAlertsOperations operations, string resourceGroupName, string location, string alertName)
{
operations.BeginRepairAsync(resourceGroupName, location, alertName).GetAwaiter().GetResult();
}

/// <summary>
/// Repairs an alert.
/// </summary>
/// <param name='operations'>
/// The operations group for this extension method.
/// </param>
/// <param name='resourceGroupName'>
/// The name of the resource group.
/// </param>
/// <param name='location'>
/// Name of the region
/// </param>
/// <param name='alertName'>
/// Name of the alert.
/// </param>
/// <param name='cancellationToken'>
/// The cancellation token.
/// </param>
public static async Task BeginRepairAsync(this IAlertsOperations operations, string resourceGroupName, string location, string alertName, CancellationToken cancellationToken = default(CancellationToken))
{
(await operations.BeginRepairWithHttpMessagesAsync(resourceGroupName, location, alertName, null, cancellationToken).ConfigureAwait(false)).Dispose();
}

/// <summary>
/// Returns the list of all alerts in a given region.
/// </summary>
Expand Down
Loading