Ejemplo n.º 1
0
    public async Task <BackupPolicy> GetBackupSchedulingPolicyAsync(BackupPartitionInfo backupPartitionInfo,
                                                                    TimeSpan timeout,
                                                                    CancellationToken cancellationToken)
    {
        BackupPolicy backupPolicy;

        BackupRestoreTrace.TraceSource.WriteInfo(TraceType, "{0} GetBackupPolicy invoked", backupPartitionInfo.PartitionId);

        var backupMappingStore = await BackupMappingStore.CreateOrGetBackupMappingStore(this.statefulService);

        var backupPolicyStore = await BackupPolicyStore.CreateOrGetBackupPolicyStore(this.statefulService);

        var suspendStore = await SuspendStore.CreateOrGetSuspendStatusStore(this.statefulService);

        var serviceNameUri = await UtilityHelper.GetCustomServiceUri(backupPartitionInfo.ServiceName, timeout, cancellationToken);

        var backupMappingKey = UtilityHelper.GetBackupMappingKey(serviceNameUri, backupPartitionInfo.PartitionId.ToString());

        var backupMappingModel = (await backupMappingStore.GetValueAsync(backupMappingKey) ??
                                  await backupMappingStore.GetValueAsync(serviceNameUri)) ??
                                 await backupMappingStore.GetValueAsync(UtilityHelper.GetApplicationNameFromService(serviceNameUri));

        bool isPartitionSuspended = await suspendStore.GetValueAsync(backupMappingKey) != null;

        if (backupMappingModel == null || isPartitionSuspended)
        {
            BackupRestoreTrace.TraceSource.WriteInfo(TraceType, "{0} Backup protection not enabled", backupPartitionInfo.PartitionId);
            throw new FabricPeriodicBackupNotEnabledException();
        }

        var backupPolicyName  = backupMappingModel.BackupPolicyName;
        var backupPolicyModel = await backupPolicyStore.GetValueAsync(backupPolicyName);

        switch (backupPolicyModel.BackupSchedule.BackupScheduleType)
        {
        case BackupScheduleType.FrequencyBased:
            backupPolicy = new FrequencyBasedBackupPolicy();
            var frequencyBasedSchedulePolicy = (System.Fabric.BackupRestore.Common.Model.FrequencyBasedBackupSchedule)backupPolicyModel.BackupSchedule;
            backupPolicy.PolicyType = BackupPolicyType.FrequencyBased;
            var freqBackupPolicy = (FrequencyBasedBackupPolicy)backupPolicy;

            freqBackupPolicy.RunFrequency = (ushort)frequencyBasedSchedulePolicy.Interval;

            if (frequencyBasedSchedulePolicy.IntervalType == BackupScheduleInterval.Hours)
            {
                freqBackupPolicy.RunFrequencyType = BackupPolicyRunFrequency.Hours;
            }

            if (frequencyBasedSchedulePolicy.IntervalType == BackupScheduleInterval.Minutes)
            {
                freqBackupPolicy.RunFrequencyType = BackupPolicyRunFrequency.Minutes;
            }

            break;

        case BackupScheduleType.TimeBased:
            backupPolicy = new ScheduleBasedBackupPolicy();
            var scheduleBasedSchedulePolicy = (System.Fabric.BackupRestore.Common.Model.TimeBasedBackupSchedule)backupPolicyModel.BackupSchedule;
            backupPolicy.PolicyType = BackupPolicyType.ScheduleBased;

            var schdBackupPolicy = (ScheduleBasedBackupPolicy)backupPolicy;
            if (scheduleBasedSchedulePolicy.ScheduleFrequencyType == BackupScheduleFrequency.Daily)
            {
                schdBackupPolicy.RunSchedule = BackupPolicyRunSchedule.Daily;
            }

            if (scheduleBasedSchedulePolicy.ScheduleFrequencyType == BackupScheduleFrequency.Weekly)
            {
                schdBackupPolicy.RunSchedule = BackupPolicyRunSchedule.Weekly;
            }

            schdBackupPolicy.RunDays  = new List <DayOfWeek>(scheduleBasedSchedulePolicy.RunDays);
            schdBackupPolicy.RunTimes = new List <TimeSpan>(scheduleBasedSchedulePolicy.RunTimes);

            break;

        default:
            throw new FabricPeriodicBackupNotEnabledException();
        }

        backupPolicy.MaxIncrementalBackups = Convert.ToByte(backupPolicyModel.MaxIncrementalBackup);
        backupPolicy.Name     = backupPolicyModel.Name;
        backupPolicy.PolicyId = backupPolicyModel.UniqueId;

        switch (backupPolicyModel.Storage.BackupStorageType)
        {
        case BackupStorageType.FileShare:
            var fileShareStorage = (System.Fabric.BackupRestore.Common.Model.FileShareBackupStorageInfo)backupPolicyModel.Storage;
            backupPolicy.StoreInformation = new FileShareBackupStore
            {
                AccessType          = String.IsNullOrEmpty(fileShareStorage.PrimaryUserName) ? FileShareAccessType.None : FileShareAccessType.DomainUser,
                FileSharePath       = Path.Combine(fileShareStorage.Path, UtilityHelper.GetBaseDirectoryPathForPartition(serviceNameUri, backupPartitionInfo.PartitionId.ToString())),
                PrimaryUserName     = fileShareStorage.PrimaryUserName,
                PrimaryPassword     = fileShareStorage.PrimaryPassword,
                SecondaryUserName   = fileShareStorage.SecondaryUserName,
                SecondaryPassword   = fileShareStorage.SecondaryPassword,
                IsPasswordEncrypted = fileShareStorage.IsPasswordEncrypted,
            };
            break;

        case BackupStorageType.AzureBlobStore:
            var azureStorage = (System.Fabric.BackupRestore.Common.Model.AzureBlobBackupStorageInfo)backupPolicyModel.Storage;
            backupPolicy.StoreInformation = new AzureBlobBackupStore
            {
                ConnectionString      = azureStorage.ConnectionString,
                ContainerName         = azureStorage.ContainerName,
                FolderPath            = UtilityHelper.GetBaseDirectoryPathForPartition(serviceNameUri, backupPartitionInfo.PartitionId.ToString()),
                IsAccountKeyEncrypted = azureStorage.IsConnectionStringEncrypted,
            };
            break;

        case BackupStorageType.DsmsAzureBlobStore:
            var dsmsAzureStorage = (System.Fabric.BackupRestore.Common.Model.DsmsAzureBlobBackupStorageInfo)backupPolicyModel.Storage;
            backupPolicy.StoreInformation = new DsmsAzureBlobBackupStore
            {
                StorageCredentialsSourceLocation = dsmsAzureStorage.StorageCredentialsSourceLocation,
                ContainerName = dsmsAzureStorage.ContainerName,
                FolderPath    = UtilityHelper.GetBaseDirectoryPathForPartition(serviceNameUri, backupPartitionInfo.PartitionId.ToString()),
            };
            break;
        }

        return(backupPolicy);
    }
        private BackupPolicyDataStructure GetBackupPolicyDataStructure(BackupPolicy backupPolicyModel, string serviceName, string partitionId)
        {
            BackupPolicyDataStructure backupPolicy;

            switch (backupPolicyModel.BackupSchedule.BackupScheduleType)
            {
            case BackupScheduleType.FrequencyBased:
                backupPolicy = new FrequencyBasedBackupPolicy();
                var frequencyBasedSchedulePolicy = (FrequencyBasedBackupSchedule)backupPolicyModel.BackupSchedule;
                backupPolicy.PolicyType = BackupPolicyType.FrequencyBased;
                var freqBackupPolicy = (FrequencyBasedBackupPolicy)backupPolicy;
                freqBackupPolicy.RunFrequency = (ushort)frequencyBasedSchedulePolicy.Interval;

                if (frequencyBasedSchedulePolicy.IntervalType == BackupScheduleInterval.Hours)
                {
                    freqBackupPolicy.RunFrequencyType = BackupPolicyRunFrequency.Hours;
                }

                if (frequencyBasedSchedulePolicy.IntervalType == BackupScheduleInterval.Minutes)
                {
                    freqBackupPolicy.RunFrequencyType = BackupPolicyRunFrequency.Minutes;
                }

                break;

            case BackupScheduleType.TimeBased:
                backupPolicy = new ScheduleBasedBackupPolicy();
                var scheduleBasedSchedulePolicy = (TimeBasedBackupSchedule)backupPolicyModel.BackupSchedule;
                backupPolicy.PolicyType = BackupPolicyType.ScheduleBased;

                var schdBackupPolicy = (ScheduleBasedBackupPolicy)backupPolicy;
                if (scheduleBasedSchedulePolicy.ScheduleFrequencyType == BackupScheduleFrequency.Daily)
                {
                    schdBackupPolicy.RunSchedule = BackupPolicyRunSchedule.Daily;
                }

                if (scheduleBasedSchedulePolicy.ScheduleFrequencyType == BackupScheduleFrequency.Weekly)
                {
                    schdBackupPolicy.RunSchedule = BackupPolicyRunSchedule.Weekly;
                }

                schdBackupPolicy.RunDays  = new List <DayOfWeek>(scheduleBasedSchedulePolicy.RunDays);
                schdBackupPolicy.RunTimes = new List <TimeSpan>(scheduleBasedSchedulePolicy.RunTimes);

                break;

            default:
                throw new FabricPeriodicBackupNotEnabledException();
            }

            backupPolicy.MaxIncrementalBackups = Convert.ToByte(backupPolicyModel.MaxIncrementalBackup);
            backupPolicy.Name     = backupPolicyModel.Name;
            backupPolicy.PolicyId = backupPolicyModel.UniqueId;

            switch (backupPolicyModel.Storage.BackupStorageType)
            {
            case BackupStorageType.FileShare:
                var fileShareStorage = (FileShareBackupStorageInfo)backupPolicyModel.Storage;
                backupPolicy.StoreInformation = new FileShareBackupStore
                {
                    AccessType          = String.IsNullOrEmpty(fileShareStorage.PrimaryUserName) ? FileShareAccessType.None : FileShareAccessType.DomainUser,
                    FileSharePath       = Path.Combine(fileShareStorage.Path, UtilityHelper.GetBaseDirectoryPathForPartition(serviceName, partitionId)),
                    PrimaryUserName     = fileShareStorage.PrimaryUserName,
                    PrimaryPassword     = fileShareStorage.PrimaryPassword,
                    SecondaryUserName   = fileShareStorage.SecondaryUserName,
                    SecondaryPassword   = fileShareStorage.SecondaryPassword,
                    IsPasswordEncrypted = fileShareStorage.IsPasswordEncrypted,
                };
                break;

            case BackupStorageType.AzureBlobStore:
                var azureStorage = (AzureBlobBackupStorageInfo)backupPolicyModel.Storage;
                backupPolicy.StoreInformation = new AzureBlobBackupStore
                {
                    ConnectionString      = azureStorage.ConnectionString,
                    ContainerName         = azureStorage.ContainerName,
                    FolderPath            = UtilityHelper.GetBaseDirectoryPathForPartition(serviceName, partitionId),             // TODO: This should be constructed
                    IsAccountKeyEncrypted = azureStorage.IsConnectionStringEncrypted,
                };
                break;

            case BackupStorageType.DsmsAzureBlobStore:
                var dsmsAzureStorage = (DsmsAzureBlobBackupStorageInfo)backupPolicyModel.Storage;
                backupPolicy.StoreInformation = new DsmsAzureBlobBackupStore
                {
                    StorageCredentialsSourceLocation = dsmsAzureStorage.StorageCredentialsSourceLocation,
                    ContainerName = dsmsAzureStorage.ContainerName,
                    FolderPath    = UtilityHelper.GetBaseDirectoryPathForPartition(serviceName, partitionId),                     // TODO: This should be constructed
                };
                break;
            }

            return(backupPolicy);
        }