示例#1
0
        /// <summary>
        /// Converts the response from the service to a powershell database object
        /// </summary>
        /// <param name="resourceGroupName">The resource group the server is in</param>
        /// <param name="serverName">The name of the Azure Sql Database Server</param>
        /// <param name="database">The service response</param>
        /// <returns>The converted model</returns>
        public static AzureSqlDatabaseModel CreateDatabaseModelFromResponse(string resourceGroup, string serverName, Management.Sql.Models.Database database)
        {
            AzureSqlDatabaseModel model = new AzureSqlDatabaseModel();
            Guid            id          = Guid.Empty;
            DatabaseEdition edition     = DatabaseEdition.None;

            model.ResourceGroupName = resourceGroup;
            model.ServerName        = serverName;
            model.CollationName     = database.Properties.Collation;
            model.CreationDate      = database.Properties.CreationDate;
            model.CurrentServiceLevelObjectiveName = database.Properties.ServiceObjective;
            model.MaxSizeBytes    = database.Properties.MaxSizeBytes;
            model.DatabaseName    = database.Name;
            model.Status          = database.Properties.Status;
            model.Tags            = database.Tags as Dictionary <string, string>;
            model.ElasticPoolName = database.Properties.ElasticPoolName;
            model.Location        = database.Location;

            Guid.TryParse(database.Properties.CurrentServiceObjectiveId, out id);
            model.CurrentServiceObjectiveId = id;

            Guid.TryParse(database.Properties.DatabaseId, out id);
            model.DatabaseId = id;

            Enum.TryParse <DatabaseEdition>(database.Properties.Edition, true, out edition);
            model.Edition = edition;

            Guid.TryParse(database.Properties.RequestedServiceObjectiveId, out id);
            model.RequestedServiceObjectiveId = id;

            return(model);
        }
示例#2
0
        /// <summary>
        /// Create the new database
        /// </summary>
        /// <param name="entity">The output of apply user input to model</param>
        /// <returns>The input entity</returns>
        protected override AzureSqlDatabaseCreateOrUpdateModel PersistChanges(AzureSqlDatabaseCreateOrUpdateModel entity)
        {
            // Use AutoRest Sdk
            AzureSqlDatabaseModel upsertedDatabase = ModelAdapter.UpsertDatabaseWithNewSdk(this.ResourceGroupName, this.ServerName, entity);

            return(new AzureSqlDatabaseCreateOrUpdateModel
            {
                Database = upsertedDatabase
            });
        }
示例#3
0
        /// <summary>
        /// Send the restore request
        /// </summary>
        /// <returns>The list of entities</returns>
        protected override AzureSqlDatabaseModel GetEntity()
        {
            AzureSqlDatabaseModel model;
            DateTime restorePointInTime = DateTime.MinValue;
            string   createMode;
            string   location = ModelAdapter.GetServerLocation(ResourceGroupName, ServerName);

            switch (ParameterSetName)
            {
            case FromPointInTimeBackupSetName:
                createMode         = "PointInTimeRestore";
                restorePointInTime = PointInTime;
                break;

            case FromDeletedDatabaseBackupSetName:
                createMode         = "Restore";
                restorePointInTime = PointInTime == DateTime.MinValue ? DeletionDate : PointInTime;
                break;

            case FromGeoBackupSetName:
                createMode = "Recovery";
                break;

            case FromLongTermRetentionBackupSetName:
                createMode = "RestoreLongTermRetentionBackup";
                break;

            default:
                throw new ArgumentException("No ParameterSet name");
            }

            model = new AzureSqlDatabaseModel()
            {
                Location                      = location,
                ResourceGroupName             = ResourceGroupName,
                ServerName                    = ServerName,
                DatabaseName                  = TargetDatabaseName,
                Edition                       = Edition,
                RequestedServiceObjectiveName = ServiceObjectiveName,
                ElasticPoolName               = ElasticPoolName,
                CreateMode                    = createMode
            };

            return(ModelAdapter.RestoreDatabase(this.ResourceGroupName, restorePointInTime, ResourceId, model));
        }
