Expand source code
#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Copyright (c) 2022 Universidade da Coruña
# Authors:
# - Jonatan Enes [main](jonatan.enes@udc.es)
# - Roberto R. Expósito
# - Juan Touriño
#
# This file is part of the ServerlessContainers framework, from
# now on referred to as ServerlessContainers.
#
# ServerlessContainers is free software: you can redistribute it
# and/or modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation, either version 3
# of the License, or (at your option) any later version.
#
# ServerlessContainers is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with ServerlessContainers. If not, see <http://www.gnu.org/licenses/>.
cpu_exceeded_upper = dict(
_id='cpu_exceeded_upper',
type='rule',
resource="cpu",
name='cpu_exceeded_upper',
rule=dict(
{"and": [
{">": [
{"var": "cpu.structure.cpu.usage"},
{"var": "cpu.limits.cpu.upper"}]},
{"<": [
{"var": "cpu.limits.cpu.upper"},
{"var": "cpu.structure.cpu.max"}]},
{"<": [
{"var": "cpu.structure.cpu.current"},
{"var": "cpu.structure.cpu.max"}]}
]
}),
generates="events", action={"events": {"scale": {"up": 1}}},
active=True
)
cpu_dropped_lower = dict(
_id='cpu_dropped_lower',
type='rule',
resource="cpu",
name='cpu_dropped_lower',
rule=dict(
{"and": [
{">": [
{"var": "cpu.structure.cpu.usage"},
0]},
{"<": [
{"var": "cpu.structure.cpu.usage"},
{"var": "cpu.limits.cpu.lower"}]},
{">": [
{"var": "cpu.limits.cpu.lower"},
{"var": "cpu.structure.cpu.min"}]}]}),
generates="events",
action={"events": {"scale": {"down": 1}}},
active=True
)
# Avoid hysteresis by only rescaling when X underuse events and no bottlenecks are detected, or viceversa
CpuRescaleUp = dict(
_id='CpuRescaleUp',
type='rule',
resource="cpu",
name='CpuRescaleUp',
rule=dict(
{"and": [
{">=": [
{"var": "events.scale.up"},
2]},
{"<=": [
{"var": "events.scale.down"},
2]}
]}),
events_to_remove=2,
generates="requests",
action={"requests": ["CpuRescaleUp"]},
amount=75,
rescale_by="amount",
active=True
)
CpuRescaleDown = dict(
_id='CpuRescaleDown',
type='rule',
resource="cpu",
name='CpuRescaleDown',
rule=dict(
{"and": [
{">=": [
{"var": "events.scale.down"},
8]},
{"==": [
{"var": "events.scale.up"},
0]}
]}),
events_to_remove=8,
generates="requests",
action={"requests": ["CpuRescaleDown"]},
amount=-20,
rescale_by="fit_to_usage",
active=True,
)
# MEM
mem_exceeded_upper = dict(
_id='mem_exceeded_upper',
type='rule',
resource="mem",
name='mem_exceeded_upper',
rule=dict(
{"and": [
{">": [
{"var": "mem.structure.mem.usage"},
{"var": "mem.limits.mem.upper"}]},
{"<": [
{"var": "mem.limits.mem.upper"},
{"var": "mem.structure.mem.max"}]},
{"<": [
{"var": "mem.structure.mem.current"},
{"var": "mem.structure.mem.max"}]}
]
}),
generates="events",
action={"events": {"scale": {"up": 1}}},
active=True
)
mem_dropped_lower = dict(
_id='mem_dropped_lower',
type='rule',
resource="mem",
name='mem_dropped_lower',
rule=dict(
{"and": [
{">": [
{"var": "mem.structure.mem.usage"},
0]},
{"<": [
{"var": "mem.structure.mem.usage"},
{"var": "mem.limits.mem.lower"}]},
{">": [
{"var": "mem.limits.mem.lower"},
{"var": "mem.structure.mem.min"}]}]}),
generates="events",
action={"events": {"scale": {"down": 1}}},
active=True
)
MemRescaleUp = dict(
_id='MemRescaleUp',
type='rule',
resource="mem",
name='MemRescaleUp',
rule=dict(
{"and": [
{">=": [
{"var": "events.scale.up"},
2]},
{"<=": [
{"var": "events.scale.down"},
2]}
]}),
generates="requests",
events_to_remove=2,
action={"requests": ["MemRescaleUp"]},
amount=3072,
rescale_by="amount",
active=True
)
MemRescaleDown = dict(
_id='MemRescaleDown',
type='rule',
resource="mem",
name='MemRescaleDown',
rule=dict(
{"and": [
{">=": [
{"var": "events.scale.down"},
8]},
{"==": [
{"var": "events.scale.up"},
0]}
]}),
generates="requests",
events_to_remove=8,
action={"requests": ["MemRescaleDown"]},
amount=-512,
percentage_reduction=50,
rescale_by="fit_to_usage",
active=True
)
# ENERGY
energy_exceeded_upper = dict(
_id='energy_exceeded_upper',
type='rule',
resource="energy",
name='energy_exceeded_upper',
rule=dict(
{"and": [
{">": [
{"var": "energy.structure.energy.usage"},
{"var": "energy.structure.energy.max"}]}]}),
generates="events", action={"events": {"scale": {"up": 1}}},
active=False
)
EnergyRescaleDown = dict(
_id='EnergyRescaleDown',
type='rule',
resource="energy",
name='EnergyRescaleDown',
rule=dict(
{"and": [
{"<=": [
{"var": "events.scale.down"},
1]},
{">=": [
{"var": "events.scale.up"},
4]}
]}),
generates="requests",
events_to_remove=4,
action={"requests": ["CpuRescaleDown"]},
amount=-20,
rescale_by="proportional",
active=False
)
energy_dropped_lower = dict(
_id='energy_dropped_lower',
type='rule',
resource="energy",
name='energy_dropped_lower',
rule=dict(
{"and": [
{"<": [
{"var": "energy.structure.energy.usage"},
{"var": "energy.structure.energy.max"}]}]}),
generates="events", action={"events": {"scale": {"down": 1}}},
active=False
)
EnergyRescaleUp = dict(
_id='EnergyRescaleUp',
type='rule',
resource="energy",
name='EnergyRescaleUp',
rule=dict(
{"and": [
{">=": [
{"var": "events.scale.down"},
3]},
{"<=": [
{"var": "events.scale.up"},
1]}
]}),
generates="requests",
events_to_remove=3,
action={"requests": ["CpuRescaleUp"]},
amount=20,
rescale_by="proportional",
active=False
)