Last active
January 16, 2020 22:41
-
-
Save alexeldeib/cf227e7847d0a085aac19837a702868e to your computer and use it in GitHub Desktop.
Discover all GVKs for controller
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
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