internal static void ScaleCPUUp(ILogger log, List <WorkloadMachineTuple> totalWorkload, IonosAPI ionos, string ionosDataCenter) { var dyingCPUMachines = totalWorkload.Where(m => m.Workload.CPUUtilization > MAX_ALLOWED_CPU_WORKLOAD && m.Machine.Properties.Cores + 1 <= MAX_WORKER_CPU).ToList(); log.LogInformation($"Found '{dyingCPUMachines.Count}' machines to scale cpu up"); dyingCPUMachines.AsParallel().ForAll(async m => { var machine = m.Machine; log.LogInformation($"Scale cpu of '{machine.PrimaryIP}' up"); var update = new IonosMachineUpdate { Cores = machine.Properties.Cores + 1 }; await ionos.UpdateMachines(machine.Id, ionosDataCenter, update).ConfigureAwait(false); }); }
internal static void ScaleMemoryUp(ILogger log, List <WorkloadMachineTuple> totalWorkload, IonosAPI ionos, string ionosDataCenter) { var dyingMemoryMachines = totalWorkload.Where(m => m.Workload.MemoryUtilization > MAX_ALLOWED_MEMORY_WORKLOAD && m.Machine.Properties.Ram + 1024 <= MAX_WORKER_MEMORY).ToList(); log.LogInformation($"Found '{dyingMemoryMachines.Count}' machines to scale memory up"); dyingMemoryMachines.AsParallel().ForAll(async m => { var machine = m.Machine; log.LogInformation($"Scale memory of '{machine.PrimaryIP}' up"); var update = new IonosMachineUpdate { Ram = machine.Properties.Ram + 1024 }; await ionos.UpdateMachines(machine.Id, ionosDataCenter, update).ConfigureAwait(false); }); }
internal static void ScaleCPUDown(ILogger log, List <WorkloadMachineTuple> totalWorkload, IonosAPI ionos, string ionosDataCenter) { var scaleCpuDown = totalWorkload.OrderByDescending(m => m.Workload.CPUUtilization).Where(m => m.Workload.CPUUtilization <MIN_ALLOWED_CPU_WORKLOAD && m.Machine.Properties.Cores> DEFAULT_WORKER_CPU).ToList(); log.LogInformation($"Found '{scaleCpuDown.Count}' machines to scale down"); scaleCpuDown.AsParallel().ForAll(async m => { var machine = m.Machine; log.LogInformation($"Scale machine '{machine.PrimaryIP}' down"); var update = new IonosMachineUpdate { Cores = machine.Properties.Cores - 1 }; await ionos.UpdateMachines(machine.Id, ionosDataCenter, update).ConfigureAwait(false); }); }
internal static void ScaleCPUDown(ILogger log, List <WorkloadMachineTuple> totalWorkload, BBBAPI bbb, IonosAPI ionos) { var scaleCpuDown = totalWorkload.OrderByDescending(m => m.Workload.CPUUtilization) .Select(async m => new MachineWorkloadStatsTuple(m.DataCenter, m.Machine, m.Workload, await bbb.GetMeetingsAsync(m.Machine.PrimaryIP).ConfigureAwait(false))) .Select(res => res.Result) .Where(m => m.Workload.CPUUtilization <MIN_ALLOWED_CPU_WORKLOAD && m.Machine.Properties.Cores> DEFAULT_WORKER_CPU && m.Stats.Sum(u => u.ParticipantCount) == 0).ToList(); log.LogInformation($"Found '{scaleCpuDown.Count}' machines to scale CPU down"); scaleCpuDown.AsParallel().ForAll(async m => { var machine = m.Machine; log.LogInformation($"Scale machine '{machine.PrimaryIP}' down"); var update = new IonosMachineUpdate { Cores = machine.Properties.Cores - 1 }; await ionos.UpdateMachines(machine.Id, m.DataCenter, update).ConfigureAwait(false); }); }
public async Task UpdateMachines(string machineId, string dataCenterId, IonosMachineUpdate update) { if (string.IsNullOrEmpty(machineId)) { throw new ArgumentException("message", nameof(machineId)); } if (string.IsNullOrEmpty(dataCenterId)) { throw new ArgumentException(MESSAGE, nameof(dataCenterId)); } if (update is null) { throw new ArgumentNullException(nameof(update)); } HttpClient client = SetupHttpClient(); Uri uri = new Uri(string.Format(CultureInfo.InvariantCulture, MACHINE_GET_URL, dataCenterId, machineId)); JsonSerializerSettings serializerSettings = new JsonSerializerSettings(); serializerSettings.ContractResolver = new DefaultContractResolver { NamingStrategy = new CamelCaseNamingStrategy() }; serializerSettings.NullValueHandling = NullValueHandling.Ignore; string json = JsonConvert.SerializeObject(update, serializerSettings); using var content = new StringContent(json); content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"); var result = await client.PatchAsync(uri, content).ConfigureAwait(false); if (!result.IsSuccessStatusCode) { await RetryPatchAsync(client, uri, content).ConfigureAwait(false); } }