public IActionResult DestroyServer(string serverId) { DatabaseServer targetServer = DocumentSession.GetDatabaseServerById(serverId); if (targetServer == null) { return(NotFound(new { Id = serverId, EntityType = "DatabaseServer", Message = $"No database server found with Id '{serverId}'." })); } if (DocumentSession.DoesServerHaveDatabases(targetServer.Id)) { return(StatusCode(StatusCodes.Status400BadRequest, new { Id = targetServer.Id, TenantId = serverId, EntityType = "DatabaseServer", RequestedAction = ProvisioningAction.Deprovision, Action = targetServer.Action, Status = targetServer.Status, Message = $"Cannot de-provision database server {targetServer.Id} because it still hosts one or more databases. First de-provision these databases and then retry the operation." })); } if (targetServer.Action != ProvisioningAction.None) { return(StatusCode(StatusCodes.Status409Conflict, new { Id = targetServer.Id, TenantId = serverId, EntityType = "DatabaseServer", RequestedAction = ProvisioningAction.Deprovision, Action = targetServer.Action, Status = targetServer.Status, Message = $"Cannot de-provision database server {targetServer.Id} because an action ({targetServer.Action}) is already in progress for this server." })); } targetServer.Action = ProvisioningAction.Deprovision; targetServer.Status = ProvisioningStatus.Pending; targetServer.AddProvisioningEvent($"De-provisioning requested for '${targetServer.Id}'."); DocumentSession.SaveChanges(); return(StatusCode(StatusCodes.Status202Accepted, new { Id = serverId, Message = $"Database server {targetServer.Id} queued for deletion.", EntityType = "DatabaseServer" })); }
public IActionResult ReconfigureServer(string serverId) { DatabaseServer targetServer = DocumentSession.GetDatabaseServerById(serverId); if (targetServer == null) { return(NotFound(new { Id = serverId, EntityType = "DatabaseServer", Message = $"No database server found with Id '{serverId}'." })); } if (targetServer.Action != ProvisioningAction.None) { return(StatusCode(StatusCodes.Status409Conflict, new { Id = targetServer.Id, TenantId = serverId, EntityType = "DatabaseServer", RequestedAction = ProvisioningAction.Reconfigure, Action = targetServer.Action, Status = targetServer.Status, Message = $"Cannot reconfigure database server {targetServer.Id} because another server-level action is already in progress." })); } targetServer.Action = ProvisioningAction.Reconfigure; targetServer.Status = ProvisioningStatus.Pending; targetServer.AddProvisioningEvent($"Reconfiguration requested for '${targetServer.Id}'."); DocumentSession.SaveChanges(); return(StatusCode(StatusCodes.Status202Accepted, new { Id = serverId, Message = $"Database server {targetServer.Id} queued for reconfiguration.", EntityType = "DatabaseServer" })); }
public IActionResult ReconfigureDatabase(string databaseId) { DatabaseInstance targetDatabase = DocumentSession.GetDatabaseById(databaseId); if (targetDatabase == null) { return(NotFound(new { Id = databaseId, EntityType = "Database", Message = $"No database found with Id '{databaseId}'." })); } Tenant ownerTenant = DocumentSession.GetTenantById(targetDatabase.TenantId); if (ownerTenant == null) { return(NotFound(new { Id = targetDatabase.TenantId, EntityType = "Tenant", Message = $"Database's owning tenant not found with Id '{targetDatabase.TenantId}'." })); } DatabaseServer targetServer = DocumentSession.GetDatabaseServerById(targetDatabase.ServerId); if (targetServer == null) { return(NotFound(new { Id = targetDatabase.ServerId, EntityType = "DatabaseServer", Message = $"Database server not found with Id '{targetDatabase.ServerId}'." })); } if (targetServer.Status != ProvisioningStatus.Ready) { return(StatusCode(StatusCodes.Status409Conflict, new { Id = targetServer.Id, TenantId = ownerTenant.Id, EntityType = "DatabaseServer", Action = targetServer.Action, Status = targetServer.Status, Message = $"Cannot re-configure database {targetDatabase.Name} in server {targetServer.Id} because a server-level action ({targetServer.Action}) is already in progress." })); } if (targetDatabase.Status != ProvisioningStatus.Ready) { return(StatusCode(StatusCodes.Status409Conflict, new { Id = targetServer.Id, ServerId = targetServer.Id, TenantId = ownerTenant.Id, EntityType = "Database", Action = targetDatabase.Action, Status = targetDatabase.Status, Message = $"Cannot re-configure database {targetDatabase.Name} in server {targetServer.Id} because a database-level action ({targetDatabase.Action}) is already in progress." })); } targetDatabase.Action = ProvisioningAction.Reconfigure; targetDatabase.Status = ProvisioningStatus.Pending; DocumentSession.SaveChanges(); return(StatusCode(StatusCodes.Status202Accepted, new { Id = targetDatabase.Id, Name = targetDatabase.Name, EntityType = "Database", Message = $"Database '{targetDatabase.Name}' queued for reconfiguration on server '{targetServer.Name}'." })); }
public IActionResult CreateDatabase([FromBody] NewDatabaseInstance newDatabase) { if (newDatabase == null) { return(BadRequest(new { EntityType = "Database", Message = $"Must supply database details in the request body." })); } if (!ModelState.IsValid) { return(BadRequest(ModelState)); } DatabaseServer targetServer = DocumentSession.GetDatabaseServerById(newDatabase.ServerId); if (targetServer == null) { return(NotFound(new { Id = newDatabase.ServerId, EntityType = "DatabaseServer", Message = $"No database server found for tenant with Id {newDatabase.ServerId}" })); } if (targetServer.Kind != DatabaseServerKind.SqlServer) { return(BadRequest(new { ServerId = targetServer.Id, ServerKind = targetServer.Kind, Reason = "NotImplemented", Message = $"Creation of databases in ${targetServer.Kind} servers is not supported yet." })); } if (targetServer.Status != ProvisioningStatus.Ready) { return(StatusCode(StatusCodes.Status409Conflict, new { Id = targetServer.Id, EntityType = "DatabaseServer", Action = targetServer.Action, Status = targetServer.Status, Message = $"Cannot create a database in server {targetServer.Id} because a server-level action is already in progress." })); } Tenant ownerTenant = DocumentSession.GetTenantById(targetServer.TenantId); if (ownerTenant == null) { return(NotFound(new { Id = targetServer.TenantId, EntityType = "Tenant", Message = $"Target server's owning tenant not found with Id {targetServer.TenantId}." })); } DatabaseInstance existingDatabase = DocumentSession.GetDatabaseInstanceByName(newDatabase.Name, targetServer.Id); if (existingDatabase != null) { return(StatusCode(StatusCodes.Status409Conflict, new { Id = existingDatabase.Id, Name = existingDatabase.Name, EntityType = "Database", Message = $"Database '{existingDatabase.Name}' already exists on server '{targetServer.Name}'." })); } var database = new DatabaseInstance { Name = newDatabase.Name, DatabaseUser = newDatabase.DatabaseUser, DatabasePassword = newDatabase.DatabasePassword, Storage = { SizeMB = newDatabase.SizeMB }, ServerId = targetServer.Id, TenantId = ownerTenant.Id, Action = ProvisioningAction.Provision, Status = ProvisioningStatus.Pending }; DocumentSession.Store(database); targetServer.DatabaseIds.Add(database.Id); var user = new DatabaseUser { Name = database.DatabaseUser, DatabaseId = database.Id, ServerId = database.ServerId, TenantId = database.TenantId, }; if (targetServer.Kind == DatabaseServerKind.SqlServer) { user.AddPassword(database.DatabasePassword); } // TODO: Request client certificate from Vault and store it as a user credential. DocumentSession.Store(user); DocumentSession.SaveChanges(); return(StatusCode(StatusCodes.Status202Accepted, new { Id = database.Id, Name = database.Name, Message = $"Database '{database.Name}' queued for creation on server '{targetServer.Name}'." })); }