Last active
May 8, 2025 20:41
-
-
Save liggitt/72452981b964f942c2fa7cb1cd43fab7 to your computer and use it in GitHub Desktop.
discovery_dynamic_client.go
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
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