Skip to content

Instantly share code, notes, and snippets.

@liggitt
Last active May 8, 2025 20:41
Show Gist options
  • Save liggitt/72452981b964f942c2fa7cb1cd43fab7 to your computer and use it in GitHub Desktop.
Save liggitt/72452981b964f942c2fa7cb1cd43fab7 to your computer and use it in GitHub Desktop.
discovery_dynamic_client.go
package main
import (
"context"
"fmt"
"os"
"path/filepath"
"k8s.io/klog/v2"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/discovery"
cacheddiscovery "k8s.io/client-go/discovery/cached/memory"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/rest"
"k8s.io/client-go/restmapper"
"k8s.io/client-go/tools/clientcmd"
)
func main() {
// Enable trace logging of requests / responses to see config loading, discovery requests, and the API request
var level klog.Level
if err := level.Set("8"); err != nil {
checkErr(err)
}
clientConfig, err := getClientConfig()
checkErr(err)
dynamicClient, err := dynamic.NewForConfig(clientConfig)
checkErr(err)
discoveryClient, err := discovery.NewDiscoveryClientForConfig(clientConfig)
checkErr(err)
// use discovery information to find what versions the server has available
discoveryRESTMapper := restmapper.NewDeferredDiscoveryRESTMapper(cacheddiscovery.NewMemCacheClient(discoveryClient))
desiredGroupResource := schema.GroupVersionResource{Group: "apps", Resource: "deployments"}
availableGroupResourceVersions, err := discoveryRESTMapper.ResourcesFor(desiredGroupResource)
checkErr(err)
if len(availableGroupResourceVersions) == 0 {
fmt.Printf("no versions of %v available\n", desiredGroupResource)
} else {
fmt.Printf("resolved %v to %v\n", desiredGroupResource, availableGroupResourceVersions[0])
items, err := dynamicClient.Resource(availableGroupResourceVersions[0]).List(context.TODO(), metav1.ListOptions{})
checkErr(err)
fmt.Printf("found %d items for %v\n", len(items.Items), availableGroupResourceVersions[0])
}
}
func getClientConfig() (*rest.Config, error) {
// build client config from $KUBECONFIG or default location
kubeconfigPath := os.Getenv("KUBECONFIG")
if kubeconfigPath == "" {
homeDir, err := os.UserHomeDir()
if err != nil {
panic(err)
}
kubeconfigPath = filepath.Join(homeDir, ".kube", "kubeconfig")
}
return clientcmd.BuildConfigFromFlags("", kubeconfigPath)
}
func checkErr(err error) {
if err != nil {
fmt.Println(err)
os.Exit(1)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment