public async Task <VmExtendedDto> GetExtendedInfo(string resourceGroupName, string resourceName, CancellationToken cancellationToken = default)
        {
            var vm = await GetInternalAsync(resourceGroupName, resourceName);

            var result = new VmExtendedDto
            {
                PowerState = AzureVmUtil.GetPowerState(vm),
                OsType     = AzureVmUtil.GetOsType(vm)
            };

            if (vm == null)
            {
                return(result);
            }

            result.SizeName = vm.Size.ToString();

            await DecorateWithNetworkProperties(vm, result, cancellationToken);

            result.Disks.Add(await CreateDiskDto(vm.OSDiskId, true, cancellationToken));

            foreach (var curDiskKvp in vm.DataDisks.Values)
            {
                result.Disks.Add(CreateDiskDto(curDiskKvp, false));
            }

            return(result);
        }
        async Task <string> CreateVmSettingsString(string region, int vmId, int studyId, int sandboxId, VirtualMachineCreateDto userInput)
        {
            var vmSettings = _mapper.Map <VmSettingsDto>(userInput);

            var availableOs = await _virtualMachineOperatingSystemService.AvailableOperatingSystems(region);

            vmSettings.OperatingSystemCategory = AzureVmUtil.GetOsCategory(availableOs, vmSettings.OperatingSystem);

            vmSettings.Password = await StoreNewVmPasswordAsKeyVaultSecretAndReturnReference(studyId, sandboxId, vmSettings.Password);

            var diagStorageResource = await CloudResourceQueries.GetDiagStorageAccountEntry(_db, sandboxId);

            vmSettings.DiagnosticStorageAccountName = diagStorageResource.ResourceName;

            var networkResource = await CloudResourceQueries.GetNetworkEntry(_db, sandboxId);

            vmSettings.NetworkName = networkResource.ResourceName;

            var networkSetting = CloudResourceConfigStringSerializer.NetworkSettings(networkResource.ConfigString);

            vmSettings.SubnetName = networkSetting.SandboxSubnetName;

            vmSettings.Rules = VmRuleUtils.CreateInitialVmRules(vmId);
            return(CloudResourceConfigStringSerializer.Serialize(vmSettings));
        }
Exemple #3
0
        public void Vm_getDiskSize_shouldReturnGBDiskSize()
        {
            var result = AzureVmUtil.GetDiskSizeDisplayTextForDropdown(5);

            var expectedResult = "5 GB";

            Assert.Equal(expectedResult, result);
        }
Exemple #4
0
        public void Vm_getOsCategory_shouldThrowWithcorrectMessage()
        {
            List <VmOsDto> osList = new List <VmOsDto>();

            osList.Add(new VmOsDto()
            {
                Key = "windows1", Category = "test1", DisplayValue = "disp1"
            });

            var ex = Assert.Throws <Exception>(() => AzureVmUtil.GetOsCategory(osList, "asdasas"));

            Assert.Equal("Unable to find Operating System record in list of available", ex.Message);
        }
Exemple #5
0
 void ThrowIfRuleExists(List <VmRuleDto> rules, VmRuleDto ruleToCompare)
 {
     if (rules != null)
     {
         foreach (var curExistingRule in rules)
         {
             if (AzureVmUtil.IsSameRule(ruleToCompare, curExistingRule))
             {
                 throw new Exception($"Same rule allready exists");
             }
         }
     }
 }
Exemple #6
0
        public void VmRule_IsSameRule_witthDifferentRules_shouldBeFalse()
        {
            var rule1 = new VmRuleDto()
            {
                Direction = 0, Protocol = "tcp", Ip = "192.168.1.1", Port = 443
            };
            var rule2 = new VmRuleDto()
            {
                Direction = 0, Protocol = "tcp", Ip = "192.168.1.1", Port = 80
            };
            var result = AzureVmUtil.IsSameRule(rule1, rule2);

            Assert.False(result);
        }
Exemple #7
0
        public void VmRule_IsSameRule_withSameRule_shouldBeTrue()
        {
            var rule1 = new VmRuleDto()
            {
                Direction = 0, Protocol = "tcp", Ip = "192.168.1.1", Port = 443
            };
            var rule2 = new VmRuleDto()
            {
                Direction = 0, Protocol = "tcp", Ip = "192.168.1.1", Port = 443
            };
            var result = AzureVmUtil.IsSameRule(rule1, rule2);

            Assert.True(result);
        }
