Skip to content

Commit 7137944

Browse files
committed
fix: show missing retention policies
1 parent 3903ea0 commit 7137944

2 files changed

Lines changed: 56 additions & 21 deletions

File tree

influx/databases.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ func (c *Client) showRetentionPolicies(ctx context.Context, db string) ([]chrono
197197
return nil, err
198198
}
199199

200-
return results.RetentionPolicies(), nil
200+
return results.RetentionPolicies(c.Logger), nil
201201
}
202202

203203
func (c *Client) showMeasurements(ctx context.Context, db string, limit, offset int) ([]chronograf.Measurement, error) {

influx/permissions.go

Lines changed: 55 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -93,37 +93,72 @@ func (r *showResults) Databases() []chronograf.Database {
9393
return res
9494
}
9595

96-
func (r *showResults) RetentionPolicies() []chronograf.RetentionPolicy {
97-
res := []chronograf.RetentionPolicy{}
96+
func (r *showResults) RetentionPolicies(logger chronograf.Logger) []chronograf.RetentionPolicy {
97+
var res []chronograf.RetentionPolicy
9898
for _, u := range *r {
9999
for _, s := range u.Series {
100100
for _, v := range s.Values {
101-
if name, ok := v[0].(string); !ok {
102-
continue
103-
} else if duration, ok := v[1].(string); !ok {
104-
continue
105-
} else if sduration, ok := v[2].(string); !ok {
106-
continue
107-
} else if replication, ok := v[3].(float64); !ok {
108-
continue
109-
} else if def, ok := v[4].(bool); !ok {
110-
continue
111-
} else {
112-
d := chronograf.RetentionPolicy{
113-
Name: name,
114-
Duration: duration,
115-
ShardDuration: sduration,
116-
Replication: int32(replication),
117-
Default: def,
101+
rp, err := parseRetentionPolicy(v)
102+
if err != nil {
103+
if logger != nil {
104+
types := make([]string, len(v))
105+
for i, val := range v {
106+
types[i] = fmt.Sprintf("%T", val)
107+
}
108+
logger.
109+
WithField("values", fmt.Sprintf("%v", v)).
110+
WithField("types", fmt.Sprintf("%v", types)).
111+
WithField("error", err.Error()).
112+
Error("Unsupported retention policy format")
118113
}
119-
res = append(res, d)
114+
continue
120115
}
116+
res = append(res, rp)
121117
}
122118
}
123119
}
124120
return res
125121
}
126122

123+
// parseRetentionPolicy validates and parses a retention policy row
124+
func parseRetentionPolicy(v []interface{}) (chronograf.RetentionPolicy, error) {
125+
columns := len(v)
126+
if columns < 5 {
127+
return chronograf.RetentionPolicy{}, fmt.Errorf("insufficient columns: expected at least 5, got %d", columns)
128+
} else if name, ok := v[0].(string); !ok {
129+
return chronograf.RetentionPolicy{}, fmt.Errorf("column 0 (name) is not a string")
130+
} else if duration, ok := v[1].(string); !ok {
131+
return chronograf.RetentionPolicy{}, fmt.Errorf("column 1 (duration) is not a string")
132+
} else if sduration, ok := v[2].(string); !ok {
133+
return chronograf.RetentionPolicy{}, fmt.Errorf("column 2 (shardDuration) is not a string")
134+
} else if replication, ok := v[3].(float64); !ok {
135+
return chronograf.RetentionPolicy{}, fmt.Errorf("column 3 (replication) is not a float64")
136+
} else {
137+
var def bool
138+
if columns == 5 {
139+
// 5-column format: [name, duration, shardGroupDuration, replicaN, default]
140+
if def, ok = v[4].(bool); !ok {
141+
return chronograf.RetentionPolicy{}, fmt.Errorf("column 4 (default) is not a bool")
142+
}
143+
} else if columns == 7 {
144+
// 7-column format: [name, duration, shardGroupDuration, replicaN, futureWriteLimit, pastWriteLimit, default]
145+
if def, ok = v[6].(bool); !ok {
146+
return chronograf.RetentionPolicy{}, fmt.Errorf("column 6 (default) is not a bool")
147+
}
148+
} else {
149+
return chronograf.RetentionPolicy{}, fmt.Errorf("unexpected number of columns: %d", columns)
150+
}
151+
152+
return chronograf.RetentionPolicy{
153+
Name: name,
154+
Duration: duration,
155+
ShardDuration: sduration,
156+
Replication: int32(replication),
157+
Default: def,
158+
}, nil
159+
}
160+
}
161+
127162
// Measurements converts SHOW MEASUREMENTS to chronograf Measurement
128163
func (r *showResults) Measurements() []chronograf.Measurement {
129164
res := []chronograf.Measurement{}

0 commit comments

Comments
 (0)