doushan6161 2017-12-20 15:25
浏览 236

k8s NewListWatchFromClient与NewSimpleClientset一起崩溃

I am implementing tests for my kubernetis controller. I'm using NewSimpleClientset. I want to receive a single object to see whether objects are passed properly through informer.

My Test function looks like this

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)


}

it crashes

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

Deployment object that GenerateHelloWorldDeployment returns is good. I can retrive it with clientSet.ExtensionsV1beta1().Deployments("").Get("hello-world-deployment",meta_v1.GetOptions{})

Why does the informer crash?

  • 写回答

1条回答 默认 最新

  • dsigh7478 2018-01-14 08:46
    关注

    Figured it out. k8s go lib is very hard to grasp. Lots of objects and interfaces, that duplicate themselves.

    You have to use NewFakeControllerSource from "k8s.io/client-go/tools/cache/testing"

    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)
    
    评论

报告相同问题?

悬赏问题

  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程