Exemple #8
0
        public void Vm_getOsCategory_shouldReturnExpectedResult()
        {
            List <VmOsDto> osList = new List <VmOsDto>();

            osList.Add(new VmOsDto()
            {
                Key = "windows1", Category = "test1", DisplayValue = "disp1"
            });

            var result = AzureVmUtil.GetOsCategory(osList, "windows1");

            var expectedResult = "test1";

            Assert.Equal(expectedResult, result);
        }
Exemple #9
0
        public async Task Import(CancellationToken cancellationToken = default)
        {
            var currentUser = await _userService.GetCurrentUserAsync();

            var regionsFromDb = await _db.Regions.Include(r => r.DiskSizeAssociations).ThenInclude(va => va.DiskSize).Where(r => !r.Disabled).ToListAsync();

            if (regionsFromDb.Count() == 0)
            {
                throw new Exception($"Could not update Vm Disk Cache, No regions found in DB");
            }

            var diskEntriesFromAzure = await _azureDiskPriceService.GetDiskPrices(cancellationToken : cancellationToken);

            if (diskEntriesFromAzure == null || (diskEntriesFromAzure != null && diskEntriesFromAzure.Count() == 0))
            {
                throw new Exception("No VM Disk Size and Price found in Azure");
            }

            foreach (var curRegionFromDb in regionsFromDb)
            {
                _logger.LogInformation($"Updating VM Disk Cache for Region: {curRegionFromDb.Key}");

                try
                {
                    if (diskEntriesFromAzure.TryGetValue(curRegionFromDb.KeyInPriceApi, out AzureDiskPriceForRegion diskSizesForRegion))
                    {
                        _logger.LogInformation($"Updating VM Size Cache for Region: {curRegionFromDb.Key}. Found {diskSizesForRegion.Types.Count} Disk sizes for region");

                        var existingDbItemsForRegion = curRegionFromDb.DiskSizeAssociations.ToDictionary(r => r.DiskSize.Key, r => r.DiskSize);

                        var validDiskSizesFromAzure = new HashSet <string>();

                        DiskSize curDiskSizeInDb;

                        foreach (var curDiskSizeForRegion in diskSizesForRegion.Types)
                        {
                            if (existingDbItemsForRegion.TryGetValue(curDiskSizeForRegion.Key, out curDiskSizeInDb))
                            {
                                //Get updated price for VM Size
                                var regionAssociation = curDiskSizeInDb.RegionAssociations.Where(ra => ra.RegionKey == curRegionFromDb.Key).SingleOrDefault();
                                regionAssociation.Price = curDiskSizeForRegion.Value.price;

                                await _db.SaveChangesAsync();

                                validDiskSizesFromAzure.Add(curDiskSizeInDb.Key);
                            }
                            else
                            {
                                //Size item might exist in db for other region
                                curDiskSizeInDb = await _db.DiskSizes.FirstOrDefaultAsync(r => r.Key == curDiskSizeForRegion.Key);

                                if (curDiskSizeInDb == null)
                                {
                                    curDiskSizeInDb = new DiskSize()
                                    {
                                        Key         = curDiskSizeForRegion.Key,
                                        Size        = curDiskSizeForRegion.Value.size,
                                        DisplayText = AzureVmUtil.GetDiskSizeDisplayTextForDropdown(curDiskSizeForRegion.Value.size),
                                        CreatedBy   = currentUser.UserName
                                    };
                                }
                                ;

                                //Add to lookup
                                existingDbItemsForRegion.Add(curDiskSizeForRegion.Key, curDiskSizeInDb);

                                //Add to DB
                                curRegionFromDb.DiskSizeAssociations.Add(new RegionDiskSize()
                                {
                                    Region = curRegionFromDb, DiskSize = curDiskSizeInDb, Price = curDiskSizeForRegion.Value.price
                                });

                                await _db.SaveChangesAsync();

                                validDiskSizesFromAzure.Add(curDiskSizeForRegion.Key);
                            }
                        }

                        //Delete those that are no longer present in Azure, or that does not pass the filter
                        foreach (var curDbDiskSize in existingDbItemsForRegion.Values)
                        {
                            if (!validDiskSizesFromAzure.Contains(curDbDiskSize.Key))
                            {
                                var toRemoveFromDb = curRegionFromDb.DiskSizeAssociations.FirstOrDefault(ra => ra.VmDiskKey == curDbDiskSize.Key);

                                if (toRemoveFromDb != null)
                                {
                                    curRegionFromDb.DiskSizeAssociations.Remove(toRemoveFromDb);
                                }
                            }
                        }

                        await _db.SaveChangesAsync();

                        _logger.LogInformation($"Done updating VM Disk Size and Price Cache for Region: {curRegionFromDb.Name}");
                    }
                    else
                    {
                        _logger.LogError($"Update VM Size cache: Unable to update Size cache for Region {curRegionFromDb.Key}. No items for region in response");
                    }
                }
                catch (Exception ex)
                {
                    _logger.LogError($"Update VM Size cache: Unable to update Size cache for Region {curRegionFromDb.Key}. Se inner exception for details", ex);
                    continue;
                }
            }

            _logger.LogInformation($"Deleting Disk size entries not associated with any region");

            foreach (var curDiskSize in await _db.DiskSizes.Include(s => s.RegionAssociations).ToListAsync())
            {
                if (curDiskSize.RegionAssociations == null || (curDiskSize.RegionAssociations != null && curDiskSize.RegionAssociations.Count == 0))
                {
                    _db.DiskSizes.Remove(curDiskSize);
                }
            }

            await _db.SaveChangesAsync();

            _logger.LogInformation($"Done updating VM Disk size cache");
        }
