multi-tenant: EnsureNamespaceSA + ns_watcher SA provisioning (v8)
This commit is contained in:
@@ -0,0 +1,132 @@
|
||||
import re
|
||||
|
||||
# ── envwatcher.go ─────────────────────────────────────────────────────────────
|
||||
with open("/home/naeel/terra/fission-src/pkg/buildermgr/envwatcher.go") as f:
|
||||
src = f.read()
|
||||
|
||||
# добавляем genInformer import если нет
|
||||
if "genInformer" not in src:
|
||||
src = src.replace(
|
||||
'"github.com/fission/fission/pkg/generated/clientset/versioned"',
|
||||
'"github.com/fission/fission/pkg/generated/clientset/versioned"\n\t'
|
||||
'genInformer "github.com/fission/fission/pkg/generated/informers/externalversions"',
|
||||
1
|
||||
)
|
||||
|
||||
# добавляем fmt если нет
|
||||
if '"fmt"' not in src:
|
||||
src = src.replace('"context"', '"context"\n\t"fmt"', 1)
|
||||
|
||||
addon = r'''
|
||||
// AddNamespace dynamically registers a new namespace in environmentWatcher.
|
||||
// Creates a per-NS Environment informer. Safe to call repeatedly — deduplicates via nsResolver.
|
||||
func (envw *environmentWatcher) AddNamespace(ctx context.Context, ns string, mgr manager.Interface) {
|
||||
if !envw.nsResolver.AddNamespace(ns) {
|
||||
return // already registered
|
||||
}
|
||||
envw.logger.Info("buildermgr.envWatcher.AddNamespace: setting up informer", zap.String("namespace", ns))
|
||||
|
||||
factory := genInformer.NewFilteredSharedInformerFactory(envw.fissionClient, 30*time.Minute, ns, nil)
|
||||
envInf := factory.Core().V1().Environments().Informer()
|
||||
|
||||
_, err := envInf.AddEventHandler(k8sCache.ResourceEventHandlerFuncs{
|
||||
AddFunc: func(obj interface{}) {
|
||||
envObj := obj.(*fv1.Environment)
|
||||
envw.AddUpdateBuilder(ctx, envObj)
|
||||
},
|
||||
UpdateFunc: func(oldObj interface{}, newObj interface{}) {
|
||||
oldEnvObj := oldObj.(*fv1.Environment)
|
||||
newEnvObj := newObj.(*fv1.Environment)
|
||||
if oldEnvObj.ResourceVersion == newEnvObj.ResourceVersion {
|
||||
return
|
||||
}
|
||||
envw.AddUpdateBuilder(ctx, newEnvObj)
|
||||
},
|
||||
DeleteFunc: func(obj interface{}) {
|
||||
envObj, ok := obj.(*fv1.Environment)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
envw.deleteBuilder(ctx, envObj)
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
envw.logger.Error("buildermgr.envWatcher.AddNamespace: add handler failed",
|
||||
zap.String("namespace", ns), zap.Error(fmt.Errorf("%w", err)))
|
||||
return
|
||||
}
|
||||
|
||||
envw.envWatchInformer[ns] = envInf
|
||||
mgr.AddInformers(ctx, map[string]k8sCache.SharedIndexInformer{ns: envInf})
|
||||
envw.logger.Info("buildermgr.envWatcher.AddNamespace: done", zap.String("namespace", ns))
|
||||
}
|
||||
'''
|
||||
|
||||
with open("/home/naeel/terra/fission-src/pkg/buildermgr/envwatcher.go", "w") as f:
|
||||
f.write(src + addon)
|
||||
print("envwatcher.go: done")
|
||||
|
||||
# ── pkgwatcher.go ─────────────────────────────────────────────────────────────
|
||||
with open("/home/naeel/terra/fission-src/pkg/buildermgr/pkgwatcher.go") as f:
|
||||
src = f.read()
|
||||
|
||||
# добавляем genInformer import если нет
|
||||
if "genInformer" not in src:
|
||||
src = src.replace(
|
||||
'"github.com/fission/fission/pkg/generated/clientset/versioned"',
|
||||
'"github.com/fission/fission/pkg/generated/clientset/versioned"\n\t'
|
||||
'genInformer "github.com/fission/fission/pkg/generated/informers/externalversions"',
|
||||
1
|
||||
)
|
||||
|
||||
# добавляем fmt если нет
|
||||
if '"fmt"' not in src:
|
||||
src = src.replace('"context"', '"context"\n\t"fmt"', 1)
|
||||
|
||||
# Добавляем k8sInformers если нет
|
||||
if "k8sInformers" not in src:
|
||||
src = src.replace(
|
||||
'"k8s.io/client-go/kubernetes"',
|
||||
'"k8s.io/client-go/kubernetes"\n\tk8sInformers "k8s.io/client-go/informers"',
|
||||
1
|
||||
)
|
||||
|
||||
addon2 = r'''
|
||||
// AddNamespace dynamically registers a new namespace in packageWatcher.
|
||||
// Creates per-NS Package and Pod informers. Safe to call repeatedly.
|
||||
func (pkgw *packageWatcher) AddNamespace(ctx context.Context, ns string, mgr manager.Interface) {
|
||||
if !pkgw.nsResolver.AddNamespace(ns) {
|
||||
return // already registered
|
||||
}
|
||||
pkgw.logger.Info("buildermgr.pkgWatcher.AddNamespace: setting up informers", zap.String("namespace", ns))
|
||||
|
||||
// Package informer
|
||||
fissionFactory := genInformer.NewFilteredSharedInformerFactory(pkgw.fissionClient, 30*time.Minute, ns, nil)
|
||||
pkgInf := fissionFactory.Core().V1().Packages().Informer()
|
||||
|
||||
_, err := pkgInf.AddEventHandler(pkgw.packageInformerHandler(ctx))
|
||||
if err != nil {
|
||||
pkgw.logger.Error("buildermgr.pkgWatcher.AddNamespace: pkg handler failed",
|
||||
zap.String("namespace", ns), zap.Error(fmt.Errorf("%w", err)))
|
||||
return
|
||||
}
|
||||
|
||||
// Pod informer for build logs
|
||||
podFactory := k8sInformers.NewSharedInformerFactoryWithOptions(pkgw.k8sClient, 30*time.Minute,
|
||||
k8sInformers.WithNamespace(ns))
|
||||
podInf := podFactory.Core().V1().Pods().Informer()
|
||||
|
||||
pkgw.pkgInformer[ns] = pkgInf
|
||||
pkgw.podInformer[ns] = podInf
|
||||
|
||||
mgr.AddInformers(ctx, map[string]k8sCache.SharedIndexInformer{
|
||||
ns + "/pkg": pkgInf,
|
||||
ns + "/pod": podInf,
|
||||
})
|
||||
pkgw.logger.Info("buildermgr.pkgWatcher.AddNamespace: done", zap.String("namespace", ns))
|
||||
}
|
||||
'''
|
||||
|
||||
with open("/home/naeel/terra/fission-src/pkg/buildermgr/pkgwatcher.go", "w") as f:
|
||||
f.write(src + addon2)
|
||||
print("pkgwatcher.go: done")
|
||||
Reference in New Issue
Block a user