Openshift API query with Openshift/Client-go

7/20/2020

Im trying to list all the build configs in openshift with help of openshift/client-go

import (
	"context"
	"flag"
	"fmt"
	"os"
	"path/filepath"

	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/tools/clientcmd"

	buildv1 "github.com/openshift/client-go/build/clientset/versioned/typed/build/v1"
)

func main() {
	err := start()
	if err != nil {
		fmt.Fprintf(os.Stderr, "error: %v", err)
		os.Exit(1)
	}
}

func start() error {
	var kubeconfig *string
	if home := homeDir(); home != "" {
		kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
	} else {
		kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
	}
	flag.Parse()

	// use the current context in kubeconfig
	config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
	if err != nil {
		return err
	}

	buildV1Client, err := buildv1.NewForConfig(config)
	if err != nil {
		return err
	}

	namespace := "testproject"
	// get all builds
	builds, err := buildV1Client.Builds(namespace).List(context.TODO(), metav1.ListOptions{})
	if err != nil {
		return err
	}
	fmt.Printf("There are %d builds in project %s\n", len(builds.Items), namespace)
	// List names of all builds
	for i, build := range builds.Items {
		fmt.Printf("index %d: Name of the build: %s", i, build.Name)
	}
	return nil
}

func homeDir() string {
	if h := os.Getenv("HOME"); h != "" {
		return h
	}
	return os.Getenv("USERPROFILE") // windows
}

I have got all the dependencies via glide. glide.yaml glide update -v

package: .
import:
- package: github.com/openshift/client-go
  subpackages:
  - build/clientset/versioned/typed/build/v1
- package: k8s.io/apimachinery
  subpackages:
  - pkg/apis/meta/v1
- package: k8s.io/client-go
  subpackages:
  - tools/clientcmd

I see that all my packages are part of vendor. But I cant get the type changed to vendor config.

go run main.go
# command-line-arguments
./main.go:39:44: cannot use config (type *"k8s.io/client-go/rest".Config) as type *"github.com/openshift/client-go/vendor/k8s.io/client-go/rest".Config in argument to "github.com/openshift/client-go/build/clientset/versioned/typed/build/v1".NewForConfig
./main.go:46:88: cannot use "k8s.io/apimachinery/pkg/apis/meta/v1".ListOptions literal (type "k8s.io/apimachinery/pkg/apis/meta/v1".ListOptions) as type "github.com/openshift/client-go/vendor/k8s.io/apimachinery/pkg/apis/meta/v1".ListOptions in argument to buildV1Client.Builds(namespace).List

I have deleted the vendor directory in the current directory and made sure gopath have all the required dependencies as an alternative try, But that doesnt work. I also tried to link ~/go/src/github.com/openshift/client-go/vendor/* vendor but that doesnt seem to work.

I also tried the solution https://stackoverflow.com/questions/35760596/list-openshift-objects-via-go-client-api. Which did not work.

-- drc12345
client-go
go
kubernetes
openshift
openshift-client-tools

1 Answer

7/21/2020

glide is a bit outdated as of this writing. Its last release was 07/10/2019.

Since version 1.11 Golang came up with its native package management called go modules and that has become the more preferred way to manage dependencies. That's what manages your vendor directory and this is what github.com/openshift/client-go uses. I'm also assuming that you started from this main.go file.

Since everything under github.com/openshift/client-go has the dependencies already managed. I recommend 🎬:

go get github.com/openshift/client-go
cd $GOPATH/src/github.com/mygihubusername/myrepo
cp -R ../../openshift/client-go/* .
# put main.go here with your code or any of the subdirectories
# cd subdir 👈 if you put the main.go file under a subdir.
go build -o buildclient . 
# clean up any files you don't need
# create github repo
git add *
git commit -m 'My first commit'
git push origin master

Works for me. ✌️

-- Rico
Source: StackOverflow