mirror of
https://github.com/zalando-incubator/kube-metrics-adapter.git
synced 2025-05-12 00:19:49 +00:00
Add end date support for Repeating schedule. Added tests
This commit is contained in:
@ -55,8 +55,8 @@ spec:
|
|||||||
format: date-time
|
format: date-time
|
||||||
type: string
|
type: string
|
||||||
durationMinutes:
|
durationMinutes:
|
||||||
description: The duration in minutes that the configured value
|
description: The duration in minutes (default 0) that the configured
|
||||||
will be returned for the defined schedule.
|
value will be returned for the defined schedule.
|
||||||
type: integer
|
type: integer
|
||||||
endDate:
|
endDate:
|
||||||
description: Defines the ending date of a OneTime schedule.
|
description: Defines the ending date of a OneTime schedule.
|
||||||
@ -95,7 +95,6 @@ spec:
|
|||||||
type: string
|
type: string
|
||||||
required:
|
required:
|
||||||
- days
|
- days
|
||||||
- endTime
|
|
||||||
- startTime
|
- startTime
|
||||||
- timezone
|
- timezone
|
||||||
type: object
|
type: object
|
||||||
@ -113,7 +112,6 @@ spec:
|
|||||||
format: int64
|
format: int64
|
||||||
type: integer
|
type: integer
|
||||||
required:
|
required:
|
||||||
- durationMinutes
|
|
||||||
- type
|
- type
|
||||||
- value
|
- value
|
||||||
type: object
|
type: object
|
||||||
|
@ -55,8 +55,8 @@ spec:
|
|||||||
format: date-time
|
format: date-time
|
||||||
type: string
|
type: string
|
||||||
durationMinutes:
|
durationMinutes:
|
||||||
description: The duration in minutes that the configured value
|
description: The duration in minutes (default 0) that the configured
|
||||||
will be returned for the defined schedule.
|
value will be returned for the defined schedule.
|
||||||
type: integer
|
type: integer
|
||||||
endDate:
|
endDate:
|
||||||
description: Defines the ending date of a OneTime schedule.
|
description: Defines the ending date of a OneTime schedule.
|
||||||
@ -95,7 +95,6 @@ spec:
|
|||||||
type: string
|
type: string
|
||||||
required:
|
required:
|
||||||
- days
|
- days
|
||||||
- endTime
|
|
||||||
- startTime
|
- startTime
|
||||||
- timezone
|
- timezone
|
||||||
type: object
|
type: object
|
||||||
@ -113,7 +112,6 @@ spec:
|
|||||||
format: int64
|
format: int64
|
||||||
type: integer
|
type: integer
|
||||||
required:
|
required:
|
||||||
- durationMinutes
|
|
||||||
- type
|
- type
|
||||||
- value
|
- value
|
||||||
type: object
|
type: object
|
||||||
|
@ -65,8 +65,9 @@ type Schedule struct {
|
|||||||
// a RFC3339 formated date.
|
// a RFC3339 formated date.
|
||||||
// +optional
|
// +optional
|
||||||
EndDate *ScheduleDate `json:"endDate,omitempty"`
|
EndDate *ScheduleDate `json:"endDate,omitempty"`
|
||||||
// The duration in minutes that the configured value will be
|
// The duration in minutes (default 0) that the configured value will be
|
||||||
// returned for the defined schedule.
|
// returned for the defined schedule.
|
||||||
|
// +optional
|
||||||
DurationMinutes int `json:"durationMinutes"`
|
DurationMinutes int `json:"durationMinutes"`
|
||||||
// The metric value that will be returned for the defined schedule.
|
// The metric value that will be returned for the defined schedule.
|
||||||
Value int64 `json:"value"`
|
Value int64 `json:"value"`
|
||||||
@ -96,6 +97,7 @@ type SchedulePeriod struct {
|
|||||||
StartTime string `json:"startTime"`
|
StartTime string `json:"startTime"`
|
||||||
// The endTime has the format HH:MM
|
// The endTime has the format HH:MM
|
||||||
// +kubebuilder:validation:Pattern="(([0-1][0-9])|([2][0-3])):([0-5][0-9])"
|
// +kubebuilder:validation:Pattern="(([0-1][0-9])|([2][0-3])):([0-5][0-9])"
|
||||||
|
// +optional
|
||||||
EndTime string `json:"endTime"`
|
EndTime string `json:"endTime"`
|
||||||
// The days that this schedule will be active.
|
// The days that this schedule will be active.
|
||||||
Days []ScheduleDay `json:"days"`
|
Days []ScheduleDay `json:"days"`
|
||||||
|
@ -294,8 +294,10 @@ func calculateMetrics(spec v1.ScalingScheduleSpec, defaultScalingWindow time.Dur
|
|||||||
location,
|
location,
|
||||||
)
|
)
|
||||||
|
|
||||||
// first check if an end time is provided
|
// If no end time was provided, set it to equal the start time
|
||||||
if schedule.Period.EndTime != "" {
|
if schedule.Period.EndTime == "" {
|
||||||
|
scheduledEndTime = scheduledTime
|
||||||
|
} else {
|
||||||
parsedEndTime, err := time.Parse(hourColonMinuteLayout, schedule.Period.EndTime)
|
parsedEndTime, err := time.Parse(hourColonMinuteLayout, schedule.Period.EndTime)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, ErrInvalidScheduleDate
|
return nil, ErrInvalidScheduleDate
|
||||||
@ -362,9 +364,6 @@ func valueForEntry(timestamp time.Time, startTime time.Time, entryDuration time.
|
|||||||
|
|
||||||
// Use either the defined end time/date or the start time/date + the
|
// Use either the defined end time/date or the start time/date + the
|
||||||
// duration, whichever is longer.
|
// duration, whichever is longer.
|
||||||
fmt.Println("-----")
|
|
||||||
fmt.Printf("starttime: %v\n", startTime)
|
|
||||||
fmt.Printf("end time: %v\n", scheduledEndTime)
|
|
||||||
if startTime.Add(entryDuration).Before(scheduledEndTime) {
|
if startTime.Add(entryDuration).Before(scheduledEndTime) {
|
||||||
endTime = scheduledEndTime
|
endTime = scheduledEndTime
|
||||||
} else {
|
} else {
|
||||||
|
@ -23,6 +23,7 @@ type schedule struct {
|
|||||||
date string
|
date string
|
||||||
endDate string
|
endDate string
|
||||||
startTime string
|
startTime string
|
||||||
|
endTime string
|
||||||
days []v1.ScheduleDay
|
days []v1.ScheduleDay
|
||||||
timezone string
|
timezone string
|
||||||
duration int
|
duration int
|
||||||
@ -77,7 +78,7 @@ func TestScalingScheduleCollector(t *testing.T) {
|
|||||||
expectedValue: 100,
|
expectedValue: 100,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
msg: "Return 100 - utilise end date instead of start date + duration for one time config",
|
msg: "Return the right value - utilise end date instead of start date + duration for one time config",
|
||||||
schedules: []schedule{
|
schedules: []schedule{
|
||||||
{
|
{
|
||||||
date: nowTime.Add(-2 * time.Hour).Format(time.RFC3339),
|
date: nowTime.Add(-2 * time.Hour).Format(time.RFC3339),
|
||||||
@ -89,6 +90,42 @@ func TestScalingScheduleCollector(t *testing.T) {
|
|||||||
},
|
},
|
||||||
expectedValue: 100,
|
expectedValue: 100,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
msg: "Return the right value - utilise start date + duration instead of end date for one time config",
|
||||||
|
schedules: []schedule{
|
||||||
|
{
|
||||||
|
date: nowTime.Add(-2 * time.Hour).Format(time.RFC3339),
|
||||||
|
kind: "OneTime",
|
||||||
|
duration: 150,
|
||||||
|
endDate: nowTime.Add(-1 * time.Hour).Format(time.RFC3339),
|
||||||
|
value: 100,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedValue: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
msg: "Return the right value - use end date with no duration set for one time config",
|
||||||
|
schedules: []schedule{
|
||||||
|
{
|
||||||
|
date: nowTime.Add(-2 * time.Hour).Format(time.RFC3339),
|
||||||
|
kind: "OneTime",
|
||||||
|
endDate: nowTime.Add(1 * time.Hour).Format(time.RFC3339),
|
||||||
|
value: 100,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedValue: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
msg: "Return the right value (0) for one time config no duration or end date set",
|
||||||
|
schedules: []schedule{
|
||||||
|
{
|
||||||
|
date: nowTime.Add(time.Minute * 1).Format(time.RFC3339),
|
||||||
|
kind: "OneTime",
|
||||||
|
value: 100,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedValue: 0,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
msg: "Return the right value for one time config - 30 seconds before ending",
|
msg: "Return the right value for one time config - 30 seconds before ending",
|
||||||
schedules: []schedule{
|
schedules: []schedule{
|
||||||
@ -269,6 +306,35 @@ func TestScalingScheduleCollector(t *testing.T) {
|
|||||||
},
|
},
|
||||||
expectedValue: 100,
|
expectedValue: 100,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
msg: "Return the right value - utilise end date instead of start time + duration for repeating schedule",
|
||||||
|
schedules: []schedule{
|
||||||
|
{
|
||||||
|
kind: "Repeating",
|
||||||
|
duration: 60,
|
||||||
|
value: 100,
|
||||||
|
startTime: nowTime.Add(-2 * time.Hour).Format(hHMMFormat),
|
||||||
|
// nowTime + 59m = 23:59.
|
||||||
|
endTime: nowTime.Add(59 * time.Minute).Format(hHMMFormat),
|
||||||
|
days: []v1.ScheduleDay{nowWeekday},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedValue: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
msg: "Return the right value - utilise start time + duration instead of end time for repeating schedule",
|
||||||
|
schedules: []schedule{
|
||||||
|
{
|
||||||
|
kind: "Repeating",
|
||||||
|
duration: 150,
|
||||||
|
value: 100,
|
||||||
|
startTime: nowTime.Add(-2 * time.Hour).Format(hHMMFormat),
|
||||||
|
endTime: nowTime.Add(-1 * time.Hour).Format(hHMMFormat),
|
||||||
|
days: []v1.ScheduleDay{nowWeekday},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedValue: 100,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
msg: "Return the right value for a repeating schedule - 5 minutes after started",
|
msg: "Return the right value for a repeating schedule - 5 minutes after started",
|
||||||
schedules: []schedule{
|
schedules: []schedule{
|
||||||
@ -759,7 +825,6 @@ func newClusterMockStoreFirstRun(name string, scalingWindowDurationMinutes *int6
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// comment DEBUG
|
|
||||||
func getSchedules(schedules []schedule) (result []v1.Schedule) {
|
func getSchedules(schedules []schedule) (result []v1.Schedule) {
|
||||||
for _, schedule := range schedules {
|
for _, schedule := range schedules {
|
||||||
switch schedule.kind {
|
switch schedule.kind {
|
||||||
@ -778,6 +843,7 @@ func getSchedules(schedules []schedule) (result []v1.Schedule) {
|
|||||||
case string(v1.RepeatingSchedule):
|
case string(v1.RepeatingSchedule):
|
||||||
period := v1.SchedulePeriod{
|
period := v1.SchedulePeriod{
|
||||||
StartTime: schedule.startTime,
|
StartTime: schedule.startTime,
|
||||||
|
EndTime: schedule.endTime,
|
||||||
Days: schedule.days,
|
Days: schedule.days,
|
||||||
Timezone: schedule.timezone,
|
Timezone: schedule.timezone,
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user