Skip to content

Commit d03778a

Browse files
committed
add time based policy
1 parent 19a5947 commit d03778a

File tree

5 files changed

+78
-1
lines changed

5 files changed

+78
-1
lines changed

docs/policy_configs.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,32 @@ policy:
4444
target: 5
4545
```
4646

47+
## Time Policy
48+
49+
Time based scaling, scaling during time ranges.
50+
51+
```yaml
52+
policy:
53+
- name: Scaling up at 7 a.m. by factor 2 (pre-heating for known load)
54+
source: time
55+
target: 2
56+
config:
57+
start_time: "06:58"
58+
end_time: "07:00"
59+
metric: 1
60+
```
61+
62+
```yaml
63+
policy:
64+
- name: Scaling down during night
65+
source: time
66+
target: 1
67+
config:
68+
start_time: "22:00"
69+
end_time: "05:00"
70+
metric: 10
71+
```
72+
4773
## Random Policy
4874

4975
For testing purpose, random metric to get some action.

sample/config.yaml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,22 @@ policies:
2929
start: 1
3030
stop: 10
3131

32+
- name: Scaling up at 7 a.m. by factor 3
33+
source: time
34+
target: 3
35+
config:
36+
start_time: "06:58"
37+
end_time: "07:00"
38+
metric: 1
39+
40+
- name: Scaling down during night by factor 0.1
41+
source: time
42+
target: 1
43+
config:
44+
start_time: "22:00"
45+
end_time: "06:59"
46+
metric: 10
47+
3248
cloud:
3349
### Cloudscale.ch
3450
kind: cloudscale_ch

scalr/policy/adapters/time.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
from datetime import datetime
2+
3+
from scalr.log import log
4+
from scalr.policy import PolicyAdapter
5+
6+
7+
def in_between(current, start, end):
8+
if start <= end:
9+
return start <= current < end
10+
else: # over midnight e.g., 23:30-04:15
11+
return start <= current or current < end
12+
13+
14+
class TimePolicyAdapter(PolicyAdapter):
15+
def get_current(self) -> float:
16+
target = self.config.get("target", 1)
17+
18+
now = datetime.now().time().strftime("%H:%M")
19+
log.info(f"Now, it is {now}")
20+
current = datetime.strptime(now, "%H:%M")
21+
22+
start_time = self.config.get("start_time", "")
23+
end_time = self.config.get("end_time", "")
24+
25+
start = datetime.strptime(start_time, "%H:%M")
26+
end = datetime.strptime(end_time, "%H:%M")
27+
28+
if in_between(current, start, end):
29+
log.info(f"Time is between {start_time} and {end_time}")
30+
return self.config.get("metric", target)
31+
32+
log.info(f"Time is not between {start_time} and {end_time}")
33+
return 0

scalr/policy/factory.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from scalr.policy import PolicyAdapter
33
from scalr.policy.adapters.dummy import DummyPolicyAdapter
44
from scalr.policy.adapters.prometheus import PrometheusPolicyAdapter
5+
from scalr.policy.adapters.time import TimePolicyAdapter
56
from scalr.policy.adapters.web import WebPolicyAdapter
67

78

@@ -11,6 +12,7 @@ class PolicyAdapterFactory:
1112
"dummy": DummyPolicyAdapter,
1213
"prometheus": PrometheusPolicyAdapter,
1314
"web": WebPolicyAdapter,
15+
"time": TimePolicyAdapter,
1416
}
1517

1618
@staticmethod

scalr/scalr.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def get_factor(self, policy_configs: List[PolicyConfig]) -> float:
6767
policy_factor: float = policy.get_scaling_factor()
6868
log.debug(f"Policy scaling factor: {policy_factor}")
6969

70-
if policy_factor == 0:
70+
if policy_factor <= 0:
7171
log.debug(f"Ignoring factor 0, keep current scaling factor: {scaling_factor}")
7272
continue
7373

0 commit comments

Comments
 (0)