2016-03-02 61 views
1

試圖編寫一個微服務來管理我的Openshift集羣上的圖像流。我閱讀了oc客戶端代碼,以瞭解如何閱讀我的kubeconfig並創建了Client通過Go客戶端API列出Openshift對象

我可以使用Kubernetes Client來獲得Kubernetes對象的請求,例如,豆莢,但我使用Openshift Client的任何請求返回一個空列表。

我還是Go的新手,所以我敢肯定我做錯了什麼。這是我到目前爲止:

package main 

import (
    "fmt" 
    "log" 

    "github.com/spf13/pflag" 

    kapi "k8s.io/kubernetes/pkg/api" 

    "github.com/openshift/origin/pkg/cmd/util/clientcmd" 
) 

func main() { 
    flags := pflag.FlagSet{} 
    factory := clientcmd.New(&flags) 
    osclient, kclient, err := factory.Clients() 
    if err != nil { 
     log.Fatalln("Error:", err) 
    } 

    config, _ := factory.ClientConfig() 
    fmt.Println("KClient config", config) 
    config, _ = factory.OpenShiftClientConfig.ClientConfig() 
    fmt.Println("OSClient config", config) 

    // Empty list! 
    projects, err := osclient.Projects().List(kapi.ListOptions{}) 
    if err != nil { 
     log.Println("Error:", err) 
    } else { 
     fmt.Println("Projects", projects, len(projects.Items)) 
    } 

    // Also empty list 
    buildconfigs, err := osclient.BuildConfigs("my-project").List(kapi.ListOptions{}) 
    if err != nil { 
     log.Println("Error:", err) 
    } else { 
     fmt.Println("Buildconfigs", buildconfigs, len(buildconfigs.Items)) 
    } 

    // Works! 
    pods, err := kclient.Pods("my-project").List(kapi.ListOptions{}) 
    if err != nil { 
     log.Println("Error:", err) 
    } else { 
     fmt.Println("Pods", len(pods.Items)) 
     for _, pod := range pods.Items { 
      fmt.Println(pod.ObjectMeta.Name) 
     } 
    } 

    // Permission error, as expected 
    namespaces, err := kclient.Namespaces().List(kapi.ListOptions{}) 
    if err != nil { 
     log.Println("Error:", err) 
    } else { 
     fmt.Println("Namespaces", namespaces, len(namespaces.Items)) 
    } 
} 

回答

2

你受到過如此接近並且問題是一個很小的一個:你需要包括以下附加導入:

import _ "github.com/openshift/origin/pkg/api/install" 

我並不完全清楚是什麼進口實際上做,但顯然它會導致必要需要鏈接到二進制文件中的附加功能,沒有這些功能,OpenShift客戶端無法工作(返回空列表)。

所有的OpenShift命令行工具,包括進口,並且寫了許多包括一些/所有的以下還有:

import (
    _ "github.com/openshift/origin/pkg/api/install" 
    _ "k8s.io/kubernetes/pkg/api/install" 
    _ "k8s.io/kubernetes/pkg/apis/autoscaling/install" 
    _ "k8s.io/kubernetes/pkg/apis/batch/install" 
    _ "k8s.io/kubernetes/pkg/apis/extensions/install" 
) 

最後,這裏是一個完整的代碼示例這對我的作品(更新對原產V3.6.0-α):

package main 

import (
    "fmt" 

    _ "github.com/openshift/origin/pkg/api/install" 
    "github.com/openshift/origin/pkg/cmd/util/clientcmd" 
    "github.com/spf13/pflag" 
    "k8s.io/apimachinery/pkg/apis/meta/v1" 
) 

func main() { 
    factory := clientcmd.New(pflag.CommandLine) 
    pflag.Parse() 

    oc, kc, err := factory.Clients() 
    if err != nil { 
     panic(err) 
    } 

    namespace, _, err := factory.DefaultNamespace() 
    if err != nil { 
     panic(err) 
    } 

    pods, err := kc.Core().Pods(namespace).List(v1.ListOptions{}) 
    if err != nil { 
     panic(err) 
    } 

    for _, pod := range pods.Items { 
     fmt.Printf("Pod: %s\n", pod.Name) 
    } 

    buildconfigs, err := oc.BuildConfigs(namespace).List(v1.ListOptions{}) 
    if err != nil { 
     panic(err) 
    } 

    for _, buildconfig := range buildconfigs.Items { 
     fmt.Printf("BuildConfig: %s\n", buildconfig.Name) 
    } 
} 

要運行這個例子,你現在需要的供應商OpenShift和它的依賴。一個非常哈克的方式做到這一點如下:

rm -rf vendor 
mkdir -p vendor/github.com/openshift/origin 
ln -s $GOPATH/src/github.com/openshift/origin/vendor/* vendor 
ln -s $GOPATH/src/github.com/openshift/origin/vendor/github.com/* vendor/github.com 
ln -s $GOPATH/src/github.com/openshift/origin/vendor/github.com/openshift/* vendor/github.com/openshift 
ln -s $GOPATH/src/github.com/openshift/origin/pkg vendor/github.com/openshift/origin 

最後,它的目的是做一個適當的獨立圍棋客戶端OpenShift - 積壓卡,這是在https://trello.com/c/PTDrY0GF/794-13-client-provide-go-client-similar-to-kubernetes

+0

上面的例子對於'go version go1.8.1 darwin/amd64'來說是失敗的。有這些錯誤:'#command-line-arguments ./load.go:14:不能使用「github.com/spf13/pflag".CommandLine(類型*」github.com/spf13/pflag「.FlagSet)作爲類型*「github.com/openshift/origin/vendor/github.com/spf13/pflag」.Flag設置參數爲「github.com/openshift/origin/pkg/cmd/util/clientcmd」。新增 ./load.go :17:分配計數不匹配:4 = 3' – Dan

+1

@丹,我已經更新了我的答案a)針對原始版本v3.6.0-alpha(解決了您的分配計數不匹配錯誤),以及b)給出了一種怪異的方式圍繞售貨問題開展工作。 HTH。 –

+0

謝謝。 Golang的出售部分仍然令我煩惱。這對臨時過程很有幫助! – Dan

0

當go客戶端代碼返回空列表並且沒有錯誤,這意味着沒有該類型的資源存在。你有什麼使用相同的kubeconfig文件並運行oc get projectsoc get bc

+0

我得到了我期望的對象。 –

相關問題