示例#4
0
        /// <summary>
        /// Create the model from user input
        /// </summary>
        /// <param name="model">Model retrieved from service</param>
        /// <returns>The model that was passed in</returns>
        protected override AzureSqlDatabaseCreateOrUpdateModel ApplyUserInputToModel(AzureSqlDatabaseCreateOrUpdateModel model)
        {
            string location = ModelAdapter.GetServerLocation(ResourceGroupName, ServerName);
            AzureSqlDatabaseCreateOrUpdateModel dbCreateUpdateModel = new AzureSqlDatabaseCreateOrUpdateModel();
            AzureSqlDatabaseModel newDbModel = new AzureSqlDatabaseModel()
            {
                Location          = location,
                ResourceGroupName = ResourceGroupName,
                ServerName        = ServerName,
                CatalogCollation  = CatalogCollation,
                CollationName     = CollationName,
                DatabaseName      = DatabaseName,
                MaxSizeBytes      = MaxSizeBytes,
                Tags                             = TagsConversionHelper.CreateTagDictionary(Tags, validate: true),
                ElasticPoolName                  = ElasticPoolName,
                ReadScale                        = this.IsParameterBound(p => p.ReadScale) ? ReadScale : (DatabaseReadScale?)null,
                ZoneRedundant                    = this.IsParameterBound(p => p.ZoneRedundant) ? ZoneRedundant.ToBool() : (bool?)null,
                LicenseType                      = LicenseType, // note: default license type will be LicenseIncluded in SQL RP if not specified
                AutoPauseDelayInMinutes          = this.IsParameterBound(p => p.AutoPauseDelayInMinutes) ? AutoPauseDelayInMinutes : (int?)null,
                MinimumCapacity                  = this.IsParameterBound(p => p.MinimumCapacity) ? MinimumCapacity : (double?)null,
                HighAvailabilityReplicaCount     = this.IsParameterBound(p => p.HighAvailabilityReplicaCount) ? HighAvailabilityReplicaCount : (int?)null,
                RequestedBackupStorageRedundancy = BackupStorageRedundancy,
                SecondaryType                    = SecondaryType,
                MaintenanceConfigurationId       = MaintenanceConfigurationId,
                EnableLedger                     = this.IsParameterBound(p => p.EnableLedger) ? EnableLedger.ToBool() : (bool?)null,
            };

            if (ParameterSetName == DtuDatabaseParameterSet)
            {
                newDbModel.SkuName = string.IsNullOrWhiteSpace(RequestedServiceObjectiveName) ? AzureSqlDatabaseAdapter.GetDatabaseSkuName(Edition) : RequestedServiceObjectiveName;
                newDbModel.Edition = Edition;
            }
            else
            {
                newDbModel.SkuName  = AzureSqlDatabaseAdapter.GetDatabaseSkuName(Edition, ComputeModel == DatabaseComputeModel.Serverless);
                newDbModel.Edition  = Edition;
                newDbModel.Capacity = VCore;
                newDbModel.Family   = ComputeGeneration;
            }

            dbCreateUpdateModel.Database   = newDbModel;
            dbCreateUpdateModel.SampleName = SampleName;

            return(dbCreateUpdateModel);
        }
        /// <summary>
        /// Create the model from user input
        /// </summary>
        /// <param name="model">Model retrieved from service</param>
        /// <returns>The model that was passed in</returns>
        protected override AzureSqlDatabaseCreateOrUpdateModel ApplyUserInputToModel(AzureSqlDatabaseCreateOrUpdateModel model)
        {
            string location = ModelAdapter.GetServerLocation(ResourceGroupName, ServerName);
            AzureSqlDatabaseCreateOrUpdateModel dbCreateUpdateModel = new AzureSqlDatabaseCreateOrUpdateModel();
            AzureSqlDatabaseModel newDbModel = new AzureSqlDatabaseModel()
            {
                Location          = location,
                ResourceGroupName = ResourceGroupName,
                ServerName        = ServerName,
                CatalogCollation  = CatalogCollation,
                CollationName     = CollationName,
                DatabaseName      = DatabaseName,
                MaxSizeBytes      = MaxSizeBytes,
                Tags                    = TagsConversionHelper.CreateTagDictionary(Tags, validate: true),
                ElasticPoolName         = ElasticPoolName,
                ReadScale               = ReadScale,
                ZoneRedundant           = MyInvocation.BoundParameters.ContainsKey("ZoneRedundant") ? (bool?)ZoneRedundant.ToBool() : null,
                LicenseType             = LicenseType, // note: default license type will be LicenseIncluded in SQL RP if not specified
                AutoPauseDelayInMinutes = MyInvocation.BoundParameters.ContainsKey("AutoPauseDelayInMinutes") ? AutoPauseDelayInMinutes : (int?)null,
                MinimumCapacity         = MyInvocation.BoundParameters.ContainsKey("AutoPauseDelayInMinutes") ? MinimumCapacity : (double?)null,
            };

            if (ParameterSetName == DtuDatabaseParameterSet)
            {
                newDbModel.SkuName = string.IsNullOrWhiteSpace(RequestedServiceObjectiveName) ? AzureSqlDatabaseAdapter.GetDatabaseSkuName(Edition) : RequestedServiceObjectiveName;
                newDbModel.Edition = Edition;
            }
            else
            {
                newDbModel.SkuName  = AzureSqlDatabaseAdapter.GetDatabaseSkuName(Edition, ComputeModel == DatabaseComputeModel.Serverless);
                newDbModel.Edition  = Edition;
                newDbModel.Capacity = VCore;
                newDbModel.Family   = ComputeGeneration;
            }

            dbCreateUpdateModel.Database   = newDbModel;
            dbCreateUpdateModel.SampleName = SampleName;

            return(dbCreateUpdateModel);
        }
