private async Task RestoreDatabaseAccountFeedTestHelperAsync( CosmosDBManagementClient cosmosDBManagementClient, string sourceDatabaseAccountName, string sourceApiType, int expectedRestorableLocationCount) { DatabaseAccountGetResults sourceDatabaseAccount = await CreateDatabaseAccountIfNotExists(cosmosDBManagementClient, sourceDatabaseAccountName, location, sourceApiType); List <RestorableDatabaseAccountGetResult> restorableAccountsFromGlobalFeed = (await cosmosDBManagementClient.RestorableDatabaseAccounts.ListByLocationAsync(location)).ToList(); //List<RestorableDatabaseAccountGetResult> restorableAccounts = (await cosmosDBManagementClient.RestorableDatabaseAccounts.ListByLocationAsync(westus2)).ToList(); RestorableDatabaseAccountGetResult restorableDatabaseAccount = restorableAccountsFromGlobalFeed. Single(account => account.Name.Equals(sourceDatabaseAccount.InstanceId, StringComparison.OrdinalIgnoreCase)); ValidateRestorableDatabaseAccount(restorableDatabaseAccount, sourceDatabaseAccount, sourceApiType, expectedRestorableLocationCount); List <RestorableDatabaseAccountGetResult> restorableAccountsFromRegionalFeed = (await cosmosDBManagementClient.RestorableDatabaseAccounts.ListByLocationAsync(location)).ToList(); restorableDatabaseAccount = restorableAccountsFromRegionalFeed. Single(account => account.Name.Equals(sourceDatabaseAccount.InstanceId, StringComparison.OrdinalIgnoreCase)); ValidateRestorableDatabaseAccount(restorableDatabaseAccount, sourceDatabaseAccount, sourceApiType, expectedRestorableLocationCount); restorableDatabaseAccount = await cosmosDBManagementClient.RestorableDatabaseAccounts.GetByLocationAsync(location, sourceDatabaseAccount.InstanceId); ValidateRestorableDatabaseAccount(restorableDatabaseAccount, sourceDatabaseAccount, sourceApiType, expectedRestorableLocationCount); }
private async Task RestorableDatabaseAccountFeedTestHelperAsync( string sourceDatabaseAccountName, string sourceApiType, int expectedRestorableLocationCount) { var client = this.fixture.CosmosDBManagementClient.RestorableDatabaseAccounts; var restorableAccountsFromGlobalFeed = (await client.ListByLocationAsync(this.fixture.Location)).ToList(); var sourceDatabaseAccount = await this.fixture.CosmosDBManagementClient.DatabaseAccounts.GetAsync(this.fixture.ResourceGroupName, sourceDatabaseAccountName); RestorableDatabaseAccountGetResult restorableDatabaseAccount = restorableAccountsFromGlobalFeed. Single(account => account.Name.Equals(sourceDatabaseAccount.InstanceId, StringComparison.OrdinalIgnoreCase)); ValidateRestorableDatabaseAccount(restorableDatabaseAccount, sourceDatabaseAccount, sourceApiType, expectedRestorableLocationCount); List <RestorableDatabaseAccountGetResult> restorableAccountsFromRegionalFeed = (await client.ListByLocationAsync(this.fixture.Location)).ToList(); restorableDatabaseAccount = restorableAccountsFromRegionalFeed. Single(account => account.Name.Equals(sourceDatabaseAccount.InstanceId, StringComparison.OrdinalIgnoreCase)); ValidateRestorableDatabaseAccount(restorableDatabaseAccount, sourceDatabaseAccount, sourceApiType, expectedRestorableLocationCount); restorableDatabaseAccount = await client.GetByLocationAsync(this.fixture.Location, sourceDatabaseAccount.InstanceId); ValidateRestorableDatabaseAccount(restorableDatabaseAccount, sourceDatabaseAccount, sourceApiType, expectedRestorableLocationCount); }
public async Task RestoreDatabaseAccountTests() { var handler1 = new RecordedDelegatingHandler { StatusCodeToReturn = HttpStatusCode.OK }; using (MockContext context = MockContext.Start(this.GetType())) { // Create client CosmosDBManagementClient cosmosDBManagementClient = CosmosDBTestUtilities.GetCosmosDBClient(context, handler1); DatabaseAccountGetResults databaseAccount = await cosmosDBManagementClient.DatabaseAccounts.GetAsync(resourceGroupName, "pitr-sql-stage-source"); DateTime restoreTs = DateTime.Parse(restoreTimestamp); string restoredatabaseAccountName = TestUtilities.GenerateName(prefix: "restoredaccountname"); List <RestorableDatabaseAccountGetResult> restorableAccounts = (await cosmosDBManagementClient.RestorableDatabaseAccounts.ListAsync()).ToList(); RestorableDatabaseAccountGetResult restorableDatabaseAccount = restorableAccounts. SingleOrDefault(account => account.Name.Equals(databaseAccount.InstanceId, StringComparison.OrdinalIgnoreCase)); List <Location> locations = new List <Location> { new Location(locationName: westus2) }; RestoreReqeustDatabaseAccountCreateUpdateProperties databaseAccountCreateUpdateProperties = new RestoreReqeustDatabaseAccountCreateUpdateProperties { Locations = locations, RestoreParameters = new RestoreParameters() { RestoreMode = "PointInTime", RestoreTimestampInUtc = restoreTs, RestoreSource = restorableDatabaseAccount.Id } }; DatabaseAccountCreateUpdateParameters databaseAccountCreateUpdateParameters = new DatabaseAccountCreateUpdateParameters { Location = westus2, Tags = new Dictionary <string, string> { { "key1", "value1" }, { "key2", "value2" } }, Kind = "GlobalDocumentDB", Properties = databaseAccountCreateUpdateProperties }; DatabaseAccountGetResults restoredDatabaseAccount = (await cosmosDBManagementClient.DatabaseAccounts.CreateOrUpdateWithHttpMessagesAsync( resourceGroupName, restoredatabaseAccountName, databaseAccountCreateUpdateParameters)).Body; Assert.NotNull(restoredDatabaseAccount); Assert.NotNull(restoredDatabaseAccount.RestoreParameters); Assert.Equal(restoredDatabaseAccount.RestoreParameters.RestoreSource.ToLower(), restorableDatabaseAccount.Id.ToLower()); Assert.True(restoredDatabaseAccount.BackupPolicy is ContinuousModeBackupPolicy); } }
private static void ValidateRestorableDatabaseAccount( RestorableDatabaseAccountGetResult restorableDatabaseAccount, DatabaseAccountGetResults sourceDatabaseAccount, string expectedApiType, int expectedRestorableLocations) { Assert.Equal(expectedApiType, restorableDatabaseAccount.ApiType); Assert.Equal(expectedRestorableLocations, restorableDatabaseAccount.RestorableLocations.Count); Assert.Equal("Microsoft.DocumentDB/locations/restorableDatabaseAccounts", restorableDatabaseAccount.Type); Assert.Equal(sourceDatabaseAccount.Location, restorableDatabaseAccount.Location); Assert.Equal(sourceDatabaseAccount.Name, restorableDatabaseAccount.AccountName); }
public override void ExecuteCmdlet() { if (!string.IsNullOrEmpty(DatabaseAccountName)) { List <RestorableDatabaseAccountGetResult> restorableDatabaseAccounts = CosmosDBManagementClient.RestorableDatabaseAccounts.ListWithHttpMessagesAsync().GetAwaiter().GetResult().Body.ToList(); List <RestorableDatabaseAccountGetResult> accountsWithMatchingName = restorableDatabaseAccounts.Where(databaseAccount => databaseAccount.AccountName.Equals(DatabaseAccountName, StringComparison.OrdinalIgnoreCase)).ToList(); foreach (RestorableDatabaseAccountGetResult restorableDatabaseAccount in accountsWithMatchingName) { WriteObject(new PSRestorableDatabaseAccountGetResult(restorableDatabaseAccount)); } } else if (!string.IsNullOrEmpty(DatabaseAccountInstanceId) && !string.IsNullOrEmpty(Location)) { RestorableDatabaseAccountGetResult restorableDatabaseAccount = CosmosDBManagementClient.RestorableDatabaseAccounts.GetByLocationWithHttpMessagesAsync( Location, DatabaseAccountInstanceId).GetAwaiter().GetResult().Body; WriteObject(new PSRestorableDatabaseAccountGetResult(restorableDatabaseAccount)); } else if (!string.IsNullOrEmpty(Location)) { IEnumerable restorableDatabaseAccounts = CosmosDBManagementClient.RestorableDatabaseAccounts.ListByLocationWithHttpMessagesAsync(Location).GetAwaiter().GetResult().Body; foreach (RestorableDatabaseAccountGetResult restorableDatabaseAccount in restorableDatabaseAccounts) { WriteObject(new PSRestorableDatabaseAccountGetResult(restorableDatabaseAccount)); } } else { IEnumerable restorableDatabaseAccounts = CosmosDBManagementClient.RestorableDatabaseAccounts.ListWithHttpMessagesAsync().GetAwaiter().GetResult().Body; foreach (RestorableDatabaseAccountGetResult restorableDatabaseAccount in restorableDatabaseAccounts) { WriteObject(new PSRestorableDatabaseAccountGetResult(restorableDatabaseAccount)); } } }
public async Task RestoreDatabaseAccountTests() { var handler1 = new RecordedDelegatingHandler { StatusCodeToReturn = HttpStatusCode.OK }; using (MockContext context = MockContext.Start(this.GetType())) { // Create client CosmosDBManagementClient cosmosDBManagementClient = CosmosDBTestUtilities.GetCosmosDBClient(context, handler1); ResourceManagementClient resourcesClient = CosmosDBTestUtilities.GetResourceManagementClient(context, handler1); string restoredatabaseAccountName = TestUtilities.GenerateName(prefix: "restoredaccountname"); DatabaseAccountGetResults databaseAccount = null; bool isDatabaseNameExists = cosmosDBManagementClient.DatabaseAccounts.CheckNameExistsWithHttpMessagesAsync(sourceDatabaseAccountName).GetAwaiter().GetResult().Body; if (!isDatabaseNameExists) { DatabaseAccountCreateUpdateParameters databaseAccountCreateUpdateParameters1 = new DatabaseAccountCreateUpdateParameters { Location = location, Kind = DatabaseAccountKind.GlobalDocumentDB, Locations = new List <Location> { new Location { LocationName = location } }, BackupPolicy = new ContinuousModeBackupPolicy(), }; databaseAccount = cosmosDBManagementClient.DatabaseAccounts.CreateOrUpdateWithHttpMessagesAsync(resourceGroupName, sourceDatabaseAccountName, databaseAccountCreateUpdateParameters1).GetAwaiter().GetResult().Body; Assert.Equal(databaseAccount.Name, sourceDatabaseAccountName); } databaseAccount = await cosmosDBManagementClient.DatabaseAccounts.GetAsync(resourceGroupName, sourceDatabaseAccountName); DateTime restoreTs = DateTime.UtcNow; List <RestorableDatabaseAccountGetResult> restorableAccounts = (await cosmosDBManagementClient.RestorableDatabaseAccounts.ListByLocationAsync(location)).ToList(); RestorableDatabaseAccountGetResult restorableDatabaseAccount = restorableAccounts. SingleOrDefault(account => account.AccountName.Equals(databaseAccount.Name, StringComparison.OrdinalIgnoreCase)); DatabaseAccountCreateUpdateParameters databaseAccountCreateUpdateParameters = new DatabaseAccountCreateUpdateParameters { Location = location, Tags = new Dictionary <string, string> { { "key1", "value1" }, { "key2", "value2" } }, Kind = "GlobalDocumentDB", Locations = new List <Location> { new Location(locationName: location) }, CreateMode = CreateMode.Restore, RestoreParameters = new RestoreParameters() { RestoreMode = "PointInTime", RestoreTimestampInUtc = restoreTs, RestoreSource = restorableDatabaseAccount.Id } }; DatabaseAccountGetResults restoredDatabaseAccount = (await cosmosDBManagementClient.DatabaseAccounts.CreateOrUpdateWithHttpMessagesAsync(resourceGroupName, restoredatabaseAccountName, databaseAccountCreateUpdateParameters)).Body; Assert.NotNull(restoredDatabaseAccount); Assert.NotNull(restoredDatabaseAccount.RestoreParameters); Assert.Equal(restoredDatabaseAccount.RestoreParameters.RestoreSource.ToLower(), restorableDatabaseAccount.Id.ToLower()); Assert.True(restoredDatabaseAccount.BackupPolicy is ContinuousModeBackupPolicy); } }
public override void ExecuteCmdlet() { DateTime utcRestoreDateTime; if (RestoreTimestampInUtc.Kind == DateTimeKind.Unspecified) { utcRestoreDateTime = RestoreTimestampInUtc; } else { utcRestoreDateTime = RestoreTimestampInUtc.ToUniversalTime(); } // Fail if provided restoretimesamp is greater than current timestamp if (utcRestoreDateTime > DateTime.UtcNow) { WriteWarning($"Restore timestamp {utcRestoreDateTime} should be less than current timestamp {DateTime.UtcNow}"); return; } bool isSourceRestorableAccountDeleted = false; List <RestorableDatabaseAccountGetResult> restorableDatabaseAccounts = CosmosDBManagementClient.RestorableDatabaseAccounts.ListWithHttpMessagesAsync().GetAwaiter().GetResult().Body.ToList(); RestorableDatabaseAccountGetResult sourceAccountToRestore = null; List <RestorableDatabaseAccountGetResult> accountsWithMatchingName = restorableDatabaseAccounts.Where(databaseAccount => databaseAccount.AccountName.Equals(SourceDatabaseAccountName, StringComparison.OrdinalIgnoreCase)).ToList(); if (accountsWithMatchingName.Count > 0) { foreach (RestorableDatabaseAccountGetResult restorableAccount in accountsWithMatchingName) { if (restorableAccount.CreationTime.HasValue && restorableAccount.CreationTime < utcRestoreDateTime) { if (!restorableAccount.DeletionTime.HasValue || restorableAccount.DeletionTime > utcRestoreDateTime) { sourceAccountToRestore = restorableAccount; isSourceRestorableAccountDeleted = true; break; } } } } if (sourceAccountToRestore == null) { WriteWarning($"No database accounts found with matching account name {SourceDatabaseAccountName} that was alive at given utc-timestamp {utcRestoreDateTime}"); return; } // Validate if source account is empty if the source account is a live account. if (!isSourceRestorableAccountDeleted) { IEnumerable <DatabaseRestoreResource> restorableResources = null; if (sourceAccountToRestore.ApiType.Equals("Sql", StringComparison.OrdinalIgnoreCase)) { try { restorableResources = CosmosDBManagementClient.RestorableSqlResources.ListWithHttpMessagesAsync( sourceAccountToRestore.Location, sourceAccountToRestore.Name, Location, utcRestoreDateTime.ToString()).GetAwaiter().GetResult().Body; } catch (Exception) { WriteWarning($"No database accounts found with matching account name {SourceDatabaseAccountName} that was alive at given utc-timestamp {utcRestoreDateTime} in location {Location}"); return; } } else if (sourceAccountToRestore.ApiType.Equals("MongoDB", StringComparison.OrdinalIgnoreCase)) { try { restorableResources = CosmosDBManagementClient.RestorableMongodbResources.ListWithHttpMessagesAsync( sourceAccountToRestore.Location, sourceAccountToRestore.Name, Location, utcRestoreDateTime.ToString()).GetAwaiter().GetResult().Body; } catch (Exception) { WriteWarning($"No database accounts found with matching account name {SourceDatabaseAccountName} that was alive at given utc-timestamp {utcRestoreDateTime} in location {Location}"); return; } } else { WriteWarning($"Provided API Type {sourceAccountToRestore.ApiType} is not supported"); return; } if (restorableResources == null || !restorableResources.Any()) { WriteWarning($"Database account {SourceDatabaseAccountName} contains no restorable resources in location {Location} at given restore timestamp {utcRestoreDateTime} in location {Location}"); return; } } // Trigger restore PSRestoreParameters restoreParameters = new PSRestoreParameters() { RestoreSource = sourceAccountToRestore.Id, RestoreTimestampInUtc = utcRestoreDateTime, DatabasesToRestore = DatabasesToRestore }; Collection <Location> LocationCollection = new Collection <Location>(); Location loc = new Location(locationName: Location, failoverPriority: 0); LocationCollection.Add(loc); string apiKind = "GlobalDocumentDB"; if (sourceAccountToRestore.ApiType.Equals("MongoDB", StringComparison.OrdinalIgnoreCase)) { apiKind = "MongoDB"; } DatabaseAccountCreateUpdateParameters databaseAccountCreateUpdateParameters = new DatabaseAccountCreateUpdateParameters(locations: LocationCollection, location: sourceAccountToRestore.Location, name: TargetDatabaseAccountName) { Kind = apiKind, CreateMode = CreateMode.Restore, RestoreParameters = restoreParameters.ToSDKModel() }; if (ShouldProcess(TargetDatabaseAccountName, string.Format( "Creating Database Account by restoring Database Account with Name {0} and restorable database account Id {1} to the timestamp {2}", SourceDatabaseAccountName, sourceAccountToRestore.Id, RestoreTimestampInUtc))) { DatabaseAccountGetResults cosmosDBAccount = CosmosDBManagementClient.DatabaseAccounts.CreateOrUpdateWithHttpMessagesAsync(TargetResourceGroupName, TargetDatabaseAccountName, databaseAccountCreateUpdateParameters).GetAwaiter().GetResult().Body; WriteObject(new PSDatabaseAccountGetResults(cosmosDBAccount)); } return; }
public async Task RestorableSqlTests() { var handler1 = new RecordedDelegatingHandler { StatusCodeToReturn = HttpStatusCode.OK }; using (MockContext context = MockContext.Start(this.GetType())) { // Create client CosmosDBManagementClient cosmosDBManagementClient = CosmosDBTestUtilities.GetCosmosDBClient(context, handler1); ResourceManagementClient resourcesClient = CosmosDBTestUtilities.GetResourceManagementClient(context, handler1); DatabaseAccountGetResults databaseAccount = await cosmosDBManagementClient.DatabaseAccounts.GetAsync(resourceGroupName, sourceDatabaseAccountName); RestorableDatabaseAccountGetResult restorableDatabaseAccount = (await cosmosDBManagementClient.RestorableDatabaseAccounts.GetByLocationAsync(location, sourceDatabaseAccountInstanceId)); Assert.Equal(databaseAccount.InstanceId, restorableDatabaseAccount.Name); Assert.Equal(databaseAccount.Name, restorableDatabaseAccount.AccountName); Assert.Equal(ApiType.Sql, restorableDatabaseAccount.ApiType); Assert.Equal(3, restorableDatabaseAccount.RestorableLocations.Count); foreach (var location in restorableDatabaseAccount.RestorableLocations) { Assert.NotNull(location.CreationTime); // Assert.Null(location.DeletionTime); Assert.False(string.IsNullOrEmpty(location.LocationName)); Assert.False(string.IsNullOrEmpty(location.RegionalDatabaseAccountInstanceId)); } List <RestorableSqlDatabaseGetResult> restorableSqlDatabases = (await cosmosDBManagementClient.RestorableSqlDatabases.ListAsync(location, restorableDatabaseAccount.Name)).ToList(); RestorableSqlDatabaseGetResult restorableSqlDatabase = restorableSqlDatabases.First(); Assert.Equal(2, restorableSqlDatabases.Count()); string dbRid = restorableSqlDatabase.Resource.OwnerResourceId; List <RestorableSqlContainerGetResult> restorableSqlContainers = (await cosmosDBManagementClient.RestorableSqlContainers.ListAsync(location, restorableDatabaseAccount.Name, dbRid)).ToList(); Assert.Equal(2, restorableSqlContainers.Count()); List <DatabaseRestoreResource> restorableSqlResources = (await cosmosDBManagementClient.RestorableSqlResources.ListAsync(location, restorableDatabaseAccount.Name, location, restoreTimestamp.ToString())).ToList(); DatabaseRestoreResource databaseRestoreResource1 = new DatabaseRestoreResource() { DatabaseName = "database1", CollectionNames = new List <string>() { "container1", "container2" } }; DatabaseRestoreResource databaseRestoreResource2 = new DatabaseRestoreResource() { DatabaseName = "databaseA", CollectionNames = new List <string>() }; List <DatabaseRestoreResource> resources = new List <DatabaseRestoreResource>() { databaseRestoreResource1, databaseRestoreResource2 }; ValidateDatabaseRestoreResource(resources, restorableSqlResources); } }