Skip to content

Commit cd8201e

Browse files
committed
Add filter on namespaces
1 parent 80da387 commit cd8201e

File tree

3 files changed

+71
-13
lines changed

3 files changed

+71
-13
lines changed

cmd/icinga-kubernetes/main.go

+60-8
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,65 @@ import (
1111
"github.com/icinga/icinga-kubernetes/pkg/sync"
1212
"github.com/okzk/sdnotify"
1313
"github.com/pkg/errors"
14+
"github.com/spf13/pflag"
1415
"golang.org/x/sync/errgroup"
16+
kmetav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1517
kinformers "k8s.io/client-go/informers"
1618
"k8s.io/client-go/kubernetes"
1719
kclientcmd "k8s.io/client-go/tools/clientcmd"
20+
"reflect"
21+
"strconv"
1822
)
1923

2024
func main() {
21-
kconfig, err := kclientcmd.NewNonInteractiveDeferredLoadingClientConfig(
22-
kclientcmd.NewDefaultClientConfigLoadingRules(), &kclientcmd.ConfigOverrides{}).ClientConfig()
25+
flags := internal.Flags{}
26+
27+
fv := reflect.ValueOf(&flags).Elem()
28+
ft := reflect.TypeOf(flags)
29+
30+
for i := 0; i < ft.NumField(); i++ {
31+
fieldType := ft.Field(i)
32+
fieldValue := fv.Field(i)
33+
34+
long := fieldType.Tag.Get("long")
35+
short := fieldType.Tag.Get("short")
36+
value := fieldType.Tag.Get("default")
37+
usage := fieldType.Tag.Get("description")
38+
39+
switch fieldValue.Kind() {
40+
case reflect.String:
41+
ref := fv.Field(i).Addr().Interface().(*string)
42+
pflag.StringVarP(ref, long, short, value, usage)
43+
case reflect.Int:
44+
ref := fv.Field(i).Addr().Interface().(*int)
45+
46+
value, err := strconv.Atoi(value)
47+
if err != nil {
48+
logging.Fatal(errors.Wrap(err, "can't convert flag default value to integer"))
49+
}
50+
51+
pflag.IntVarP(ref, long, short, value, usage)
52+
case reflect.Bool:
53+
ref := fv.Field(i).Addr().Interface().(*bool)
54+
55+
value, err := strconv.ParseBool(value)
56+
if err != nil {
57+
logging.Fatal(errors.Wrap(err, "can't convert flag default value to bool"))
58+
}
59+
60+
pflag.BoolVarP(ref, long, short, value, usage)
61+
}
62+
}
63+
64+
kconfigOverrides := &kclientcmd.ConfigOverrides{}
65+
kclientcmd.BindOverrideFlags(kconfigOverrides, pflag.CommandLine, kclientcmd.RecommendedConfigOverrideFlags(""))
66+
67+
kclientconfig := kclientcmd.NewNonInteractiveDeferredLoadingClientConfig(
68+
kclientcmd.NewDefaultClientConfigLoadingRules(), kconfigOverrides)
69+
70+
pflag.Parse()
71+
72+
kconfig, err := kclientconfig.ClientConfig()
2373
if err != nil {
2474
logging.Fatal(errors.Wrap(err, "can't configure Kubernetes client"))
2575
}
@@ -29,9 +79,11 @@ func main() {
2979
logging.Fatal(errors.Wrap(err, "can't create Kubernetes client"))
3080
}
3181

32-
flags, err := config.ParseFlags[internal.Flags]()
82+
namespace, overridden, err := kclientconfig.Namespace()
3383
if err != nil {
34-
logging.Fatal(errors.Wrap(err, "can't parse flags"))
84+
logging.Fatal(errors.Wrap(err, "can't get namespace from CLI"))
85+
} else if !overridden {
86+
namespace = kmetav1.NamespaceAll
3587
}
3688

3789
cfg, err := config.FromYAMLFile[internal.Config](flags.Config)
@@ -66,26 +118,26 @@ func main() {
66118
}
67119
}
68120

69-
informers := kinformers.NewSharedInformerFactory(k, 0)
121+
informers := kinformers.NewSharedInformerFactoryWithOptions(k, 0, kinformers.WithNamespace(namespace))
70122

71123
g, ctx := errgroup.WithContext(ctx)
72124

73125
g.Go(func() error {
74126
return sync.NewSync(
75127
db, schema.NewNode, informers.Core().V1().Nodes().Informer(), logs.GetChildLogger("Nodes"),
76-
).Run(ctx)
128+
).Run(ctx, namespace)
77129
})
78130

79131
g.Go(func() error {
80132
return sync.NewSync(
81133
db, schema.NewNamespace, informers.Core().V1().Namespaces().Informer(), logs.GetChildLogger("Namespaces"),
82-
).Run(ctx)
134+
).Run(ctx, namespace)
83135
})
84136

85137
g.Go(func() error {
86138
return sync.NewSync(
87139
db, schema.NewPod, informers.Core().V1().Pods().Informer(), logs.GetChildLogger("Pods"),
88-
).Run(ctx)
140+
).Run(ctx, namespace)
89141
})
90142

91143
if err := g.Wait(); err != nil {

pkg/schema/pod.go

+6
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,9 @@ func NewPod() contracts.Resource {
1616
func (p *Pod) Obtain(kobject kmetav1.Object) {
1717
p.kmetaWithNamespace.Obtain(kobject)
1818
}
19+
20+
func (p *Pod) Scope() any {
21+
return &struct {
22+
Namespace string
23+
}{}
24+
}

pkg/sync/sync.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
)
1616

1717
type Sync interface {
18-
Run(context.Context) error
18+
Run(context.Context, string) error
1919
}
2020

2121
type sync struct {
@@ -39,12 +39,12 @@ func NewSync(
3939
}
4040
}
4141

42-
func (s *sync) Run(ctx context.Context) error {
42+
func (s *sync) Run(ctx context.Context, namespace string) error {
4343
s.logger.Info("Starting sync")
4444

4545
s.logger.Debug("Warming up")
4646

47-
err := s.Warmup(ctx)
47+
err := s.Warmup(ctx, namespace)
4848
if err != nil {
4949
return errors.Wrap(err, "warmup failed")
5050
}
@@ -139,13 +139,13 @@ func (s *sync) Run(ctx context.Context) error {
139139
return g.Wait()
140140
}
141141

142-
func (s *sync) Warmup(ctx context.Context) error {
142+
func (s *sync) Warmup(ctx context.Context, namespace string) error {
143143
g, ctx := errgroup.WithContext(ctx)
144144

145145
resource := s.factory()
146146
entities, err := s.db.YieldAll(ctx, func() database.Entity {
147147
return s.factory()
148-
}, s.db.BuildSelectStmt(resource, resource.Fingerprint()), struct{}{})
148+
}, s.db.BuildSelectStmt(resource, resource.Fingerprint()), struct{ Namespace string }{Namespace: namespace})
149149
com.ErrgroupReceive(ctx, g, err)
150150

151151
g.Go(func() error {

0 commit comments

Comments
 (0)