示例#6
0
        /// <summary>
        /// Create the model from user input
        /// </summary>
        /// <param name="model">Model retrieved from service</param>
        /// <returns>The model that was passed in</returns>
        protected override AzureSqlDatabaseCreateOrUpdateModel ApplyUserInputToModel(AzureSqlDatabaseCreateOrUpdateModel model)
        {
            string location = ModelAdapter.GetServerLocation(ResourceGroupName, ServerName);
            AzureSqlDatabaseCreateOrUpdateModel dbCreateUpdateModel = new AzureSqlDatabaseCreateOrUpdateModel();
            AzureSqlDatabaseModel newDbModel = new AzureSqlDatabaseModel()
            {
                Location          = location,
                ResourceGroupName = ResourceGroupName,
                ServerName        = ServerName,
                CatalogCollation  = CatalogCollation,
                CollationName     = CollationName,
                DatabaseName      = DatabaseName,
                MaxSizeBytes      = MaxSizeBytes,
                Tags            = TagsConversionHelper.CreateTagDictionary(Tags, validate: true),
                ElasticPoolName = ElasticPoolName,
                ReadScale       = ReadScale,
                ZoneRedundant   = MyInvocation.BoundParameters.ContainsKey("ZoneRedundant") ? (bool?)ZoneRedundant.ToBool() : null
            };

            if (ParameterSetName == DtuDatabaseParameterSet)
            {
                newDbModel.SkuName = string.IsNullOrWhiteSpace(RequestedServiceObjectiveName) ? AzureSqlDatabaseAdapter.GetDatabaseSkuName(Edition) : RequestedServiceObjectiveName;
                newDbModel.Edition = Edition;
            }
            else
            {
                newDbModel.SkuName  = AzureSqlDatabaseAdapter.GetDatabaseSkuName(Edition);
                newDbModel.Edition  = Edition;
                newDbModel.Capacity = VCore;
                newDbModel.Family   = ComputeGeneration;
            }

            dbCreateUpdateModel.Database   = newDbModel;
            dbCreateUpdateModel.SampleName = SampleName;

            return(dbCreateUpdateModel);
        }
        /// <summary>
        /// Send the restore request
        /// </summary>
        /// <returns>The list of entities</returns>
        protected override AzureSqlDatabaseModel GetEntity()
        {
            AzureSqlDatabaseModel model;
            DateTime restorePointInTime = DateTime.MinValue;
            string   createMode;
            string   location = ModelAdapter.GetServerLocation(ResourceGroupName, ServerName);

            switch (ParameterSetName)
            {
            case FromPointInTimeBackupSetName:
            case FromPointInTimeBackupWithVcoreSetName:
                createMode         = "PointInTimeRestore";
                restorePointInTime = PointInTime;
                break;

            case FromDeletedDatabaseBackupSetName:
            case FromDeletedDatabaseBackupWithVcoreSetName:
                createMode         = "Restore";
                restorePointInTime = PointInTime == DateTime.MinValue ? DeletionDate : PointInTime;
                break;

            case FromGeoBackupSetName:
            case FromGeoBackupWithVcoreSetName:
                createMode = "Recovery";
                break;

            case FromLongTermRetentionBackupSetName:
            case FromLongTermRetentionBackupWithVcoreSetName:
                createMode = "RestoreLongTermRetentionBackup";
                break;

            default:
                throw new ArgumentException("No ParameterSet name");
            }

            model = new AzureSqlDatabaseModel()
            {
                Location                      = location,
                ResourceGroupName             = ResourceGroupName,
                ServerName                    = ServerName,
                DatabaseName                  = TargetDatabaseName,
                ElasticPoolName               = ElasticPoolName,
                RequestedServiceObjectiveName = ServiceObjectiveName,
                Edition     = Edition,
                CreateMode  = createMode,
                LicenseType = LicenseType,
                RequestedBackupStorageRedundancy = BackupStorageRedundancy,
                Tags          = TagsConversionHelper.CreateTagDictionary(Tag, validate: true),
                ZoneRedundant = this.IsParameterBound(p => p.ZoneRedundant) ? ZoneRedundant.ToBool() : (bool?)null,
            };

            if (ParameterSetName == FromPointInTimeBackupWithVcoreSetName || ParameterSetName == FromDeletedDatabaseBackupWithVcoreSetName ||
                ParameterSetName == FromGeoBackupWithVcoreSetName || ParameterSetName == FromLongTermRetentionBackupWithVcoreSetName)
            {
                string skuName = AzureSqlDatabaseAdapter.GetDatabaseSkuName(Edition);
                model.SkuName  = skuName;
                model.Edition  = Edition;
                model.Capacity = VCore;
                model.Family   = ComputeGeneration;
            }
            else
            {
                model.SkuName = string.IsNullOrWhiteSpace(ServiceObjectiveName) ? AzureSqlDatabaseAdapter.GetDatabaseSkuName(Edition) : ServiceObjectiveName;
                model.Edition = Edition;
            }

            /// get auth headers for cross-sub and cross-tenant restore operations
            string targetSubscriptionId = ModelAdapter.Context?.Subscription.Id;
            string sourceSubscriptionId = ParseSourceSubscriptionIdFromResourceId(ResourceId);
            Dictionary <string, List <string> > auxAuthHeader = null;

            if (!string.IsNullOrEmpty(ResourceId) && targetSubscriptionId != sourceSubscriptionId)
            {
                List <string> resourceIds = new List <string>();
                resourceIds.Add(ResourceId);
                var auxHeaderDictionary = GetAuxilaryAuthHeaderFromResourceIds(resourceIds);
                if (auxHeaderDictionary != null && auxHeaderDictionary.Count > 0)
                {
                    auxAuthHeader = new Dictionary <string, List <string> >(auxHeaderDictionary);
                }
            }

            return(ModelAdapter.RestoreDatabase(this.ResourceGroupName, restorePointInTime, ResourceId, model, sourceSubscriptionId, auxAuthHeader));
        }
