private ProvisioningService(int provisioningOptionId, ProvisioningParameters provisioningParameters)
        {
            _provisioningTasks      = Factory.CreatePipeline(provisioningOptionId, provisioningParameters);
            _provisioningParameters = provisioningParameters;

            SetParameters();
        }
        private static void SetDay1Parameters(ProvisioningParameters parameters, string theme)
        {
            // Database Properties
            parameters.Tenant.DatabaseName = Settings.TenantDbName;
            parameters.Tenant.SqlVersion   = Settings.TenantDbVersion;
            parameters.Tenant.UserName     = Settings.TenantDbUsername;
            parameters.Tenant.Password     = Settings.TenantDbPassword;

            // Deployment Switches
            parameters.Properties.HasDatabaseSchema = true;
            parameters.Properties.HasDatabaseViews  = true;

            // Deployment Scripts
            parameters.Properties.DatabaseSchema     = ResourceHelper.ReadText(@"Tenant\Database\Schema.sql");
            parameters.Properties.DatabaseViews      = ResourceHelper.ReadText(@"Tenant\Database\Views.sql");
            parameters.Properties.WebSitePackage     = ResourceHelper.ReadBytes(@"Tenant\Website\Package.zip");
            parameters.Properties.WebSitePackageName = "scheduleTenant-package.zip";

            // Database
            switch (theme)
            {
            case "Rock":
                parameters.Properties.DatabaseInformation = ResourceHelper.ReadText(@"Tenant\Database\Rock.sql");
                break;

            case "Classical":
                parameters.Properties.DatabaseInformation = ResourceHelper.ReadText(@"Tenant\Database\Symphony.sql");
                break;

            case "Pop":
                parameters.Properties.DatabaseInformation = ResourceHelper.ReadText(@"Tenant\Database\Pop.sql");
                break;
            }
        }
        private static BaseProvisioner CreatePipelineComponent(ProvisioningPipelineTask task, ProvisioningParameters provisioningParameters)
        {
            switch (task.TaskCode)
            {
                // Shared Components
                case Provisioner.Shared_ResourceGroup: return new Shared.ResourceGroup(task.Id, task.Position, task.GroupNo, task.WaitForCompletion);
                case Provisioner.Shared_SqlServerSchema: return new Shared.SqlSchemaDeployment(task.Id, task.Position, task.GroupNo, task.WaitForCompletion);
                case Provisioner.Shared_SqlServerPopulate: return new Shared.SqlSchemaPopulator(task.Id, task.Position, task.GroupNo, task.WaitForCompletion);
                case Provisioner.Shared_SearchService: return new Shared.SearchService(task.Id, task.Position, task.GroupNo, task.WaitForCompletion);
                case Provisioner.Shared_WebHostingPlan: return new Shared.WebHostingPlanCreator(task.Id, task.Position, task.GroupNo, task.WaitForCompletion);
                case Provisioner.Shared_Website: return new Shared.WebSiteCreator(task.Id, task.Position, task.GroupNo, task.WaitForCompletion);
                case Provisioner.Shared_TrafficManager: return new Shared.TrafficManagerProfile(task.Id, task.Position, task.GroupNo, task.WaitForCompletion);
                case Provisioner.Shared_SqlAuditing: return new Shared.SqlAuditing(task.Id, task.Position, task.GroupNo, task.WaitForCompletion);
                case Provisioner.Shared_DocumentDb: return new Shared.DocumentDb(task.Id, task.Position, task.GroupNo, task.WaitForCompletion);

                // Day 1 Components
                case Provisioner.Day1_StorageAccount: return new StorageAccountCreator(task.Id, task.Position, task.GroupNo, task.WaitForCompletion);
                case Provisioner.Day1_SqlServer: return new Day1.SqlDatabase(task.Id, task.Position, task.GroupNo, task.WaitForCompletion);
                case Provisioner.Day1_WebsiteDeployment: return new Day1.WebSiteDeployment(task.Id, task.Position, task.GroupNo, task.WaitForCompletion);

                // Day 2 Components
                case Provisioner.Day2_StorageAccount: return new StorageAccountCreator(task.Id, task.Position, task.GroupNo, task.WaitForCompletion);
                case Provisioner.Day2_SqlServer: return new Day2.SqlDatabase(task.Id, task.Position, task.GroupNo, task.WaitForCompletion);
                case Provisioner.Day2_WebsiteDeployment: return new Day2.WebSiteDeployment(task.Id, task.Position, task.GroupNo, task.WaitForCompletion);
                
                case Provisioner.Day2_DataFactory: return new Day2.DataFactory111(task.Id, task.Position, task.GroupNo, task.WaitForCompletion);

                default:
                    return null;
            }
        }
        private static ProvisioningParameters GetParameters(int day, IEnumerable <AzureLocation> dataCenters, TenantModel scheduleTenant, TenantModel day1Tenant, bool isAdminInterface)
        {
            // Default Parameters
            var parameters = new ProvisioningParameters()
            {
                Tenant = new Tenant()
                {
                    TenantId = scheduleTenant.TenantId,
                    SiteName = scheduleTenant.SiteName,
                    Theme    = scheduleTenant.Theme,
                },
                Properties = new Properties()
                {
                    LocationPrimary             = scheduleTenant.DataCenter,
                    TargetUsername              = scheduleTenant.Username,
                    TargetSubscription          = scheduleTenant.SubscriptionId,
                    TargetTenant                = scheduleTenant.OrganizationId,
                    IsRunningFromAdminInterface = isAdminInterface,
                    V12Locations                = dataCenters.Select(d => d.Name).ToList(),
                },
            };

            // Add Values
            if (day == 1)
            {
                SetDay1Parameters(parameters, scheduleTenant.Theme);
            }
            else
            {
                SetDay2Parameters(parameters);
            }

            return(parameters);
        }
        private ProvisioningService(int provisioningOptionId, ProvisioningParameters provisioningParameters)
        {
            _provisioningTasks = Factory.CreatePipeline(provisioningOptionId, provisioningParameters);
            _provisioningParameters = provisioningParameters;

            SetParameters();
        }
        public static List<BaseProvisioner> CreatePipeline(int provisioningOptionId, ProvisioningParameters provisioningParameters)
        {
            // FetchById components and their execution order for option (Standand/Premium)
            var provisioningPipelineRepository = new ProvisioningPipelineRepository();
            var tasks = provisioningPipelineRepository.FetchPipelineTasks(provisioningOptionId);

            // Create the Pipeline components based on their unique codes
            var pipeline = new List<BaseProvisioner>();

            tasks.ForEach(t => pipeline.Add(CreatePipelineComponent(t, provisioningParameters)));

            return pipeline;
        }
        private static void SetDay2Parameters(ProvisioningParameters parameters)
        {
            // Database Properties
            parameters.Tenant.DatabaseName = Settings.ProductRecommendationsDbName;
            parameters.Tenant.SqlVersion   = Settings.ProductRecommendationsDbVersion;
            parameters.Tenant.UserName     = Settings.ProductRecommendationsDbUsername;
            parameters.Tenant.Password     = Settings.ProductRecommendationsDbPassword;

            // Deployment Switches
            parameters.Properties.HasDatabaseSchema = true;
            parameters.Properties.HasDatabaseViews  = false;

            // Deployment Scripts
            parameters.Properties.DatabaseSchema      = ResourceHelper.ReadText(@"ProductRecommendations\Database\Schema.sql");
            parameters.Properties.DatabaseInformation = ResourceHelper.ReadText(@"ProductRecommendations\Database\Populate.sql");
            parameters.Properties.WebSitePackage      = ResourceHelper.ReadBytes(@"ProductRecommendations\Website\Package.zip");
            parameters.Properties.WebSitePackageName  = "recommendations-package.zip";
        }
        private static void SetDay2Parameters(ProvisioningParameters parameters)
        {
            // Database Properties
            parameters.Tenant.DatabaseName = Settings.ProductRecommendationsDbName;
            parameters.Tenant.SqlVersion = Settings.ProductRecommendationsDbVersion;
            parameters.Tenant.UserName = Settings.ProductRecommendationsDbUsername;
            parameters.Tenant.Password = Settings.ProductRecommendationsDbPassword;

            // Deployment Switches
            parameters.Properties.HasDatabaseSchema = true;
            parameters.Properties.HasDatabaseViews = false;

            // Deployment Scripts
            parameters.Properties.DatabaseSchema = ResourceHelper.ReadText(@"ProductRecommendations\Database\Schema.sql");
            parameters.Properties.DatabaseInformation = ResourceHelper.ReadText(@"ProductRecommendations\Database\Populate.sql");
            parameters.Properties.WebSitePackage = ResourceHelper.ReadBytes(@"ProductRecommendations\Website\Package.zip");
            parameters.Properties.WebSitePackageName = "recommendations-package.zip";
        }
        private static void SetDay1Parameters(ProvisioningParameters parameters, string theme)
        {
            // Database Properties
            parameters.Tenant.DatabaseName = Settings.TenantDbName;
            parameters.Tenant.SqlVersion = Settings.TenantDbVersion;
            parameters.Tenant.UserName = Settings.TenantDbUsername;
            parameters.Tenant.Password = Settings.TenantDbPassword;

            // Deployment Switches
            parameters.Properties.HasDatabaseSchema = true;
            parameters.Properties.HasDatabaseViews = true;

            // Deployment Scripts
            parameters.Properties.DatabaseSchema = ResourceHelper.ReadText(@"Tenant\Database\Schema.sql");
            parameters.Properties.DatabaseViews = ResourceHelper.ReadText(@"Tenant\Database\Views.sql");
            parameters.Properties.WebSitePackage = ResourceHelper.ReadBytes(@"Tenant\Website\Package.zip");
            parameters.Properties.WebSitePackageName = "scheduleTenant-package.zip";

            // Database
            switch (theme)
            {
                case "Rock":
                    parameters.Properties.DatabaseInformation = ResourceHelper.ReadText(@"Tenant\Database\Rock.sql");
                    break;
                case "Classical":
                    parameters.Properties.DatabaseInformation = ResourceHelper.ReadText(@"Tenant\Database\Symphony.sql");
                    break;
                case "Pop":
                    parameters.Properties.DatabaseInformation = ResourceHelper.ReadText(@"Tenant\Database\Pop.sql");
                    break;
            }
        }
        private static ProvisioningParameters GetParameters(int day, IEnumerable<AzureLocation> dataCenters, TenantModel scheduleTenant, TenantModel day1Tenant, bool isAdminInterface)
        {
            // Default Parameters
            var parameters = new ProvisioningParameters()
            {
                Tenant = new Tenant()
                {
                    TenantId = scheduleTenant.TenantId,
                    SiteName = scheduleTenant.SiteName,
                    Theme = scheduleTenant.Theme,
                },
                Properties = new Properties()
                {
                    LocationPrimary = scheduleTenant.DataCenter,
                    TargetUsername = scheduleTenant.Username,
                    TargetSubscription = scheduleTenant.SubscriptionId,
                    TargetTenant = scheduleTenant.OrganizationId,
                    IsRunningFromAdminInterface = isAdminInterface,
                    V12Locations = dataCenters.Select(d => d.Name).ToList(),
                },
            };

            // Add Values
            if (day == 1)
            {
                SetDay1Parameters(parameters, scheduleTenant.Theme);
            }
            else
            {
                SetDay2Parameters(parameters);    
            }

            return parameters;
        }