2017-12-20 7 views
0

私はkubernetisコントローラのテストを実装しています。 私はNewSimpleClientsetを使用しています。 私は単一のオブジェクトを受け取って、オブジェクトが通知者を介して正しく渡されているかどうかを確認します。k8s NewListWatchFromClientがNewSimpleClientsetでクラッシュする

私のテスト機能は、この

func Test_TestListInformer(t *testing.T) { 
    dpl := GenerateHelloWorldDeployment() 
    clientSet := fake.NewSimpleClientset(&dpl) 
    watchlist := cache.NewListWatchFromClient(clientSet.ExtensionsV1beta1().RESTClient(), "deployments", api_v1.NamespaceAll, fields.Everything()) 
    var expectedObj interface{} 

    resyncPeriod := 30 * time.Minute 

    _, eController := cache.NewInformer(
     watchlist, 
     &v1beta1.Deployment{}, 
     resyncPeriod, 
     cache.ResourceEventHandlerFuncs{ 
      AddFunc: func(obj interface{}) { 
       expectedObj = obj 
      }, 
      DeleteFunc: func(obj interface{}) { 
       expectedObj = obj 
      }, 
      UpdateFunc: func(oldObj interface{}, newObj interface{}) { 
       expectedObj = oldObj 
      }, 
     }, 
    ) 
    stopChan := make(chan struct{}) 
    go eController.Run(stopChan) 
    time.Sleep(time.Second) 
    close(stopChan) 


} 

のように、それはGenerateHelloWorldDeployment戻りが良好であることを

E1220 17:06:06.304112 35412 runtime.go:66] Observed a panic: "invalid memory address or nil pointer dereference" (runtime error: invalid memory address or nil pointer dereference) 
/Users/myuser/dev/go/src/github.com/myrepo/myproj/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go:72 
/Users/myuser/dev/go/src/github.com/myrepo/myproj/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go:65 
/Users/myuser/dev/go/src/github.com/myrepo/myproj/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go:51 
/usr/local/Cellar/go/1.9.2/libexec/src/runtime/asm_amd64.s:509 
/usr/local/Cellar/go/1.9.2/libexec/src/runtime/panic.go:491 
/usr/local/Cellar/go/1.9.2/libexec/src/runtime/panic.go:63 
/usr/local/Cellar/go/1.9.2/libexec/src/runtime/signal_unix.go:367 
/Users/myuser/dev/go/src/github.com/myrepo/myproj/vendor/k8s.io/client-go/rest/client.go:222 
/Users/myuser/dev/go/src/github.com/myrepo/myproj/vendor/k8s.io/client-go/rest/client.go:247 
/Users/myuser/dev/go/src/github.com/myrepo/myproj/vendor/k8s.io/client-go/tools/cache/listwatch.go:68 
/Users/myuser/dev/go/src/github.com/myrepo/myproj/vendor/k8s.io/client-go/tools/cache/listwatch.go:101 
/Users/myuser/dev/go/src/github.com/myrepo/myproj/vendor/k8s.io/client-go/tools/cache/reflector.go:249 
/Users/myuser/dev/go/src/github.com/myrepo/myproj/vendor/k8s.io/client-go/tools/cache/reflector.go:204 
/Users/myuser/dev/go/src/github.com/myrepo/myproj/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go:133 
/Users/myuser/dev/go/src/github.com/myrepo/myproj/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go:134 
/Users/myuser/dev/go/src/github.com/myrepo/myproj/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go:88 
/Users/myuser/dev/go/src/github.com//vendor/k8s.io/client-go/tools/cache/reflector.go:203 
/Users/myuser/dev/go/src/github.com/myrepo/myproj/vendor/k8s.io/client-go/tools/cache/controller.go:122 
/Users/myuser/dev/go/src/github.com/myrepo/myproj/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go:54 
/Users/myuser/dev/go/srmyrepo/myprojc/github.com/myrepo/myproj/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go:71 
/usr/local/Cellar/go/1.9.2/libexec/src/runtime/asm_amd64.s:2337 

展開オブジェクトをクラッシュ見えます。 私はそれを取得することができますclientSet.ExtensionsV1beta1().Deployments("").Get("hello-world-deployment",meta_v1.GetOptions{})

通報者はなぜクラッシュしますか?

+0

がところで、コードが正常に動作します「k8s.io/client-go/tools/cache/testing」から NewFakeControllerSourceを使用する必要があります。 – AlexS

+0

は完全なスタックトレースですか? – ramrunner

答えて

0

k8s go libは非常に把握が難しいです。自分自身を複製する多くのオブジェクトとインタフェース。

は、私は、実際のクラスタに接続されている実際のclientSetを作成する場合

dpl := GenerateFakeDeployment() 

watchlist := fcache.NewFakeControllerSource() 
watchlist.Add(&dpl) 

var expectedObj interface{} 

resyncPeriod := 30 * time.Minute 

_, eController := cache.NewInformer(
    watchlist, 
    &v1beta1.Deployment{}, 
    resyncPeriod, 
    cache.ResourceEventHandlerFuncs{ 
     AddFunc: func(obj interface{}) { 
      expectedObj = obj 
     }, 
     DeleteFunc: func(obj interface{}) { 
      expectedObj = obj 
     }, 
     UpdateFunc: func(oldObj interface{}, newObj interface{}) { 
      expectedObj = oldObj 
     }, 
    }, 
) 
stopChan := make(chan struct{}) 
go eController.Run(stopChan) 
関連する問題