示例#8
0
        /// <summary>
        /// Restore a given Sql Azure Database
        /// </summary>
        /// <param name="resourceGroup">The name of the resource group</param>
        /// <param name="restorePointInTime">A point to time to restore to (for PITR and dropped DB restore)</param>
        /// <param name="resourceId">The resource ID of the DB to restore (live, geo backup, deleted database, long term retention backup, etc.)</param>
        /// <param name="model">An object modeling the database to create via restore</param>
        /// <returns>Restored database object</returns>
        internal AzureSqlDatabaseModel RestoreDatabase(string resourceGroup, DateTime restorePointInTime, string resourceId, AzureSqlDatabaseModel model)
        {
            DatabaseCreateOrUpdateParameters parameters = new DatabaseCreateOrUpdateParameters()
            {
                Location   = model.Location,
                Properties = new DatabaseCreateOrUpdateProperties()
                {
                    Edition = model.Edition == DatabaseEdition.None ? null : model.Edition.ToString(),
                    RequestedServiceObjectiveId             = model.RequestedServiceObjectiveId,
                    ElasticPoolName                         = model.ElasticPoolName,
                    RequestedServiceObjectiveName           = model.RequestedServiceObjectiveName,
                    SourceDatabaseId                        = resourceId,
                    RecoveryServicesRecoveryPointResourceId = resourceId,
                    RestorePointInTime                      = restorePointInTime,
                    CreateMode = model.CreateMode
                }
            };
            var resp = Communicator.RestoreDatabase(resourceGroup, model.ServerName, model.DatabaseName, Util.GenerateTracingId(), parameters);

            return(AzureSqlDatabaseAdapter.CreateDatabaseModelFromResponse(resourceGroup, model.ServerName, resp));
        }
