Skip to content

Commit fa9fae1

Browse files
committed
feat: idea how to run multiple shoot monitor managers
1 parent 87dc4b4 commit fa9fae1

4 files changed

Lines changed: 119 additions & 2 deletions

File tree

controllers/deployment/controller.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,16 @@ import (
1414
"github.com/metal-stack/firewall-controller-manager/api/v2/defaults"
1515
"github.com/metal-stack/firewall-controller-manager/api/v2/validation"
1616
"github.com/metal-stack/firewall-controller-manager/controllers"
17+
"github.com/metal-stack/firewall-controller-manager/controllers/monitor"
1718
)
1819

1920
type controller struct {
2021
c *config.ControllerConfig
2122
log logr.Logger
2223
lastSetCreation map[string]time.Time
2324
recorder record.EventRecorder
25+
26+
monitorScheduler *monitor.MonitorManagerScheduler
2427
}
2528

2629
func SetupWithManager(log logr.Logger, recorder record.EventRecorder, mgr ctrl.Manager, c *config.ControllerConfig) error {

controllers/deployment/delete.go

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

1111
func (c *controller) Delete(r *controllers.Ctx[*v2.FirewallDeployment]) error {
12+
c.monitorScheduler.Stop(r.Target)
13+
1214
ownedSets, _, err := controllers.GetOwnedResources(r.Ctx, c.c.GetSeedClient(), nil, r.Target, &v2.FirewallSetList{}, func(fsl *v2.FirewallSetList) []*v2.FirewallSet {
1315
return fsl.GetItems()
1416
})
@@ -21,8 +23,6 @@ func (c *controller) Delete(r *controllers.Ctx[*v2.FirewallDeployment]) error {
2123

2224
func (c *controller) deleteFirewallSets(r *controllers.Ctx[*v2.FirewallDeployment], sets ...*v2.FirewallSet) error {
2325
for _, set := range sets {
24-
set := set
25-
2626
if set.DeletionTimestamp != nil {
2727
r.Log.Info("deletion timestamp on firewall set already set", "firewall-name", set.Name)
2828
continue

controllers/deployment/reconcile.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package deployment
22

33
import (
4+
"context"
45
"fmt"
56
"strconv"
67
"time"
@@ -20,6 +21,13 @@ func (c *controller) Reconcile(r *controllers.Ctx[*v2.FirewallDeployment]) error
2021
return err
2122
}
2223

24+
go func() {
25+
err := c.monitorScheduler.StartIfNeeded(context.TODO(), r.Target)
26+
if err != nil {
27+
c.log.Error(err, "unable to start monitor scheduler")
28+
}
29+
}()
30+
2331
ownedSets, _, err := controllers.GetOwnedResources(r.Ctx, c.c.GetSeedClient(), nil, r.Target, &v2.FirewallSetList{}, func(fsl *v2.FirewallSetList) []*v2.FirewallSet {
2432
return fsl.GetItems()
2533
})
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package monitor
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"sync"
7+
"time"
8+
9+
"github.com/go-logr/logr"
10+
v2 "github.com/metal-stack/firewall-controller-manager/api/v2"
11+
"github.com/metal-stack/firewall-controller-manager/api/v2/config"
12+
"github.com/metal-stack/metal-lib/pkg/pointer"
13+
"k8s.io/apimachinery/pkg/runtime"
14+
ctrl "sigs.k8s.io/controller-runtime"
15+
"sigs.k8s.io/controller-runtime/pkg/cache"
16+
"sigs.k8s.io/controller-runtime/pkg/metrics/server"
17+
)
18+
19+
type deploymentRef struct {
20+
namespace string
21+
name string
22+
}
23+
24+
func deploymentRefTo(deploy *v2.FirewallDeployment) deploymentRef {
25+
return deploymentRef{
26+
namespace: deploy.Namespace,
27+
name: deploy.Name,
28+
}
29+
}
30+
31+
type MonitorManagerScheduler struct {
32+
m sync.RWMutex
33+
managers map[deploymentRef]context.CancelFunc
34+
35+
scheme *runtime.Scheme
36+
log logr.Logger
37+
cc *config.NewControllerConfig
38+
c *config.ControllerConfig
39+
}
40+
41+
func NewMonitorManagerState(log logr.Logger, c *config.ControllerConfig) *MonitorManagerScheduler {
42+
return &MonitorManagerScheduler{
43+
managers: make(map[deploymentRef]context.CancelFunc),
44+
}
45+
}
46+
47+
func (m *MonitorManagerScheduler) StartIfNeeded(ctx context.Context, deploy *v2.FirewallDeployment) error {
48+
m.m.Lock()
49+
defer m.m.Unlock()
50+
51+
if _, exists := m.managers[deploymentRefTo(deploy)]; exists {
52+
return nil
53+
}
54+
55+
ref := deploymentRefTo(deploy)
56+
log := m.log.WithValues("namespace", ref.namespace, "name", ref.name)
57+
58+
shootConfig, err := m.cc.ShootAccessHelper.RESTConfig(ctx) // TODO: adjust to fetch the kubeconfig
59+
if err != nil {
60+
return fmt.Errorf("unable to get shoot rest config %w", err)
61+
}
62+
63+
shootMgr, err := ctrl.NewManager(shootConfig, ctrl.Options{
64+
Scheme: m.scheme,
65+
Metrics: server.Options{
66+
BindAddress: "0",
67+
},
68+
LeaderElection: false,
69+
Cache: cache.Options{
70+
DefaultNamespaces: map[string]cache.Config{
71+
v2.FirewallShootNamespace: {},
72+
},
73+
},
74+
GracefulShutdownTimeout: pointer.Pointer(time.Duration(0)),
75+
})
76+
if err != nil {
77+
return fmt.Errorf("unable to start firewall-controller-manager-monitor %w", err)
78+
}
79+
80+
err = SetupWithManager(log, shootMgr, m.c)
81+
if err != nil {
82+
return fmt.Errorf("unable to setup firewall-controller-manager-monitor %w", err)
83+
}
84+
85+
shootCtx, cancel := context.WithCancel(ctx)
86+
87+
err = shootMgr.Start(shootCtx)
88+
if err != nil {
89+
cancel()
90+
return fmt.Errorf("unable to start firewall-controller-manager-monitor %w", err)
91+
}
92+
93+
m.managers[ref] = cancel
94+
return nil
95+
}
96+
97+
func (m *MonitorManagerScheduler) Stop(deploy *v2.FirewallDeployment) {
98+
m.m.Lock()
99+
defer m.m.Unlock()
100+
101+
cancel, exists := m.managers[deploymentRefTo(deploy)]
102+
if exists {
103+
cancel()
104+
delete(m.managers, deploymentRefTo(deploy))
105+
}
106+
}

0 commit comments

Comments
 (0)