public ActionResult Index(bool isDataCamp)
        {
            // Set Visibility
            ViewBag.Day1Visible = true;
            ViewBag.Day2Visible = isDataCamp;
            ViewBag.ShowMessage = false;

            // Set Defaults - Not logged in
            ViewBag.Day1Provisioned = false;
            ViewBag.Day2Provisioned = true;

            if (ClaimsPrincipal.Current.Identity.IsAuthenticated)
            {
                // Get the Tenants linked to the user
                var tenantService = new TenantService();
                var tenants = tenantService.FetchByUsername(ClaimsPrincipal.Current.Identity.SplitName());

                ViewBag.Day1Provisioned = 
                    tenants != null && 
                    tenants.Any(t => t.ProvisioningOptionCode.Equals("S1"));

                ViewBag.Day2Provisioned = 
                    tenants == null || 
                    tenants.Any(t => t.ProvisioningOptionCode.Equals("S1") && !t.AzureServicesProvisioned) || 
                    tenants.Any(t => t.ProvisioningOptionCode.Equals("S2"));

                ViewBag.ShowMessage =
                    tenants != null &&
                    tenants.Any(t => !t.AzureServicesProvisioned);

                return PartialView();
            }

            return PartialView();
        }
        public ActionResult StartDeprovisioning()
        {
            TempData["PipelineRunning"] = true;
            TempData["Process"] = "Deprovisioning";

            var tenantService = new TenantService();
            var tenants = tenantService.FetchByUsername(HttpContext.User.Identity.SplitName());

            DeprovisionTenantSite(tenants);

            return RedirectToAction("Index", "TenantView");
        }
        private bool IsTenant(string username)
        {
            // Fix the Username
            username = username.Split('#').Last();

            // Find the user
            var command = new TenantService();
            var tenants = command.FetchByUsername(username);

            // Check if user
            return tenants != null &&tenants.Any();
        }
        public ActionResult Index()
        {
            // Get working values
            var pipelineRunning = TempData["PipelineRunning"] != null && (bool)TempData["PipelineRunning"];
            var process = TempData["Process"] != null ? TempData["Process"].ToString() : string.Empty;

            // Get data
            var tenantService = new TenantService();
            var tenants = tenantService.FetchByUsername(HttpContext.User.Identity.SplitName());

            // Build the ViewModel
            var viewModel = BuildTenantViewModel(tenants);
            AddTenantServices(viewModel, pipelineRunning, process);
            SetupViewBag(viewModel, pipelineRunning, process);

            return View(viewModel);
        }
        private static ProvisioningService Create(int tenantId, bool isAdminInterface)
        {
            // Fetch the Tenant
            var tenantService   = new TenantService();
            var scheduledTenant = tenantService.FetchByTenantId(tenantId);

            // Get Day1 Tenant Site Url
            var tenants      = tenantService.FetchByUsername(scheduledTenant.Username);
            var dayOneTenant = tenants.First(t => t.ProvisioningOptionCode.Equals("S1"));

            // Get DataCenters
            var day         = scheduledTenant.ProvisioningOptionCode.Equals("S1") ? 1 : 2;
            var util        = new ManagementUtilities();
            var dataCenters = util.GetLocations(day, Settings.AccountSubscriptionId);

            // Build Parameters
            var provisioningParameters = GetParameters(day, dataCenters, scheduledTenant, dayOneTenant, isAdminInterface);

            // Create Provisioning Service
            return(new ProvisioningService((int)scheduledTenant.ProvisioningOptionId, provisioningParameters));
        }
        private static TenantModel GetDay1Tenant()
        {
            var tenantService = new TenantService();
            var tenants = tenantService.FetchByUsername(ClaimsPrincipal.Current.Identity.SplitName());

            return tenants.First(t => t.ProvisioningOptionCode.Equals("S1"));
        }
        private void CreateOrUpdate()
        {
            var locations = GetLocationList();

            // Loop all locations to find viable Sql Server V12 location
            foreach (var location in locations)
            {
                var asyncTaskList = new List <Task <bool> >();
                var awaitTaskList = new List <Task <bool> >();

                // Set first location
                ProvisioningParameters.Properties.LocationPrimary = location;

                // Loop through all the Parallel Provisiong Groups
                for (var group = 1; group <= _provisioningTasks.Max(p => p.GroupNo); group++)
                {
                    awaitTaskList = new List <Task <bool> >();

                    // Start tasks assigned to group
                    foreach (var provisioner in _provisioningTasks.Where(p => p.GroupNo == group))
                    {
                        var task = new Task <bool>(provisioner.RunCreateOrUpdate);
                        task.Start();

                        if (provisioner.WaitForCompletion)
                        {
                            awaitTaskList.Add(task);
                        }
                        else
                        {
                            asyncTaskList.Add(task);
                        }
                    }

                    // Wait for non-waiting tasks before continueing to group 5 (deploys the website)
                    // Certain settings are required from the previous groups
                    if (group == 4)
                    {
                        Task.WaitAll(asyncTaskList.ToArray());

                        // Check if errors occurred
                        if (asyncTaskList.Any(t => t.Result == false))
                        {
                            TasksCompleted = true;
                            ErrorsOccurred = true;

                            break;
                        }
                    }

                    // Await tasks marked for waiting
                    Task.WaitAll(awaitTaskList.ToArray());

                    // Check if Rollback is needed
                    if (_provisioningTasks.Any(t => t.RollbackRequired))
                    {
                        _provisioningTasks.ForEach(p => p.Status = "Queued");

                        var resourceGroup = _provisioningTasks.First(p => p.Service.Equals("Resource Group"));
                        ErrorsOccurred = !resourceGroup.RunRemove("Select Next V12 Location");

                        break;
                    }

                    // Check if errors occurred
                    if (awaitTaskList.Any(t => t.Result == false))
                    {
                        TasksCompleted = true;
                        ErrorsOccurred = true;

                        break;
                    }
                }
            }

            // Set completion status and automatically selected location
            AutomaticLocation = ProvisioningParameters.Properties.LocationPrimary;
            TasksCompleted    = true;

            // Mark scheduleTenant as provisioned
            if (_provisioningTasks.All(p => p.Status == "Deployed"))
            {
                ProvisioningCompleted = true;

                var tenantService = new TenantService();
                tenantService.SetProvisioningStatus(ProvisioningParameters.Tenant.TenantId, ProvisioningCompleted);
            }
        }
 public void DeleteAccount(string username)
 {
     var tenantService = new TenantService();
     tenantService.DeleteTenant(username);
 }
        public ActionResult Index(SignUpViewModel day1ViewModel)
        {
            var tenantService = new TenantService();

            // Build the Lookups
            var themes = FetchThemes();
            var provisioningOptions = FetchProvisioningOptions();
            var day1DataCenters = FetchAvailableDataCenters(1, day1ViewModel.SubscriptionId);
            var day2DataCenters = FetchAvailableDataCenters(2, day1ViewModel.SubscriptionId);
            var subscriptions = FetchSubscriptions();

            // Setup the ViewBag
            ViewBag.Themes = new SelectList(themes, "Id", "Description", null);
            ViewBag.Day1DataCenters = new SelectList(day1DataCenters, "Code", "Name", null);
            ViewBag.Day2DataCenters = new SelectList(day2DataCenters, "Code", "Name", null);
            ViewBag.Subscriptions = new SelectList(subscriptions, "Id", "DisplayName", null);

            // Check model validity
            if (!ModelState.IsValid)
            {
                return View(day1ViewModel);
            }

            // Check name and email
            var errors = tenantService.Validate(day1ViewModel.SiteName, day1ViewModel.SubscriptionId);
            if (errors.Any())
            {
                ViewBag.Errors = errors;
                return View(day1ViewModel);
            }

            // Update the DB with modification or new entry
            var organizationId = Settings.AccountOrganizationId;

            // Valid - Process the SignUp (Day1)
            var tenantId = tenantService.CreateDay1(new CreateTenantModel()
            {
                Tenant = new CreateTenantModel.TenantModel()
                {
                    ThemeId = day1ViewModel.ThemeId,
                    ProvisioningOptionId = provisioningOptions.First(o => o.Code.Equals("S1")).Id ?? -1,
                    DataCenter = !string.IsNullOrEmpty(day1ViewModel.Day1DataCenter) ? day1ViewModel.Day1DataCenter : null,
                    SiteName = day1ViewModel.SiteName.ToLower(),
                    OrganizationId = organizationId,
                    SubscriptionId = day1ViewModel.SubscriptionId
                },
                UserAccount = new CreateTenantModel.UserAccountModel()
                {
                    Username = ClaimsPrincipal.Current.Identity.SplitName(),
                    Firstname = day1ViewModel.FirstName,
                    Lastname = day1ViewModel.LastName,
                },
                CreditCard = new CreateTenantModel.CreditCardModel()
                {
                    CreditCardNumber = day1ViewModel.CreditCardNumber,
                    ExpiryDate = day1ViewModel.ExpiryDate,
                    CardVerificationValue = day1ViewModel.CardVerificationValue
                }
            });

            // Valid - Process the SignUp (Day2)
            tenantService.CreateDay2(new CreateTenantModel()
            {
                Tenant = new CreateTenantModel.TenantModel()
                {
                    ThemeId = day1ViewModel.ThemeId,
                    ProvisioningOptionId = provisioningOptions.First(o => o.Code.Equals("S2")).Id ?? -1,
                    DataCenter = !string.IsNullOrEmpty(day1ViewModel.Day2DataCenter) ? day1ViewModel.Day2DataCenter : null,
                    SiteName = day1ViewModel.SiteName.ToLower() + "pr",
                    OrganizationId = organizationId,
                    SubscriptionId = day1ViewModel.SubscriptionId
                }
            });

            return RedirectToAction("Index", "TenantView", new
            {
                tenantId
            });
        }
        public ActionResult StartDeprovisioning(string username)
        {
            var tenantService = new TenantService();
            var tenants = tenantService.FetchByUsername(username);

            TempData["PipelineRunning"] = true;
            TempData["Username"] = username;

            DeprovisionTenantSite(tenants);

            return RedirectToAction("Index", "AdminView");
        }
        public ActionResult Index()
        {
            // Fetch required data
            var accountService = new UserAccountService();
            var user = accountService.FetchByUsername(HttpContext.User.Identity.SplitName());

            var tenantService = new TenantService();
            var tenants = tenantService.FetchTenants();

            // Build the tenants viewmodel
            var viewModel = tenants != null
                ? new MyAccountViewModel()
                {
                    UserAccounts = tenants.GroupBy(u => u.Username).Select(u => new UserAccountViewModel()
                    {
                        Username = u.Key,
                        Tenants = u.Select(t => new TenantViewModel()
                        {
                            Id = t.TenantId,
                            Plan = t.ProvisioningOption,
                            Theme = t.Theme,
                            Status = t.AzureServicesProvisioned ? ProvisioningStatus.Deployed : ProvisioningStatus.NotDeployed,
                            AzureServicesProvisioned = t.AzureServicesProvisioned,
                        }).ToList()
                    }).ToList()
                }
                : new MyAccountViewModel();

            // Get working values
            var pipelineRunning = TempData["PipelineRunning"] != null && (bool)TempData["PipelineRunning"];
            var username = TempData["Username"] != null ? (string)TempData["Username"] : string.Empty;

            // Add each tenants services
            foreach (var userAccount in viewModel.UserAccounts)
            { 
                foreach (var company in userAccount.Tenants)
                {
                    var provisioningService = ProvisioningService.CreateForAdmin(company.Id);

                    company.Services = provisioningService.GetStatusses().Select(s => new ServiceStatusViewModel()
                    {
                        StatusId = s.Id,
                        Name = s.Name,
                        Service = s.Service,
                        Status = company.AzureServicesProvisioned ? ProvisioningStatus.Deployed : ProvisioningStatus.NotDeployed
                    }).ToList();
                }

                // Set already provisioned tenant services to active
                userAccount.Tenants.Where(c => c.AzureServicesProvisioned)
                           .ForEach(c => c.Services.ForEach(s => s.Status = ProvisioningStatus.Deployed));

                // Update statusses
                foreach (var tenant in userAccount.Tenants)
                {
                    // Set the Status
                    if (!tenant.AzureServicesProvisioned)
                    {
                        tenant.Status = pipelineRunning && userAccount.Username.Equals(username) ? ProvisioningStatus.Removing : ProvisioningStatus.NotDeployed;
                    }
                    else
                    {
                        tenant.Status = pipelineRunning && userAccount.Username.Equals(username) ? ProvisioningStatus.Removing : ProvisioningStatus.Deployed;
                    }
                }
            }

            // Build up the ViewBag
            ViewBag.PipelineRunning = pipelineRunning;
            ViewBag.Username = username;

            return View(viewModel);
        }
        private static ProvisioningService Create(int tenantId, bool isAdminInterface)
        {
            // Fetch the Tenant
            var tenantService = new TenantService();
            var scheduledTenant = tenantService.FetchByTenantId(tenantId);

            // Get Day1 Tenant Site Url
            var tenants = tenantService.FetchByUsername(scheduledTenant.Username);
            var dayOneTenant = tenants.First(t => t.ProvisioningOptionCode.Equals("S1"));

            // Get DataCenters
            var day = scheduledTenant.ProvisioningOptionCode.Equals("S1") ? 1 : 2;
            var util = new ManagementUtilities();
            var dataCenters = util.GetLocations(day, Settings.AccountSubscriptionId);

            // Build Parameters
            var provisioningParameters = GetParameters(day, dataCenters, scheduledTenant, dayOneTenant, isAdminInterface);

            // Create Provisioning Service
            return new ProvisioningService((int)scheduledTenant.ProvisioningOptionId, provisioningParameters);
        }
        private void CreateOrUpdate()
        {
            var locations = GetLocationList();

            // Loop all locations to find viable Sql Server V12 location
            foreach (var location in locations)
            {
                var asyncTaskList = new List<Task<bool>>();
                var awaitTaskList = new List<Task<bool>>();

                // Set first location
                ProvisioningParameters.Properties.LocationPrimary = location;

                // Loop through all the Parallel Provisiong Groups
                for (var group = 1; group <= _provisioningTasks.Max(p => p.GroupNo); group++)
                {
                    awaitTaskList = new List<Task<bool>>();

                    // Start tasks assigned to group
                    foreach (var provisioner in _provisioningTasks.Where(p => p.GroupNo == group))
                    {
                        var task = new Task<bool>(provisioner.RunCreateOrUpdate);
                        task.Start();

                        if (provisioner.WaitForCompletion)
                        {
                            awaitTaskList.Add(task);
                        }
                        else
                        {
                            asyncTaskList.Add(task);
                        }
                    }

                    // Wait for non-waiting tasks before continueing to group 5 (deploys the website)
                    // Certain settings are required from the previous groups
                    if (group == 4)
                    {
                        Task.WaitAll(asyncTaskList.ToArray());

                        // Check if errors occurred
                        if (asyncTaskList.Any(t => t.Result == false))
                        {
                            TasksCompleted = true;
                            ErrorsOccurred = true;

                            break;
                        }
                    }

                    // Await tasks marked for waiting
                    Task.WaitAll(awaitTaskList.ToArray());

                    // Check if Rollback is needed
                    if (_provisioningTasks.Any(t => t.RollbackRequired))
                    {
                        _provisioningTasks.ForEach(p => p.Status = "Queued");

                        var resourceGroup = _provisioningTasks.First(p => p.Service.Equals("Resource Group"));
                        ErrorsOccurred = !resourceGroup.RunRemove("Select Next V12 Location");

                        break;
                    }

                    // Check if errors occurred
                    if (awaitTaskList.Any(t => t.Result == false))
                    {
                        TasksCompleted = true;
                        ErrorsOccurred = true;

                        break;
                    }
                }
            }

            // Set completion status and automatically selected location
            AutomaticLocation = ProvisioningParameters.Properties.LocationPrimary;
            TasksCompleted = true;

            // Mark scheduleTenant as provisioned
            if (_provisioningTasks.All(p => p.Status == "Deployed"))
            {
                ProvisioningCompleted = true;

                var tenantService = new TenantService();
                tenantService.SetProvisioningStatus(ProvisioningParameters.Tenant.TenantId, ProvisioningCompleted);
            }
        }