k8s自定义资源类型代码自动生成

用以下命令生成代码:

./generate-groups.sh all "github.com/openshift-evangelist/crd-code-generation/pkg/client" "github.com/openshift-evangelist/crd-code-generation/pkg/apis" "ingressgroup:v1"

第一个报错

生成代码报错:

Generating deepcopy funcs
F0910 19:18:35.552948   12153 main.go:82] Error: Failed making a parser: unable to add directory "github.com/openshift-evangelist/crd-code-generation/pkg/client": unable to import "github.com/asdfsx/getkubeconfig/pkg/apis/example/v1": cannot find package "github.com/openshift-evangelist/crd-code-generation/pkg/client" in any of:
        D:/Program Files/Go/go103/src/github.com/openshift-evangelist/crd-code-generation/pkg/client (from $GOROOT)
        D:/SoftwareAndProgram/program/Go/Development/src/github.com/openshift-evangelist/crd-code-generation/pkg/client (from $GOPATH)

这个问题可以参考issue

image.png

可以参考这个文章:
https://medium.com/@trstringer/create-kubernetes-controllers-for-core-and-custom-resources-62fc35ad64a3

由于该链接国内访问比较困难,故转载到了这里:
https://www.jianshu.com/p/dcfe6eac4152
总而言之,就是目录有问题。比如:

./generate-groups.sh all k8s.io/sample-controller/pkg/client k8s.io/sample-controller/pkg/apis samplecontroller:v1alpha1

那么k8s.io/sample-controller/pkg/apis目录下就需要有一个samplecontroller/v1alpha1的文件夹,最终生成的文件会被放到k8s.io/sample-controller/pkg/client目录下。

[root@10 code-generator]# ./generate-groups.sh all k8s.io/sample-controller/pkg/client k8s.io/sample-controller/pkg/apis samplecontroller:v1alpha1
Generating deepcopy funcs
Generating clientset for samplecontroller:v1alpha1 at k8s.io/sample-controller/pkg/client/clientset
Generating listers for samplecontroller:v1alpha1 at k8s.io/sample-controller/pkg/client/listers
Generating informers for samplecontroller:v1alpha1 at k8s.io/sample-controller/pkg/client/informers
[root@10 code-generator]# ll $GOPATH/src/k8s.io/sample-controller/pkg/
总用量 0
drwxr-xr-x 3 root root 30 4月  16 21:42 apis
drwxr-xr-x 5 root root 55 4月  16 21:58 client
[root@10 code-generator]# ll $GOPATH/src/k8s.io/sample-controller/pkg/apis/samplecontroller/v1alpha1/
总用量 8
-rw-r--r-- 1 root root 1462 4月  16 21:42 types.go
-rw-r--r-- 1 root root 3272 4月  16 21:57 zz_generated.deepcopy.go
[root@10 code-generator]# ll $GOPATH/src/k8s.io/sample-controller/pkg/client
总用量 0
drwxr-xr-x 3 root root 23 4月  16 21:57 clientset
drwxr-xr-x 3 root root 30 4月  16 21:58 informers
drwxr-xr-x 3 root root 30 4月  16 21:58 listers

第二个报错:

Generating deepcopy funcs
F1104 02:57:44.419529      35 main.go:82] Error: Failed executing generator: some packages had errors:
type "k8s.io/apimachinery/pkg/runtime.Object" in k8s:deepcopy-gen:interfaces tag of type k8s.io/apimachinery/pkg/runtime.Object is not an interface, but: ""
goroutine 1 [running]:

这个报错是因为k8s.io/apimachinery这个包目录结构不对,放到vendor目录下找不到,必须放到$GOPATH下的src/k8s.io/apimachinery,具体参考issue

image.png

我解决了这个问题 。这不起作用,除非k8s.io/apimachinery在GOPATH中,如果它只是在vendor目录下,那么deepcopy无法找到它。至少,这需要在某处记录。如果在vendor目录下也能正常工作,那将会很棒。

目录结构如下:
$GOPATH/src


image.png

$GOPATH/src/github.com/


image.png

第三个报错

image.png
Generating deepcopy funcs
F0221 09:54:08.335328   26316 main.go:82] Error: Failed executing generator: som                                          e packages had errors:
errors in package "github.com/openshift-evangelist/crd-code-generation/pkg/apis/                                          ingressgroup/v1":
unable to format file "D:\\SoftwareAndProgram\\program\\Go\\Development\\src\\gi                                          thub.com\\openshift-evangelist\\crd-code-generation\\pkg\\apis\\ingressgroup\\v1                                          \\zz_generated.deepcopy.go" (The filename, directory name, or volume label synta                                          x is incorrect.).

windows上执行报这个错,需要在linux上执行generate-groups.sh 脚本。

最终生成如下:

image.png
[root@master-192 code-generator]# dos2unix generate-groups.sh 
dos2unix: converting file generate-groups.sh to Unix format ...
[root@master-192 code-generator]# ./generate-groups.sh all "github.com/openshift-evangelist/crd-code-generation/pkg/client" "github.com/openshift-evangelist/crd-code-generation/pkg/apis" "ingressgroup:v1"
Generating deepcopy funcs
Generating clientset for ingressgroup:v1 at github.com/openshift-evangelist/crd-code-generation/pkg/client/clientset
Generating listers for ingressgroup:v1 at github.com/openshift-evangelist/crd-code-generation/pkg/client/listers
Generating informers for ingressgroup:v1 at github.com/openshift-evangelist/crd-code-generation/pkg/client/informers

最终生成目录结构如下:

[root@master-192 crd-code-generation]# pwd
/root/Work/programmer/go/gopath/src/github.com/openshift-evangelist/crd-code-generation
[root@master-192 crd-code-generation]# tree
.
└── pkg
    ├── apis
    │   └── ingressgroup
    │       ├── register.go
    │       └── v1
    │           ├── doc.go
    │           ├── register.go
    │           ├── types.go
    │           └── zz_generated.deepcopy.go
    └── client
        ├── clientset
        │   └── versioned
        │       ├── clientset.go
        │       ├── doc.go
        │       ├── fake
        │       │   ├── clientset_generated.go
        │       │   ├── doc.go
        │       │   └── register.go
        │       ├── scheme
        │       │   ├── doc.go
        │       │   └── register.go
        │       └── typed
        │           └── ingressgroup
        │               └── v1
        │                   ├── doc.go
        │                   ├── fake
        │                   │   ├── doc.go
        │                   │   ├── fake_ingressgroup_client.go
        │                   │   └── fake_ingressgroup.go
        │                   ├── generated_expansion.go
        │                   ├── ingressgroup_client.go
        │                   └── ingressgroup.go
        ├── informers
        │   └── externalversions
        │       ├── factory.go
        │       ├── generic.go
        │       ├── ingressgroup
        │       │   ├── interface.go
        │       │   └── v1
        │       │       ├── ingressgroup.go
        │       │       └── interface.go
        │       └── internalinterfaces
        │           └── factory_interfaces.go
        └── listers
            └── ingressgroup
                └── v1
                    ├── expansion_generated.go
                    └── ingressgroup.go
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容