Skip to content

Commit a9cb030

Browse files
committed
metrics: also create an ClusterRole for rbac aggregation
1 parent a5b8b9b commit a9cb030

File tree

2 files changed

+53
-21
lines changed

2 files changed

+53
-21
lines changed

pkg/metrics/generator.go

+37-5
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,19 @@ package metrics
2121
import (
2222
"fmt"
2323
"sort"
24+
"strings"
25+
26+
"github.com/gobuffalo/flect"
27+
rbacv1 "k8s.io/api/rbac/v1"
28+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2429

2530
"sigs.k8s.io/controller-tools/pkg/crd"
2631
"sigs.k8s.io/controller-tools/pkg/genall"
2732
"sigs.k8s.io/controller-tools/pkg/loader"
2833
ctrlmarkers "sigs.k8s.io/controller-tools/pkg/markers"
29-
30-
customresourcestate "sigs.k8s.io/controller-tools/pkg/metrics/internal/config"
34+
"sigs.k8s.io/controller-tools/pkg/metrics/internal/config"
3135
"sigs.k8s.io/controller-tools/pkg/metrics/markers"
36+
"sigs.k8s.io/controller-tools/pkg/rbac"
3237
)
3338

3439
// Generator generates kube-state-metrics custom resource configuration files.
@@ -89,12 +94,14 @@ func (g Generator) Generate(ctx *genall.GenerationContext) error {
8994

9095
// Initialize empty customresourcestate configuration file and fill it with the
9196
// customresourcestate.Resource objects from the parser.
92-
metrics := customresourcestate.Metrics{
93-
Spec: customresourcestate.MetricsSpec{
94-
Resources: []customresourcestate.Resource{},
97+
metrics := config.Metrics{
98+
Spec: config.MetricsSpec{
99+
Resources: []config.Resource{},
95100
},
96101
}
97102

103+
rules := []*rbac.Rule{}
104+
98105
for _, resource := range parser.CustomResourceStates {
99106
if resource == nil {
100107
continue
@@ -106,6 +113,12 @@ func (g Generator) Generate(ctx *genall.GenerationContext) error {
106113
})
107114

108115
metrics.Spec.Resources = append(metrics.Spec.Resources, *resource)
116+
117+
rules = append(rules, &rbac.Rule{
118+
Groups: []string{resource.GroupVersionKind.Group},
119+
Resources: []string{strings.ToLower(flect.Pluralize(resource.GroupVersionKind.Kind))},
120+
Verbs: []string{"get", "list", "watch"},
121+
})
109122
}
110123
}
111124

@@ -122,6 +135,25 @@ func (g Generator) Generate(ctx *genall.GenerationContext) error {
122135
return fmt.Errorf("WriteYAML to %s: %w", virtualFilePath, err)
123136
}
124137

138+
clusterRole := rbacv1.ClusterRole{
139+
TypeMeta: metav1.TypeMeta{
140+
Kind: "ClusterRole",
141+
APIVersion: rbacv1.SchemeGroupVersion.String(),
142+
},
143+
ObjectMeta: metav1.ObjectMeta{
144+
Name: "manager-metrics-role",
145+
Labels: map[string]string{
146+
"kube-state-metrics/aggregate-to-manager": "true",
147+
},
148+
},
149+
Rules: rbac.NormalizeRules(rules),
150+
}
151+
152+
virtualFilePath = "rbac.yaml"
153+
if err := ctx.WriteYAML(virtualFilePath, "", []interface{}{clusterRole}, genall.WithTransform(genall.TransformRemoveCreationTimestamp)); err != nil {
154+
return fmt.Errorf("WriteYAML to %s: %w", virtualFilePath, err)
155+
}
156+
125157
return nil
126158
}
127159

pkg/metrics/parser.go

+16-16
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,20 @@ import (
2626
"sigs.k8s.io/controller-tools/pkg/loader"
2727
ctrlmarkers "sigs.k8s.io/controller-tools/pkg/markers"
2828

29-
customresourcestate "sigs.k8s.io/controller-tools/pkg/metrics/internal/config"
29+
"sigs.k8s.io/controller-tools/pkg/metrics/internal/config"
3030
"sigs.k8s.io/controller-tools/pkg/metrics/markers"
3131
)
3232

3333
type parser struct {
3434
*crd.Parser
3535

36-
CustomResourceStates map[crd.TypeIdent]*customresourcestate.Resource
36+
CustomResourceStates map[crd.TypeIdent]*config.Resource
3737
}
3838

3939
func newParser(p *crd.Parser) *parser {
4040
return &parser{
4141
Parser: p,
42-
CustomResourceStates: make(map[crd.TypeIdent]*customresourcestate.Resource),
42+
CustomResourceStates: make(map[crd.TypeIdent]*config.Resource),
4343
}
4444
}
4545

@@ -75,8 +75,8 @@ func (p *parser) NeedResourceFor(pkg *loader.Package, groupKind schema.GroupKind
7575
}
7676

7777
// Initialize the Resource object.
78-
resource := customresourcestate.Resource{
79-
GroupVersionKind: customresourcestate.GroupVersionKind{
78+
resource := config.Resource{
79+
GroupVersionKind: config.GroupVersionKind{
8080
Group: groupKind.Group,
8181
Kind: groupKind.Kind,
8282
Version: p.GroupVersions[pkg].Version,
@@ -101,7 +101,7 @@ func (p *parser) NeedResourceFor(pkg *loader.Package, groupKind schema.GroupKind
101101
}
102102

103103
type generatorRequester interface {
104-
NeedMetricsGeneratorFor(typ crd.TypeIdent) ([]customresourcestate.Generator, error)
104+
NeedMetricsGeneratorFor(typ crd.TypeIdent) ([]config.Generator, error)
105105
}
106106

107107
// generatorContext stores and provides information across a hierarchy of metric generators generation.
@@ -120,8 +120,8 @@ func newGeneratorContext(pkg *loader.Package, req generatorRequester) *generator
120120
}
121121
}
122122

123-
func generatorsFromMarkers(m ctrlmarkers.MarkerValues, basePath ...string) ([]customresourcestate.Generator, error) {
124-
generators := []customresourcestate.Generator{}
123+
func generatorsFromMarkers(m ctrlmarkers.MarkerValues, basePath ...string) ([]config.Generator, error) {
124+
generators := []config.Generator{}
125125

126126
for _, markerVals := range m {
127127
for _, val := range markerVals {
@@ -142,7 +142,7 @@ func generatorsFromMarkers(m ctrlmarkers.MarkerValues, basePath ...string) ([]cu
142142

143143
// NeedMetricsGeneratorFor creates the customresourcestate.Generator object for a
144144
// Custom Resource.
145-
func (p *parser) NeedMetricsGeneratorFor(typ crd.TypeIdent) ([]customresourcestate.Generator, error) {
145+
func (p *parser) NeedMetricsGeneratorFor(typ crd.TypeIdent) ([]config.Generator, error) {
146146
info, gotInfo := p.Types[typ]
147147
if !gotInfo {
148148
return nil, fmt.Errorf("type info for %v does not exist", typ)
@@ -194,7 +194,7 @@ func (p *parser) NeedMetricsGeneratorFor(typ crd.TypeIdent) ([]customresourcesta
194194
// generatorsFor creates generators for the given AST type.
195195
// Note: Partially inspired by controller-tools.
196196
// xref: https://github.com/kubernetes-sigs/controller-tools/blob/d89d6ae3df218a85f7cd9e477157cace704b37d1/pkg/crd/schema.go#L167-L193
197-
func generatorsFor(ctx *generatorContext, rawType ast.Expr) ([]customresourcestate.Generator, error) {
197+
func generatorsFor(ctx *generatorContext, rawType ast.Expr) ([]config.Generator, error) {
198198
switch expr := rawType.(type) {
199199
case *ast.Ident:
200200
return localNamedToGenerators(ctx, expr)
@@ -222,7 +222,7 @@ func generatorsFor(ctx *generatorContext, rawType ast.Expr) ([]customresourcesta
222222

223223
// localNamedToGenerators recurses back to NeedMetricsGeneratorFor for the type to
224224
// get generators defined at the objects in a custom resource.
225-
func localNamedToGenerators(ctx *generatorContext, ident *ast.Ident) ([]customresourcestate.Generator, error) {
225+
func localNamedToGenerators(ctx *generatorContext, ident *ast.Ident) ([]config.Generator, error) {
226226
typeInfo := ctx.pkg.TypesInfo.TypeOf(ident)
227227
if typeInfo == types.Typ[types.Invalid] {
228228
// It is expected to hit this error for types from not loaded transitive package dependencies.
@@ -249,7 +249,7 @@ func localNamedToGenerators(ctx *generatorContext, ident *ast.Ident) ([]customre
249249

250250
// requestGenerator asks for the generator for a type in the package with the
251251
// given import path.
252-
func (c *generatorContext) requestGenerator(pkgPath, typeName string) ([]customresourcestate.Generator, error) {
252+
func (c *generatorContext) requestGenerator(pkgPath, typeName string) ([]config.Generator, error) {
253253
pkg := c.pkg
254254
if pkgPath != "" {
255255
pkg = c.pkg.Imports()[pkgPath]
@@ -261,13 +261,13 @@ func (c *generatorContext) requestGenerator(pkgPath, typeName string) ([]customr
261261
}
262262

263263
// addPathPrefixOnGenerator prefixes the path set at the generators MetricMeta object.
264-
func addPathPrefixOnGenerator(generator customresourcestate.Generator, pathPrefix string) customresourcestate.Generator {
264+
func addPathPrefixOnGenerator(generator config.Generator, pathPrefix string) config.Generator {
265265
switch generator.Each.Type {
266-
case customresourcestate.MetricTypeGauge:
266+
case config.MetricTypeGauge:
267267
generator.Each.Gauge.MetricMeta.Path = append([]string{pathPrefix}, generator.Each.Gauge.MetricMeta.Path...)
268-
case customresourcestate.MetricTypeStateSet:
268+
case config.MetricTypeStateSet:
269269
generator.Each.StateSet.MetricMeta.Path = append([]string{pathPrefix}, generator.Each.StateSet.MetricMeta.Path...)
270-
case customresourcestate.MetricTypeInfo:
270+
case config.MetricTypeInfo:
271271
generator.Each.Info.MetricMeta.Path = append([]string{pathPrefix}, generator.Each.Info.MetricMeta.Path...)
272272
}
273273

0 commit comments

Comments
 (0)