public async Task <IActionResult> Update([FromRoute] Guid id, [FromBody] VmUpdateForm form, CancellationToken ct) { if (!ModelState.IsValid) { throw new InvalidOperationException(); } var updatedVm = await _vmService.UpdateAsync(id, form, ct); return(Ok(updatedVm)); }
public async Task <ViewModels.Vm> UpdateAsync(Guid id, VmUpdateForm form, CancellationToken ct) { var vmEntity = await _context.Vms.Where(v => v.Id == id).SingleOrDefaultAsync(ct); if (vmEntity == null) { throw new EntityNotFoundException <ViewModels.Vm>(); } var teams = vmEntity.VmTeams.Select(v => v.TeamId).Distinct(); if (!(await _playerService.CanManageTeamsAsync(teams, false, ct))) { throw new ForbiddenException(); } vmEntity = _mapper.Map(form, vmEntity); _context.Vms.Update(vmEntity); await _context.SaveChangesAsync(ct); return(_mapper.Map <ViewModels.Vm>(vmEntity)); }
private async Task SyncWorkspace(Guid workspaceId, IServiceScope scope, CancellationToken ct) { var errorMessages = new List <string>(); var dbContext = scope.ServiceProvider.GetRequiredService <CasterContext>(); var client = scope.ServiceProvider.GetRequiredService <IS3VmApiClient>(); var playerOptions = scope.ServiceProvider.GetRequiredService <PlayerOptions>(); var workspace = await dbContext.Workspaces.SingleOrDefaultAsync(x => x.Id == workspaceId, ct); if (workspace == null) { return; } var state = workspace.GetState(); var previousState = workspace.GetStateBackup(); var resources = state.GetResources(); var previousResources = previousState.GetResources(); // Get all vms from vm api VmSummary[] virtualMachines = null; try { virtualMachines = (await client.GetAllAsync(ct)).ToArray(); } catch (ApiErrorException ex) { errorMessages.Add($"Error retrieving Virtual Machines: {ex.Body.Title}"); } catch (Exception ex) { errorMessages.Add($"Error retrieving Virtual Machines: {ex.Message}"); } if (virtualMachines != null) { foreach (var resource in resources.Where(r => r.IsVirtualMachine())) { var vm = virtualMachines.Where(v => v.Id.ToString() == resource.Id).FirstOrDefault(); var teamIds = resource.GetTeamIds(); var url = playerOptions.VmConsoleUrl.Replace("{id}", resource.Id); if (vm == null) { if (teamIds != null && teamIds.Any()) { // Create vm VmCreateForm form = new VmCreateForm { Name = resource.Name, TeamIds = teamIds.Cast <Guid?>().ToList(), Id = new Guid(resource.Id), Url = url }; errorMessages.Add(await CallWrapperAsync((async() => await client.CreateVmAsync(form, ct)), $"Error Adding {form.Name} ({form.Id})")); } } else if (teamIds != null) { if (!teamIds.Any()) { errorMessages.Add(await CallWrapperAsync((async() => await client.DeleteVmAsync(vm.Id.Value, ct)), $"Error Removing {vm.Name} ({vm.Id})")); } else { foreach (var teamId in teamIds) { // Check if team or properties have changed if (!vm.TeamIds.Contains(teamId)) { errorMessages.Add(await CallWrapperAsync((async() => await client.AddVmToTeamAsync(vm.Id.Value, teamId, ct)), $"Error Adding {vm.Name} ({vm.Id}) to Team {teamId}")); } } // remove old teams foreach (var oldTeamId in vm.TeamIds.Where(t => !teamIds.Any(x => x == t))) { errorMessages.Add(await CallWrapperAsync((async() => await client.RemoveVmFromTeamAsync(vm.Id.Value, oldTeamId.Value, ct)), $"Error Removing {vm.Name} ({vm.Id}) from Team {oldTeamId}")); } if (vm.Name != resource.Name || vm.Url != url) { // TODO: Use PATCH when implemented in Vm Api VmUpdateForm form = new VmUpdateForm { Name = resource.Name, Url = url, }; errorMessages.Add(await CallWrapperAsync((async() => await client.UpdateVmAsync(vm.Id.Value, form, ct)), $"Error Updating {vm.Name} ({vm.Id}")); } } } } } workspace.LastSynced = DateTime.UtcNow; workspace.SyncErrors = errorMessages.Where(x => !string.IsNullOrEmpty(x)).ToArray(); await dbContext.SaveChangesAsync(ct); }