Beispiel #1
0
        public async Task <List <Vm> > Get(int id)
        {
            _logger.LogInformation($"REQUEST : {Request.Path}");
            _logger.LogInformation($"ID : {id}");
            List <Vm>   vms = new List <Vm>();
            List <User> users;

            if ((List <Vm>)_cache.Get(0) != null && (List <User>)_cache.Get(1) != null && id == 0)
            {
                vms   = (List <Vm>)_cache.Get(0);
                users = ((List <User>)_cache.Get(1));
                _logger.LogInformation($"CACHE VMS : {vms.Count}");
                _logger.LogInformation($"CACHE USERS: {users.Count}");
                return(vms);
            }
            else
            {
                _logger.LogInformation($"CACHE NO : {vms.Count}");
                var dbVms = await _context.Vms.ToListAsync();

                var ous = await _context.OrganizationUnits.ToListAsync();

                var adapters = await _context.Adapters.Where(x => x.IsOK).Include(x => x.Provider).Include(a => a.Credentials).ToListAsync();

                users = _authService.GetUsersList();
                foreach (Adapter adapter in adapters)
                {
                    if (!adapter.IsOK)
                    {
                        break;
                    }
                    switch (adapter.Provider.Id)
                    {
                    case (int)ProviderType.Ovirt:
                        ServicesResponse servicesResponse = await VmService.GetVMs(adapter);

                        OvirtVM.Vms ovirtVms;
                        if (!servicesResponse.isSuccess)
                        {
                            break;
                        }
                        ovirtVms = (OvirtVM.Vms)servicesResponse.resultObject;

                        List <Vm> commonVMs = ovirtVms.Vm.ConvertAll(x => (Vm)x);
                        // хз зачем
                        commonVMs.ForEach(x => x.Adapter = adapter);
                        vms.AddRange(commonVMs);
                        adapter.Provider = null;
                        break;

                    case (int)ProviderType.VMware:
                        var response = await EasyAdmin.Services.VMware.VmService.GetVmListAsync(adapter);

                        if (response.isSuccess)
                        {
                            var vmwareVm = response.resultObject;
                            vmwareVm.ForEach(x => x.Adapter = adapter);
                            vms.AddRange(vmwareVm);
                        }
                        // хз зачем но добавлю как выше
                        adapter.Provider = null;
                        break;
                    }
                }

                var isAdmin = User.Claims.SingleOrDefault(x => x.Type == ClaimTypes.Role && x.Value == "Admin") != null;
                foreach (var vm in vms)
                {
                    var dbVm = dbVms.SingleOrDefault(x => x.Id == vm.Id);
                    if (dbVm == null)
                    {
                        //_context.Vms.Add(vm);
                    }
                    else  // if (dbVm.LastTimeUpdated.AddDays(1) < DateTime.Today)
                    {
                        vm.HddSize = dbVm.HddSize;
                    }
                    var haveAccess = new List <string>()
                    {
                        vm.AdminId, vm.OwnerId, vm.ManagerId
                    };
                    var claims = User.Claims.Select(x => x.Value).ToList();
                    if (isAdmin || claims.Intersect(haveAccess).Any())
                    {
                        vm.PoolShortName = ous.FirstOrDefault(p => vm.Name.Contains(p.PoolShortName))?.PoolShortName ?? ous.Single(d => d.Id == 1).PoolShortName;

                        vm.Admin   = users.SingleOrDefault(x => x.Sam == vm.AdminId);
                        vm.Owner   = users.SingleOrDefault(x => x.Sam == vm.OwnerId);
                        vm.Manager = users.SingleOrDefault(x => x.Sam == vm.ManagerId);
                    }
                    else
                    {
                        vms.Remove(vm);
                    }
                }
                _cache.Remove(0);
                _cache.Set(0, vms, new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromMinutes(5)));
                _cache.Set(1, users, new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromMinutes(5)));
                return(vms);
            }
            //await _context.SaveChangesAsync();
        }