示例#9
0
        /// <summary>
        /// Creates or updates an Azure Sql Database.
        /// </summary>
        /// <param name="resourceGroup">The name of the resource group</param>
        /// <param name="serverName">The name of the Azure Sql Database Server</param>
        /// <param name="model">The input parameters for the create/update operation</param>
        /// <returns>The upserted Azure Sql Database</returns>
        internal AzureSqlDatabaseModel UpsertDatabase(string resourceGroup, string serverName, AzureSqlDatabaseModel model)
        {
            var resp = Communicator.CreateOrUpdate(resourceGroup, serverName, model.DatabaseName, Util.GenerateTracingId(), new DatabaseCreateOrUpdateParameters()
            {
                Location   = model.Location,
                Tags       = model.Tags,
                Properties = new DatabaseCreateOrUpdateProperties()
                {
                    Collation    = model.CollationName,
                    Edition      = model.Edition == DatabaseEdition.None ? null : model.Edition.ToString(),
                    MaxSizeBytes = model.MaxSizeBytes,
                    RequestedServiceObjectiveId   = model.RequestedServiceObjectiveId,
                    ElasticPoolName               = model.ElasticPoolName,
                    RequestedServiceObjectiveName = model.RequestedServiceObjectiveName,
                    ReadScale = model.ReadScale.ToString(),
                }
            });

            return(CreateDatabaseModelFromResponse(resourceGroup, serverName, resp));
        }
        /// <summary>
        /// Restore a given Sql Azure Database
        /// </summary>
        /// <param name="resourceGroup">The name of the resource group</param>
        /// <param name="restorePointInTime">A point to time to restore to (for PITR and dropped DB restore)</param>
        /// <param name="resourceId">The resource ID of the DB to restore (live, geo backup, deleted database, long term retention backup, etc.)</param>
        /// <param name="model">An object modeling the database to create via restore</param>
        /// <returns>Restored database object</returns>
        internal AzureSqlDatabaseModel RestoreDatabase(string resourceGroup, DateTime restorePointInTime, string resourceId, AzureSqlDatabaseModel model)
        {
            // Construct the ARM resource Id of the pool
            string elasticPoolId = string.IsNullOrWhiteSpace(model.ElasticPoolName) ? null : AzureSqlDatabaseModel.PoolIdTemplate.FormatInvariant(
                _subscription.Id,
                resourceGroup,
                model.ServerName,
                model.ElasticPoolName);

            // Restore database
            var dbModel = new Management.Sql.Models.Database()
            {
                Location           = model.Location,
                CreateMode         = model.CreateMode,
                RestorePointInTime = restorePointInTime,
                ElasticPoolId      = elasticPoolId,
                Sku = string.IsNullOrWhiteSpace(model.SkuName) ? null : new Management.Sql.Models.Sku()
                {
                    Name     = model.SkuName,
                    Tier     = model.Edition,
                    Family   = model.Family,
                    Capacity = model.Capacity
                },
                LicenseType = model.LicenseType
            };

            if (model.CreateMode.Equals(Management.Sql.Models.CreateMode.Recovery))
            {
                dbModel.SourceDatabaseId                = resourceId;
                dbModel.RecoverableDatabaseId           = resourceId;
                dbModel.RecoveryServicesRecoveryPointId = resourceId;
            }
            else if (model.CreateMode.Equals(Management.Sql.Models.CreateMode.Restore))
            {
                dbModel.RestorableDroppedDatabaseId     = resourceId;
                dbModel.RecoveryServicesRecoveryPointId = resourceId;
            }
            else if (model.CreateMode.Equals(Management.Sql.Models.CreateMode.RestoreLongTermRetentionBackup) && resourceId.Contains("/providers/Microsoft.Sql"))
            {
                // LTR V2
                dbModel.LongTermRetentionBackupResourceId = resourceId;
                dbModel.SourceDatabaseId = resourceId;
            }
            else
            {
                dbModel.SourceDatabaseId = resourceId;
                dbModel.RecoveryServicesRecoveryPointId = resourceId;
            }

            Management.Sql.Models.Database database = Communicator.RestoreDatabase(resourceGroup, model.ServerName, model.DatabaseName, dbModel);

            return(new AzureSqlDatabaseModel(resourceGroup, model.ServerName, database));
        }
