Skip to content

Commit 2a6f0ea

Browse files
committed
🚧 WiP: Start separating json-Representation from internal Data-Representation for the clean-parser;
1 parent bd4d757 commit 2a6f0ea

File tree

3 files changed

+100
-8
lines changed

3 files changed

+100
-8
lines changed

ā€Žsrc/autoscaler/api/binding_request/binding-request-parser.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@ import (
99
)
1010

1111
type Parameters struct {
12-
Configuration *models.BindingConfig `json:"configuration"`
13-
ScalingPolicy *models.ScalingPolicy `json:"scaling-policy"`
12+
// 🚧 To-do: We should distinguish between raw data and correctly validated data.
13+
Configuration *models.BindingConfig
14+
15+
// 🚧 To-do: We should distinguish between raw data and correctly validated data.
16+
ScalingPolicy *models.ScalingPolicy
1417
}
1518

1619
type JsonSchemaError []gojsonschema.ResultError
@@ -21,7 +24,9 @@ func (e JsonSchemaError) Error() string {
2124
}
2225

2326
type Parser interface {
24-
// NewFromString(jsonSchema string) (BindingRequestParser, error)
25-
// NewFromFile(pathToSchemaFile string) (BindingRequestParser, error)
27+
// Default policies are specified on service-instance-level. Consequently, we need to leave the
28+
// field Parameters.ScalingPolicy empty when no policy has been specified and instead … let the
29+
// consumer of the BindingRequest decided what to do with this (i.e. he will use then the
30+
// default-policy.)
2631
Parse(bindingReqParams string) (Parameters, error)
2732
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package clean_parser
2+
3+
type parameters struct {
4+
Configuration *bindingCfg `json:"configuration"`
5+
ScalingPolicy *scalingPolicy `json:"scaling-policy"`
6+
}
7+
8+
9+
10+
// ================================================================================
11+
// Binding-configuration
12+
// ================================================================================
13+
14+
type bindingCfg struct {
15+
CustomMetricsCfg customMetricsCfg
16+
AppGuid string `json:"app_guid"`
17+
}
18+
19+
type customMetricsCfg struct {
20+
MetricSubmStrat metricSubmStrat `json:"metric_submission_strategy"`
21+
}
22+
23+
type metricSubmStrat struct {
24+
AllowFrom string `json:"allow_from"`
25+
}
26+
27+
28+
29+
// ================================================================================
30+
// Scaling-policy
31+
// ================================================================================
32+
33+
type scalingPolicy struct {
34+
SchemaVersion string `json:"schema-version"`
35+
InstanceMinCount int `json:"instance_min_count"`
36+
InstanceMaxCount int `json:"instance_max_count"`
37+
ScalingRules []scalingRule `json:"scaling_rules,omitempty"`
38+
Schedules *scalingSchedule `json:"schedules,omitempty"`
39+
}
40+
41+
type scalingRule struct {
42+
MetricType string `json:"metric_type"`
43+
BreachDurationSecs int `json:"breach_duration_secs,omitempty"`
44+
Threshold int `json:"threshold"`
45+
Operator string `json:"operator"`
46+
CoolDownSecs int `json:"cool_down_secs,omitempty"`
47+
Adjustment string `json:"adjustment"`
48+
}
49+
50+
type scalingSchedule struct {
51+
Timezone string `json:"timezone"`
52+
RecurringSchedule []recurringSchedule `json:"recurring_schedule,omitempty"`
53+
SpecificDate []specificDate `json:"specific_date,omitempty"`
54+
}
55+
56+
type recurringSchedule struct {
57+
StartTime string `json:"start_time"`
58+
EndTime string `json:"end_time"`
59+
DaysOfWeek []int `json:"days_of_week,omitempty"`
60+
DaysOfMonth []int `json:"days_of_month,omitempty"`
61+
InstanceMinCount int `json:"instance_min_count"`
62+
InstanceMaxCount int `json:"instance_max_count"`
63+
InitialMinInstanceCount int `json:"initial_min_instance_count,omitempty"`
64+
StartDate string `json:"start_date,omitempty"`
65+
EndDate string `json:"end_date,omitempty"`
66+
}
67+
68+
type specificDate struct {
69+
StartDateTime string `json:"start_date_time"`
70+
EndDateTime string `json:"end_date_time"`
71+
InstanceMinCount int `json:"instance_min_count"`
72+
InstanceMaxCount int `json:"instance_max_count"`
73+
InitialMinInstanceCount int `json:"initial_min_instance_count,omitempty"`
74+
}

ā€Žsrc/autoscaler/api/binding_request/clean_parser/parser.go

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,15 @@ import (
66
"github.com/xeipuuv/gojsonschema"
77

88
"code.cloudfoundry.org/app-autoscaler/src/autoscaler/api/binding_request"
9+
"code.cloudfoundry.org/app-autoscaler/src/autoscaler/models"
910
)
1011

1112
type CleanBindingRequestParser struct {
1213
schema *gojsonschema.Schema
1314
}
1415

16+
var _ binding_request.Parser = CleanBindingRequestParser{}
17+
1518
func new(jsonLoader gojsonschema.JSONLoader) (CleanBindingRequestParser, error) {
1619
schema, err := gojsonschema.NewSchema(jsonLoader)
1720
if err != nil {
@@ -45,11 +48,21 @@ func (p CleanBindingRequestParser) Parse(bindingReqParams string) (binding_reque
4548
return binding_request.Parameters{}, allErrors
4649
}
4750

48-
var result binding_request.Parameters
49-
err = json.Unmarshal([]byte(bindingReqParams), &result)
51+
var parsedParameters parameters
52+
err = json.Unmarshal([]byte(bindingReqParams), &parsedParameters)
5053
if err != nil {
5154
return binding_request.Parameters{}, err
52-
} else {
53-
return result, nil
5455
}
56+
57+
return toBindingParameters(parsedParameters), nil
58+
}
59+
60+
func toBindingParameters(parameters) binding_request.Parameters {
61+
result := binding_request.Parameters{}
62+
result.Configuration.AppGUID = models.GUID(parameters.Configuration.AppGuid)
63+
result.Configuration.CustomMetrics.MetricSubmissionStrategy.AllowFrom = parameters.Configuration.CustomMetricsCfg.MetricSubmStrat.AllowFrom
64+
65+
// 🚧 To-do: Do the same for the policy.
66+
67+
return result
5568
}

0 commit comments

Comments
Ā (0)