Skip to content

Instantly share code, notes, and snippets.

@alexeldeib
Last active January 16, 2020 22:41
Show Gist options
  • Save alexeldeib/cf227e7847d0a085aac19837a702868e to your computer and use it in GitHub Desktop.
Save alexeldeib/cf227e7847d0a085aac19837a702868e to your computer and use it in GitHub Desktop.
Discover all GVKs for controller
/*
Copyright 2020 Alexander Eldeib.
*/
package main
import (
"flag"
"os"
examplev1alpha1 "github.com/alexeldeib/watchall/api/v1alpha1"
"github.com/alexeldeib/watchall/controllers"
"github.com/sanity-io/litter"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/discovery"
"k8s.io/client-go/discovery/cached/memory"
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
"k8s.io/client-go/restmapper"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/log/zap"
// +kubebuilder:scaffold:imports
)
var (
scheme = runtime.NewScheme()
setupLog = ctrl.Log.WithName("setup")
)
func init() {
_ = clientgoscheme.AddToScheme(scheme)
_ = examplev1alpha1.AddToScheme(scheme)
// +kubebuilder:scaffold:scheme
}
func main() {
var metricsAddr string
var enableLeaderElection bool
flag.StringVar(&metricsAddr, "metrics-addr", ":8080", "The address the metric endpoint binds to.")
flag.BoolVar(&enableLeaderElection, "enable-leader-election", false,
"Enable leader election for controller manager. Enabling this will ensure there is only one active controller manager.")
flag.Parse()
ctrl.SetLogger(zap.New(func(o *zap.Options) {
o.Development = true
}))
restconfig := ctrl.GetConfigOrDie()
d := discovery.NewDiscoveryClientForConfigOrDie(restconfig)
dc := memory.NewMemCacheClient(d)
_, apiResourceList, err := dc.ServerGroupsAndResources()
if err != nil {
setupLog.Error(err, "failed to fetch api groups and resources")
}
gvrs, err := discovery.GroupVersionResources(apiResourceList)
if err != nil {
setupLog.Error(err, "failed to convert api resource list to gvr")
}
mapper := restmapper.NewDeferredDiscoveryRESTMapper(dc)
var gvks []schema.GroupVersionKind
for gvr := range gvrs {
if strings.Contains(gvr.Resource, "/") {
setupLog.Info("skipping gvr which is likely subresource", "gvr", gvr)
continue
}
gvk, err := mapper.KindFor(gvr)
if err != nil {
setupLog.Error(err, "failed to map gvr to gvk")
}
gvks = append(gvks, gvk)
}
for i := range gvks {
litter.Dump(gvks[i])
}
mgr, err := ctrl.NewManager(restconfig, ctrl.Options{
Scheme: scheme,
MetricsBindAddress: metricsAddr,
LeaderElection: enableLeaderElection,
Port: 9443,
})
if err != nil {
setupLog.Error(err, "unable to start manager")
os.Exit(1)
}
if err = (&controllers.GenericReconciler{
Client: mgr.GetClient(),
Log: ctrl.Log.WithName("controllers").WithName("Generic"),
Scheme: mgr.GetScheme(),
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "Generic")
os.Exit(1)
}
// +kubebuilder:scaffold:builder
setupLog.Info("starting manager")
if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
setupLog.Error(err, "problem running manager")
os.Exit(1)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment