Skip to content

Commit 6e358b5

Browse files
committedDec 11, 2023
Add filter on namespaces
1 parent 80da387 commit 6e358b5

File tree

3 files changed

+63
-14
lines changed

3 files changed

+63
-14
lines changed
 

‎cmd/icinga-kubernetes/main.go

+23-9
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,27 @@ 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"
1820
)
1921

2022
func main() {
21-
kconfig, err := kclientcmd.NewNonInteractiveDeferredLoadingClientConfig(
22-
kclientcmd.NewDefaultClientConfigLoadingRules(), &kclientcmd.ConfigOverrides{}).ClientConfig()
23+
var configPath string
24+
pflag.StringVarP(&configPath, "config", "c", "./config.yml", "path to config file")
25+
26+
kconfigOverrides := &kclientcmd.ConfigOverrides{}
27+
kclientcmd.BindOverrideFlags(kconfigOverrides, pflag.CommandLine, kclientcmd.RecommendedConfigOverrideFlags(""))
28+
29+
kclientconfig := kclientcmd.NewNonInteractiveDeferredLoadingClientConfig(
30+
kclientcmd.NewDefaultClientConfigLoadingRules(), kconfigOverrides)
31+
32+
pflag.Parse()
33+
34+
kconfig, err := kclientconfig.ClientConfig()
2335
if err != nil {
2436
logging.Fatal(errors.Wrap(err, "can't configure Kubernetes client"))
2537
}
@@ -29,12 +41,14 @@ func main() {
2941
logging.Fatal(errors.Wrap(err, "can't create Kubernetes client"))
3042
}
3143

32-
flags, err := config.ParseFlags[internal.Flags]()
44+
namespace, overridden, err := kclientconfig.Namespace()
3345
if err != nil {
34-
logging.Fatal(errors.Wrap(err, "can't parse flags"))
46+
logging.Fatal(errors.Wrap(err, "can't get namespace from CLI"))
47+
} else if !overridden {
48+
namespace = kmetav1.NamespaceAll
3549
}
3650

37-
cfg, err := config.FromYAMLFile[internal.Config](flags.Config)
51+
cfg, err := config.FromYAMLFile[internal.Config](configPath)
3852
if err != nil {
3953
logging.Fatal(errors.Wrap(err, "can't create configuration"))
4054
}
@@ -66,26 +80,26 @@ func main() {
6680
}
6781
}
6882

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

7185
g, ctx := errgroup.WithContext(ctx)
7286

7387
g.Go(func() error {
7488
return sync.NewSync(
7589
db, schema.NewNode, informers.Core().V1().Nodes().Informer(), logs.GetChildLogger("Nodes"),
76-
).Run(ctx)
90+
).Run(ctx, namespace)
7791
})
7892

7993
g.Go(func() error {
8094
return sync.NewSync(
8195
db, schema.NewNamespace, informers.Core().V1().Namespaces().Informer(), logs.GetChildLogger("Namespaces"),
82-
).Run(ctx)
96+
).Run(ctx, namespace)
8397
})
8498

8599
g.Go(func() error {
86100
return sync.NewSync(
87101
db, schema.NewPod, informers.Core().V1().Pods().Informer(), logs.GetChildLogger("Pods"),
88-
).Run(ctx)
102+
).Run(ctx, namespace)
89103
})
90104

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

‎pkg/schema/scoped_resource.go

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package schema
2+
3+
import (
4+
"github.com/icinga/icinga-go-library/database"
5+
"github.com/icinga/icinga-kubernetes/pkg/contracts"
6+
)
7+
8+
type ScopedResource struct {
9+
contracts.Resource
10+
scope interface{}
11+
}
12+
13+
func (r *ScopedResource) Scope() interface{} {
14+
return r.scope
15+
}
16+
17+
func (r *ScopedResource) TableName() string {
18+
return database.TableName(r.Resource)
19+
}
20+
21+
func NewScopedResource(resource contracts.Resource, scope interface{}) *ScopedResource {
22+
return &ScopedResource{
23+
Resource: resource,
24+
scope: scope,
25+
}
26+
}

‎pkg/sync/sync.go

+14-5
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,18 @@ import (
77
"github.com/icinga/icinga-go-library/database"
88
"github.com/icinga/icinga-go-library/logging"
99
"github.com/icinga/icinga-kubernetes/pkg/contracts"
10+
"github.com/icinga/icinga-kubernetes/pkg/schema"
1011
"github.com/icinga/icinga-kubernetes/pkg/sink"
1112
"github.com/pkg/errors"
1213
"go.uber.org/zap"
1314
"golang.org/x/sync/errgroup"
15+
kmetav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1416
kcache "k8s.io/client-go/tools/cache"
17+
"reflect"
1518
)
1619

1720
type Sync interface {
18-
Run(context.Context) error
21+
Run(context.Context, string) error
1922
}
2023

2124
type sync struct {
@@ -39,12 +42,12 @@ func NewSync(
3942
}
4043
}
4144

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

4548
s.logger.Debug("Warming up")
4649

47-
err := s.Warmup(ctx)
50+
err := s.Warmup(ctx, namespace)
4851
if err != nil {
4952
return errors.Wrap(err, "warmup failed")
5053
}
@@ -139,13 +142,19 @@ func (s *sync) Run(ctx context.Context) error {
139142
return g.Wait()
140143
}
141144

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

145148
resource := s.factory()
149+
resourceType := reflect.TypeOf(resource).Elem()
150+
151+
if _, found := resourceType.FieldByName("kmetaWithNamespace"); found && namespace != kmetav1.NamespaceAll {
152+
resource = schema.NewScopedResource(resource, &struct{ Namespace string }{})
153+
}
154+
146155
entities, err := s.db.YieldAll(ctx, func() database.Entity {
147156
return s.factory()
148-
}, s.db.BuildSelectStmt(resource, resource.Fingerprint()), struct{}{})
157+
}, s.db.BuildSelectStmt(resource, resource.Fingerprint()), struct{ Namespace string }{Namespace: namespace})
149158
com.ErrgroupReceive(ctx, g, err)
150159

151160
g.Go(func() error {

0 commit comments

Comments
 (0)
Please sign in to comment.