Esempio n. 1
0
        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);
            });
        }
Esempio n. 2
0
        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);
            });
        }
Esempio n. 3
0
        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);
            });
        }
Esempio n. 4
0
        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);
            });
        }
Esempio n. 5
0
        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);
            }
        }