public override void ExecuteCmdlet()
        {
            if (ParameterSetName.Equals(ParentObjectParameterSet, StringComparison.Ordinal))
            {
                Location = InputObject.Location;
                DatabaseAccountInstanceId = InputObject.DatabaseAccountInstanceId;
            }

            DateTime dateTimeInUtc;

            if (RestoreTimestampInUtc.Kind == DateTimeKind.Unspecified)
            {
                dateTimeInUtc = RestoreTimestampInUtc;
            }
            else
            {
                dateTimeInUtc = RestoreTimestampInUtc.ToUniversalTime();
            }

            IEnumerable restorableSqlResources = CosmosDBManagementClient.RestorableSqlResources.ListWithHttpMessagesAsync(Location, DatabaseAccountInstanceId, RestoreLocation, dateTimeInUtc.ToString()).GetAwaiter().GetResult().Body;

            foreach (DatabaseRestoreResource restorableSqlResource in restorableSqlResources)
            {
                WriteObject(new PSDatabaseToRestore(restorableSqlResource));
            }
        }
示例#2
0
        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;
        }
示例#3
0
        public override void ExecuteCmdlet()
        {
            if (ParameterSetName.Equals(ParentObjectParameterSet, StringComparison.Ordinal))
            {
                Location = InputObject.Location;
                DatabaseAccountInstanceId = InputObject.DatabaseAccountInstanceId;
            }

            IEnumerable restorableMongoDBResources = CosmosDBManagementClient.RestorableMongodbResources.ListWithHttpMessagesAsync(Location, DatabaseAccountInstanceId, RestoreLocation, RestoreTimestampInUtc.ToString()).GetAwaiter().GetResult().Body;

            foreach (DatabaseRestoreResource restorableMongoDBResource in restorableMongoDBResources)
            {
                WriteObject(new PSDatabaseToRestore(restorableMongoDBResource));
            }
        }