Example #1
0
        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));
        }
Example #2
0
        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));
        }
Example #3
0
        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);
        }