Exemple #10
0
        public void Vm_getSizeCategory_ShouldReturn_string(string vmName, string expectedResult)
        {
            var result = AzureVmUtil.GetSizeCategory(vmName);

            Assert.Equal(expectedResult, result);
        }
Exemple #11
0
        public void Vm_getPowerState_WithNull_shouldReturnString()
        {
            var result = AzureVmUtil.GetPowerState(null);

            Assert.Equal("not found", result);
        }
Exemple #12
0
        public void Vm_getOsCategory_WithNullasOsList_shouldThrowWithcorrectMessage()
        {
            var ex = Assert.Throws <ArgumentException>(() => AzureVmUtil.GetOsCategory(null, "aaa"));

            Assert.Equal("List of OS is null", ex.Message);
        }
        public async Task UpdateVmSizeCache(CancellationToken cancellationToken = default)
        {
            var currentUser = await _userService.GetCurrentUserAsync();

            var regionsFromDb = await _db.Regions.Include(r => r.VmSizeAssociations).ThenInclude(va => va.VmSize).Where(r => !r.Disabled).ToListAsync();

            if (regionsFromDb == null || (regionsFromDb != null & regionsFromDb.Count() == 0))
            {
                throw new Exception($"Could not update Vm Size Cache, No regions found in DB");
            }

            foreach (var curRegionFromDb in regionsFromDb)
            {
                _logger.LogInformation($"Updating VM Size Cache for Region: {curRegionFromDb.Key}");

                try
                {
                    var resourceSkusFromAzure = await _azureResourceSkuService.GetSKUsForRegion(curRegionFromDb.Key, "virtualMachines", filterBasedOnResponseRestrictions : true, cancellationToken);

                    if (resourceSkusFromAzure == null || (resourceSkusFromAzure != null && resourceSkusFromAzure.Count() == 0))
                    {
                        throw new Exception($"No VM SKUs found in Azure for region {curRegionFromDb.Key}");
                    }

                    _logger.LogInformation($"Updating VM Size Cache for Region: {curRegionFromDb.Key}. Found {resourceSkusFromAzure.Count()} SKUs for region");

                    var existingSizeItemsForRegion = curRegionFromDb.VmSizeAssociations.ToDictionary(r => r.VmSize.Key, r => r.VmSize);

                    var validSkusFromAzure = new HashSet <string>();

                    VmSize curVmSizeInDb;

                    foreach (var curAzureSku in resourceSkusFromAzure)
                    {
                        if (existingSizeItemsForRegion.TryGetValue(curAzureSku.Name, out curVmSizeInDb))
                        {
                            curVmSizeInDb.Category = AzureVmUtil.GetSizeCategory(curAzureSku.Name);

                            if (ShouldBeExcluded(curVmSizeInDb))
                            {
                                var toRemoveFromDb = curRegionFromDb.VmSizeAssociations.FirstOrDefault(ra => ra.VmSizeKey == curVmSizeInDb.Key);
                                curRegionFromDb.VmSizeAssociations.Remove(toRemoveFromDb);
                                await _db.SaveChangesAsync();

                                continue;
                            }
                            else
                            {
                                PopulateVmSizeProps(curAzureSku, curVmSizeInDb);
                                curVmSizeInDb.DisplayText = VmSizeUtil.GetDisplayTextSizeForDropdown(curVmSizeInDb);

                                //Get updated price for VM Size and set on db entry
                                var regionAssociation = curVmSizeInDb.RegionAssociations.Where(ra => ra.RegionKey == curRegionFromDb.Key).SingleOrDefault();
                                regionAssociation.Price = await _azureCostManagementService.GetVmPrice(curRegionFromDb.Key, curVmSizeInDb.Key);

                                await _db.SaveChangesAsync();

                                validSkusFromAzure.Add(curVmSizeInDb.Key);
                            }
                        }
                        else
                        {
                            //Size item might exist in db for other region
                            curVmSizeInDb = await _db.VmSizes.FirstOrDefaultAsync(r => r.Key == curAzureSku.Name);

                            if (curVmSizeInDb == null)
                            {
                                curVmSizeInDb = new VmSize()
                                {
                                    Key = curAzureSku.Name, CreatedBy = currentUser.UserName, Category = AzureVmUtil.GetSizeCategory(curAzureSku.Name)
                                };
                            }
                            else
                            {
                                curVmSizeInDb.Category = AzureVmUtil.GetSizeCategory(curAzureSku.Name);
                            }

                            if (ShouldBeExcluded(curVmSizeInDb))
                            {
                                //Dont want to include these
                                continue;
                            }

                            PopulateVmSizeProps(curAzureSku, curVmSizeInDb);
                            curVmSizeInDb.DisplayText = VmSizeUtil.GetDisplayTextSizeForDropdown(curVmSizeInDb);

                            //Add to lookup
                            existingSizeItemsForRegion.Add(curAzureSku.Name, curVmSizeInDb);
                            var priceOfVm = await _azureCostManagementService.GetVmPrice(curRegionFromDb.Key, curVmSizeInDb.Key);

                            //Add to DB
                            curRegionFromDb.VmSizeAssociations.Add(new RegionVmSize()
                            {
                                Region = curRegionFromDb, VmSize = curVmSizeInDb, Price = priceOfVm
                            });

                            await _db.SaveChangesAsync();

                            validSkusFromAzure.Add(curVmSizeInDb.Key);
                        }
                    }

                    //Delete those that are no longer present in Azure, or that does not pass the filter
                    foreach (var curDbSize in existingSizeItemsForRegion.Values)
                    {
                        if (!validSkusFromAzure.Contains(curDbSize.Key))
                        {
                            var toRemoveFromDb = curRegionFromDb.VmSizeAssociations.FirstOrDefault(ra => ra.VmSizeKey == curDbSize.Key);

                            if (toRemoveFromDb != null)
                            {
                                curRegionFromDb.VmSizeAssociations.Remove(toRemoveFromDb);
                            }
                        }
                    }

                    await _db.SaveChangesAsync();

                    _logger.LogInformation($"Done updating VM Size Cache for Region: {curRegionFromDb.Name}");
                }
                catch (Exception ex)
                {
                    _logger.LogError($"Update VM Size cache: Unable to update Size cache for Region {curRegionFromDb.Key}. Se inner exception for details", ex);
                    continue;
                }
            }

            _logger.LogInformation($"Deleting Vm Size entries not associated with any region");
            foreach (var curVmSize in await _db.VmSizes.Include(s => s.RegionAssociations).ToListAsync())
            {
                if (curVmSize.RegionAssociations == null || (curVmSize.RegionAssociations != null && curVmSize.RegionAssociations.Count == 0))
                {
                    _db.VmSizes.Remove(curVmSize);
                }
            }

            await _db.SaveChangesAsync();

            //TODO: Delete size records with no associated region?
            _logger.LogInformation($"Done updating VM Size Cache");
        }