示例#11
0
        /// <summary>
        /// Send the restore request
        /// </summary>
        /// <returns>The list of entities</returns>
        protected override AzureSqlDatabaseModel GetEntity()
        {
            AzureSqlDatabaseModel model;
            DateTime restorePointInTime = DateTime.MinValue;
            string   createMode;
            string   location = ModelAdapter.GetServerLocation(ResourceGroupName, ServerName);

            switch (ParameterSetName)
            {
            case FromPointInTimeBackupSetName:
            case FromPointInTimeBackupWithVcoreSetName:
                createMode         = "PointInTimeRestore";
                restorePointInTime = PointInTime;
                break;

            case FromDeletedDatabaseBackupSetName:
            case FromDeletedDatabaseBackupWithVcoreSetName:
                createMode         = "Restore";
                restorePointInTime = PointInTime == DateTime.MinValue ? DeletionDate : PointInTime;
                break;

            case FromGeoBackupSetName:
            case FromGeoBackupWithVcoreSetName:
                createMode = "Recovery";
                break;

            case FromLongTermRetentionBackupSetName:
            case FromLongTermRetentionBackupWithVcoreSetName:
                createMode = "RestoreLongTermRetentionBackup";
                break;

            default:
                throw new ArgumentException("No ParameterSet name");
            }

            model = new AzureSqlDatabaseModel()
            {
                Location                      = location,
                ResourceGroupName             = ResourceGroupName,
                ServerName                    = ServerName,
                DatabaseName                  = TargetDatabaseName,
                ElasticPoolName               = ElasticPoolName,
                RequestedServiceObjectiveName = ServiceObjectiveName,
                Edition     = Edition,
                CreateMode  = createMode,
                LicenseType = LicenseType
            };

            if (ParameterSetName == FromPointInTimeBackupWithVcoreSetName || ParameterSetName == FromDeletedDatabaseBackupWithVcoreSetName ||
                ParameterSetName == FromGeoBackupWithVcoreSetName || ParameterSetName == FromLongTermRetentionBackupWithVcoreSetName)
            {
                string skuName = AzureSqlDatabaseAdapter.GetDatabaseSkuName(Edition);
                model.SkuName  = skuName;
                model.Edition  = Edition;
                model.Capacity = VCore;
                model.Family   = ComputeGeneration;
            }
            else
            {
                model.SkuName = string.IsNullOrWhiteSpace(ServiceObjectiveName) ? AzureSqlDatabaseAdapter.GetDatabaseSkuName(Edition) : ServiceObjectiveName;
                model.Edition = Edition;
            }

            return(ModelAdapter.RestoreDatabase(this.ResourceGroupName, restorePointInTime, ResourceId, model));
        }
        /// <summary>
        /// Restore a given Sql Azure Database
        /// </summary>
        /// <param name="resourceGroup">The name of the resource group</param>
        /// <param name="restorePointInTime">A point to time to restore to (for PITR and dropped DB restore)</param>
        /// <param name="resourceId">The resource ID of the DB to restore (live, geo backup, deleted database, long term retention backup, etc.)</param>
        /// <param name="model">An object modeling the database to create via restore</param>
        /// <returns>Restored database object</returns>
        internal AzureSqlDatabaseModel RestoreDatabase(string resourceGroup, DateTime restorePointInTime, string resourceId, AzureSqlDatabaseModel model)
        {
            // Construct the ARM resource Id of the pool
            string elasticPoolId = string.IsNullOrWhiteSpace(model.ElasticPoolName) ? null : AzureSqlDatabaseModel.PoolIdTemplate.FormatInvariant(
                _subscription.Id,
                resourceGroup,
                model.ServerName,
                model.ElasticPoolName);

            // Restore database
            var dbModel = new Management.Sql.Models.Database()
            {
                Location           = model.Location,
                CreateMode         = model.CreateMode,
                RestorePointInTime = restorePointInTime,
                ElasticPoolId      = elasticPoolId,
                Sku = string.IsNullOrWhiteSpace(model.SkuName) ? null : new Management.Sql.Models.Sku()
                {
                    Name     = model.SkuName,
                    Tier     = model.Edition,
                    Family   = model.Family,
                    Capacity = model.Capacity
                },
                LicenseType        = model.LicenseType,
                StorageAccountType = MapExternalBackupStorageRedundancyToInternal(model.BackupStorageRedundancy),
            };

            if (model.CreateMode == Management.Sql.Models.CreateMode.Recovery)
            {
                dbModel.RecoverableDatabaseId = resourceId;
            }
            else if (model.CreateMode == Management.Sql.Models.CreateMode.Restore)
            {
                dbModel.RestorableDroppedDatabaseId = resourceId;
            }
            else if (model.CreateMode == Management.Sql.Models.CreateMode.PointInTimeRestore)
            {
                dbModel.SourceDatabaseId = resourceId;
            }
            else if (model.CreateMode == Management.Sql.Models.CreateMode.RestoreLongTermRetentionBackup)
            {
                dbModel.LongTermRetentionBackupResourceId = resourceId;
            }
            else
            {
                throw new ArgumentException("Restore mode not supported");
            }

            Management.Sql.Models.Database database = Communicator.RestoreDatabase(resourceGroup, model.ServerName, model.DatabaseName, dbModel);

            return(new AzureSqlDatabaseModel(resourceGroup, model.ServerName, database));
        }
        /// <summary>
        /// Restore a given Sql Azure Database
        /// </summary>
        /// <param name="resourceGroup">The name of the resource group</param>
        /// <param name="restorePointInTime">A point to time to restore to (for PITR and dropped DB restore)</param>
        /// <param name="resourceId">The resource ID of the DB to restore (live, geo backup, deleted database, long term retention backup, etc.)</param>
        /// <param name="model">An object modeling the database to create via restore</param>
        /// <param name="isCrossSubscriptionRestore">Is cross subscription restore</param>
        /// <param name="customHeaders">Custom headers</param>
        /// <returns>Restored database object</returns>
        internal AzureSqlDatabaseModel RestoreDatabase(string resourceGroup, DateTime restorePointInTime, string resourceId, AzureSqlDatabaseModel model, bool isCrossSubscriptionRestore, Dictionary <string, List <string> > customHeaders = null)
        {
            // Construct the ARM resource Id of the pool
            string elasticPoolId = string.IsNullOrWhiteSpace(model.ElasticPoolName) ? null : AzureSqlDatabaseModel.PoolIdTemplate.FormatInvariant(
                _subscription.Id,
                resourceGroup,
                model.ServerName,
                model.ElasticPoolName);

            // Restore database
            var dbModel = new Management.Sql.Models.Database()
            {
                Location           = model.Location,
                CreateMode         = model.CreateMode,
                RestorePointInTime = restorePointInTime,
                ElasticPoolId      = elasticPoolId,
                Sku = string.IsNullOrWhiteSpace(model.SkuName) ? null : new Management.Sql.Models.Sku()
                {
                    Name     = model.SkuName,
                    Tier     = model.Edition,
                    Family   = model.Family,
                    Capacity = model.Capacity
                },
                LicenseType = model.LicenseType,
                RequestedBackupStorageRedundancy = model.RequestedBackupStorageRedundancy,
                ZoneRedundant = model.ZoneRedundant,
            };

            // check if restore operation is cross subscription or same subscription
            if (isCrossSubscriptionRestore)
            {
                // cross subscription path
                if (dbModel.CreateMode != Management.Sql.Models.CreateMode.Recovery &&
                    dbModel.CreateMode != Management.Sql.Models.CreateMode.Restore &&
                    dbModel.CreateMode != Management.Sql.Models.CreateMode.PointInTimeRestore)
                {
                    throw new ArgumentException("Restore mode not supported for cross subscription restore. Supported restore modes for cross subscription are Recovery, Restore, PointInTimeRestore.");
                }

                dbModel.SourceResourceId = resourceId;
            }
            else
            {
                // same subscription path
                if (model.CreateMode == Management.Sql.Models.CreateMode.Recovery)
                {
                    dbModel.RecoverableDatabaseId = resourceId;
                }
                else if (model.CreateMode == Management.Sql.Models.CreateMode.Restore)
                {
                    dbModel.RestorableDroppedDatabaseId = resourceId;
                }
                else if (model.CreateMode == Management.Sql.Models.CreateMode.PointInTimeRestore)
                {
                    dbModel.SourceDatabaseId = resourceId;
                }
                else if (model.CreateMode == Management.Sql.Models.CreateMode.RestoreLongTermRetentionBackup)
                {
                    dbModel.LongTermRetentionBackupResourceId = resourceId;
                }
                else
                {
                    throw new ArgumentException("Restore mode not supported");
                }
            }

            Management.Sql.Models.Database database = Communicator.RestoreDatabase(resourceGroup, model.ServerName, model.DatabaseName, dbModel, customHeaders);

            return(new AzureSqlDatabaseModel(resourceGroup, model.ServerName, database));
        }
        /// <summary>
        /// Restore a given Sql Azure Database
        /// </summary>
        /// <param name="resourceGroup">The name of the resource group</param>
        /// <param name="serverName">The name of the Azure SQL Server</param>
        /// <param name="databaseName">The name of the Azure SQL database</param>
        /// <param name="parameters">Parameters describing the database restore request</param>
        /// <returns>Restored database object</returns>
        public Management.Sql.Models.Database RestoreDatabase(string resourceGroupName, string serverName, string databaseName, string resourceId, AzureSqlDatabaseModel model)
        {
            GenericResource resource = new GenericResource
            {
                Location   = model.Location,
                Properties = new Dictionary <string, object>
                {
                    { "LongTermRetentionBackupResourceId", resourceId },
                    { "CreateMode", model.CreateMode },
                    { "ElasticPoolName", model.ElasticPoolName },
                }
            };

            Sku sku = new Sku();

            if (!string.IsNullOrWhiteSpace(model.RequestedServiceObjectiveName))
            {
                sku.Name = model.RequestedServiceObjectiveName;
            }

            if (model.Edition != Database.Model.DatabaseEdition.None)
            {
                sku.Tier = model.Edition.ToString();
                if (string.IsNullOrWhiteSpace(model.RequestedServiceObjectiveName))
                {
                    // If the customer only provided Edition, map to the default SLO.
                    //
                    switch (model.Edition)
                    {
                    case Database.Model.DatabaseEdition.Free:
                        sku.Name = "Free";
                        break;

                    case Database.Model.DatabaseEdition.Basic:
                        sku.Name = "Basic";
                        break;

                    case Database.Model.DatabaseEdition.Standard:
                        sku.Name = "S0";
                        break;

                    case Database.Model.DatabaseEdition.Premium:
                        sku.Name = "P1";
                        break;

                    case Database.Model.DatabaseEdition.PremiumRS:
                        sku.Name = "PRS1";
                        break;

                    case Database.Model.DatabaseEdition.DataWarehouse:
                        sku.Name = "DW100";
                        break;

                    case Database.Model.DatabaseEdition.Stretch:
                        sku.Name = "DS100";
                        break;
                    }
                }
            }

            if (!string.IsNullOrWhiteSpace(sku.Name) || !string.IsNullOrWhiteSpace(sku.Tier))
            {
                resource.Sku = sku;
            }

            GenericResource database = GetCurrentResourcesClient().Resources.CreateOrUpdate(resourceGroupName, "Microsoft.Sql", string.Format("servers/{0}", serverName), "databases", databaseName, "2017-03-01-preview", resource);

            if (database != null)
            {
                return(GetCurrentSqlClient().Databases.Get(resourceGroupName, serverName, databaseName));
            }
            else
            {
                return(null);
            }
        }
        /// <summary>
        /// Restore a given Sql Azure Database
        /// </summary>
        /// <param name="resourceGroup">The name of the resource group</param>
        /// <param name="restorePointInTime">A point to time to restore to (for PITR and dropped DB restore)</param>
        /// <param name="resourceId">The resource ID of the DB to restore (live, geo backup, deleted database, long term retention backup, etc.)</param>
        /// <param name="model">An object modeling the database to create via restore</param>
        /// <returns>Restored database object</returns>
        internal AzureSqlDatabaseModel RestoreDatabase(string resourceGroup, DateTime restorePointInTime, string resourceId, AzureSqlDatabaseModel model)
        {
            if (model.CreateMode.Equals("RestoreLongTermRetentionBackup", StringComparison.OrdinalIgnoreCase) && CultureInfo.CurrentCulture.CompareInfo.IndexOf(resourceId, "/providers/Microsoft.Sql", CompareOptions.IgnoreCase) >= 0)
            {
                // LongTermRetentionV2 Restore
                //
                Management.Sql.Models.Database database = Communicator.RestoreDatabase(resourceGroup, model.ServerName, model.DatabaseName, resourceId, model);

                return(new AzureSqlDatabaseModel(resourceGroup, model.ServerName, database));
            }
            else
            {
                DatabaseCreateOrUpdateParameters parameters = new DatabaseCreateOrUpdateParameters()
                {
                    Location   = model.Location,
                    Properties = new DatabaseCreateOrUpdateProperties()
                    {
                        Edition = model.Edition == DatabaseEdition.None ? null : model.Edition.ToString(),
                        RequestedServiceObjectiveId             = model.RequestedServiceObjectiveId,
                        ElasticPoolName                         = model.ElasticPoolName,
                        RequestedServiceObjectiveName           = model.RequestedServiceObjectiveName,
                        SourceDatabaseId                        = resourceId,
                        RecoveryServicesRecoveryPointResourceId = resourceId,
                        RestorePointInTime                      = restorePointInTime,
                        CreateMode = model.CreateMode
                    }
                };
                var resp = Communicator.LegacyRestoreDatabase(resourceGroup, model.ServerName, model.DatabaseName, parameters);
                return(AzureSqlDatabaseAdapter.CreateDatabaseModelFromResponse(resourceGroup, model.ServerName, resp));
            }
        }