private void CreateDatabase(ProvisionedService provisionedService) { string databaseName = provisionedService.Name; string databasePassword = provisionedService.Password; string databaseUser = provisionedService.User; try { DateTime start = DateTime.Now; Logger.Debug(Strings.SqlNodeCreateDatabaseDebugMessage, provisionedService.SerializeToJson()); this.createDBScript = this.ExtractSqlScriptFromTemplate(databaseName); // split script on GO command IEnumerable<string> commandStrings = Regex.Split(this.createDBScript, "^\\s*GO\\s*$", RegexOptions.Multiline); using (TransactionScope ts = new TransactionScope()) { foreach (string commandString in commandStrings) { if (!string.IsNullOrEmpty(commandString.Trim()) && !commandString.Contains("[master]")) { using (SqlCommand cmd = new SqlCommand(commandString, this.connection)) { if (commandString.Contains("CREATE DATABASE")) { cmd.CommandTimeout = 0; } cmd.ExecuteNonQuery(); } } } } this.CreateDatabaseUser(databaseName, databaseUser, databasePassword); long storage = this.StorageForService(provisionedService); if (this.availableStorageBytes < storage) { throw new MSSqlErrorException(MSSqlErrorException.MSSqlDiskFull); } this.availableStorageBytes -= storage; Logger.Debug(Strings.SqlNodeDoneCreatingDBDebugMessage, provisionedService.SerializeToJson(), (start - DateTime.Now).TotalSeconds); } catch (Exception ex) { Logger.Warning(Strings.SqlNodeCouldNotCreateDBWarningMessage, ex.ToString()); throw; } }
/// <summary> /// Provisions an MS Sql Server database. /// </summary> /// <param name="planRequest">The payment plan for the service.</param> /// <param name="credentials">Existing credentials for the service.</param> /// <returns> /// Credentials for the provisioned service. /// </returns> protected override ServiceCredentials Provision(ProvisionedServicePlanType planRequest, ServiceCredentials credentials) { //// todo: chek for plan ProvisionedService provisioned_service = new ProvisionedService(); if (credentials == null) { throw new ArgumentNullException("credentials"); } try { string name = credentials.Name; string user = credentials.User; string password = credentials.Password; provisioned_service.Name = name; provisioned_service.User = user; provisioned_service.Password = password; provisioned_service.Plan = planRequest; this.CreateDatabase(provisioned_service); if (!ProvisionedService.Save()) { Logger.Error(Strings.SqlNodeCannotSaveProvisionedServicesErrorMessage, provisioned_service.SerializeToJson()); throw new MSSqlErrorException(MSSqlErrorException.MSSqlLocalDBError); } ServiceCredentials response = this.GenerateCredential(provisioned_service.Name, provisioned_service.User, provisioned_service.Password); this.provisionServed += 1; return response; } catch (Exception) { this.DeleteDatabase(provisioned_service); throw; } }
/// <summary> /// Provisions an directory. /// </summary> /// <param name="planRequest">The payment plan for the service.</param> /// <param name="credentials">Existing credentials for the service.</param> /// <param name="version">The service version.</param> /// <returns> /// Credentials for the provisioned service. /// </returns> protected override ServiceCredentials Provision(string planRequest, ServiceCredentials credentials, string version) { if (planRequest != this.plan) { throw new FileServiceErrorException(FileServiceErrorException.FileServiceInvalidPlan); } if (!this.supportedVersions.Contains(version)) { throw new FileServiceErrorException(ServiceException.UnsupportedVersion); } ProvisionedService provisioned_service = new ProvisionedService(); if (credentials == null) { credentials = this.GenerateCredentials(); } try { string name = credentials.Name; string user = credentials.User; string password = credentials.Password; int port = credentials.Port; provisioned_service.Name = name; provisioned_service.User = user; provisioned_service.Password = password; provisioned_service.Plan = planRequest; provisioned_service.Port = port; this.CreateInstanceStorage(provisioned_service); this.InstanceSystemSetup(provisioned_service); if (!ProvisionedService.Save()) { Logger.Error(Strings.SqlNodeCannotSaveProvisionedServicesErrorMessage, provisioned_service.SerializeToJson()); throw new FileServiceErrorException(FileServiceErrorException.FileServiceLocalDBError); } ServiceCredentials response = this.GenerateCredential(provisioned_service.Name, provisioned_service.User, provisioned_service.Password, provisioned_service.Port.Value); this.provisionServed += 1; return response; } catch (Exception) { this.InstanceCleanup(provisioned_service); throw; } }
private void CreateInstanceStorage(ProvisionedService provisionedService) { string name = provisionedService.Name; try { DateTime start = DateTime.Now; Logger.Debug(Strings.SqlNodeCreateDatabaseDebugMessage, provisionedService.SerializeToJson()); if (this.useVhd) { string vhdDirectory = Path.Combine(this.baseDir, name); string vhd = Path.Combine(this.baseDir, name + ".vhd"); VHDUtilities.CreateVHD(vhd, this.maxStorageSizeMB, this.vhdFixedSize); VHDUtilities.MountVHD(vhd, vhdDirectory); // TODO: stefi: revoke all permissions on parent direcotry if using VHD, // to deny read/write permissions when VHD is not mounted or got dismounted } string directory = this.GetInstanceDirectory(name); Directory.CreateDirectory(directory); Logger.Debug(Strings.SqlNodeDoneCreatingDBDebugMessage, provisionedService.SerializeToJson(), (start - DateTime.Now).TotalSeconds); } catch (Exception ex) { Logger.Error("Cloud not create instance storage {0}. Exception {1}.", provisionedService.SerializeToJson(), ex.ToString()); throw; } }
private void InstanceSystemSetup(ProvisionedService provisionedService) { string name = provisionedService.Name; string user = provisionedService.User; string password = provisionedService.Password; string directory = this.GetInstanceDirectory(name); int port = provisionedService.Port.Value; try { DateTime start = DateTime.Now; Logger.Debug(Strings.SqlNodeCreateDatabaseDebugMessage, provisionedService.SerializeToJson()); // The group and users have to be recreated if the box was recreated by bosh. // In that case only the file system resrouces remain. Every system // resource of configuration has to be provisioned again. // // Create the group and user if necessary if (!WindowsUsersAndGroups.ExistsGroup(name)) { Logger.Info("Creating window group: {0}, for instance {1}", name, name); CreateInstanceGroup(name); // Add group permissions to directory // TODO: stefi: consider cleaning up orphan users and groups Logger.Info("Adding group permissions for directory: {0}", directory); AddDirectoryPermissions(directory, name); if (!WindowsUsersAndGroups.ExistsUser(user)) { Logger.Info("Creating user: {0}, for instance {1}", user, name); CreateInstanceUser(name, user, password); AddInstanceUserToGroup(name, user); } } // create the vhd if necessary if (this.useVhd) { string vhdDirectory = Path.Combine(this.baseDir, name); string vhd = Path.Combine(this.baseDir, name + ".vhd"); if (!VHDUtilities.IsMountPointPresent(vhdDirectory)) { Logger.Info("Mounting VHD: {0}, at: {1}, for instance {2}", vhd, vhdDirectory, name); VHDUtilities.MountVHD(vhd, vhdDirectory); } } if (this.useFsrm) { Logger.Info("Setting up windows FSRM for instance: {0}, with quota size: {1} MB", name, this.maxStorageSizeMB); this.dirAccounting.SetDirectoryQuota(directory, this.maxStorageSizeMB * 1024 * 1024); } // create ftp service if necessary if (!FtpUtilities.Exists(name)) { Logger.Info("Creating ftp site for instance: {0}, at: {1}, with port: {2}", name, directory, port); FtpUtilities.CreateFtpSite(name, directory, port); } if (!FtpUtilities.HasGroupAccess(name, name)) { // Add group permissions to ftp share Logger.Info("Adding group permission for ftp site for instance: {0}", name); FtpUtilities.AddGroupAccess(name, name); } // create the windows share with necessary permission var ws = new WindowsShare(name); if (!ws.Exists()) { Logger.Info("Creating windows share for instance: {0}, at: {1}", name, directory); ws = WindowsShare.CreateShare(name, directory); } if (!ws.HasPermission(name)) { // Add group permissions to windows share Logger.Info("Adding group permission for windows share for instance: {0}", name); ws.AddSharePermission(name); } Logger.Debug("Done setting up instance {0}. Took {1}s.", provisionedService.SerializeToJson(), (start - DateTime.Now).TotalSeconds); } catch (Exception ex) { Logger.Error("Cloud not setup instance {0}. Exception {1}.", provisionedService.SerializeToJson(), ex.ToString()); } }