Chapter 02

テストを書く準備をしよう

zoetro
zoetro
2022.08.22に更新

Kubebuilderを利用してKubernetes Operatorのひな形を生成する

Kubebuilderを利用して、Kubernetes Operatorのひな形を生成します。
まずは、以下のページを参考にKubebuilderをインストールしてください。

https://book.kubebuilder.io/quick-start.html

次に下記のコマンドでひな形を生成します。

$ kubebuilder init --domain zoetrope.github.io --repo github.com/zoetrope/test-controller
$ kubebuilder create api --group test --version v1 --kind Sample
$ kubebuilder create webhook --group test --version v1 --kind Sample --programmatic-validation --defaulting

$ make generate
$ make manifests

ここではKubebuilderについて説明しないので、詳しく知りたい場合は以下のページをご覧ください。

https://zoetrope.github.io/kubebuilder-training/

なお、本書で紹介しているコードは以下のリポジトリにおいてあるので、cloneして利用することもできます。

https://github.com/zoetrope/test-controller

Ginkgo v2へのアップグレード

Kubebuilder v3.6.0(2022/08/03リリース)は、Ginkgo v2に対応していません[1]
しかし、Ginkgo v1はすでに開発が終了していますし、v2には便利な機能が多数導入されているので、アップグレードすることをおすすめします。

まず最初に、api/v1/webhook_suite_test.gocontrollers/suite_test.goのimport文の "github.com/onsi/ginkgo""github.com/onsi/ginkgo/v2" に変更します。
v1とv2が混在していると正しく動作しないので、必ずすべてv2に変更してください。

- 	. "github.com/onsi/ginkgo"
+ 	. "github.com/onsi/ginkgo/v2"

次に、api/v1/webhook_suite_test.gocontrollers/suite_test.goRunSpecsWithDefaultAndCustomReportersRunSpecsに書き換えます。

- 	RunSpecsWithDefaultAndCustomReporters(t,
- 		"Webhook Suite",
- 		[]Reporter{printer.NewlineReporter{}})
+ 	RunSpecs(t, "Webhook Suite")

printer.NewlineReporterは、go-junit-reportで発生する問題を回避するために利用されていたのですが、この問題はすでに解決されている[2]ので上記のように書き換えてしまっても問題ありません。

続いて、api/v1/webhook_suite_test.gocontrollers/suite_test.goのBeforeSuiteのタイムアウト指定をやめます。

var _ = BeforeSuite(func() {
	~中略~
- }, 60)
+ })

実はこのタイムアウト設定は正しく動作していなかった[3]ので、削除してしまっても問題ありません。

以上の修正をおこなった後、go mod tidyコマンドを実行し、make testでテストが実行できることを確認してください。

実際の修正コミットは以下のようになります。

https://github.com/zoetrope/test-controller/pull/1/commits/a224edcc4cf1c9f9d508cf0250e494c93dd679f6

Ginkgo CLIの利用

Kubebuilderが生成したMakefileでは、以下のようにgo testコマンドを利用してテストを実行しています。

test: manifests generate fmt vet envtest ## Run tests.
	KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test ./... -coverprofile cover.out

しかし、go testではGinkgoが提供しているオプションのうちいくつか使えないものがあります。
そこでGinkgo CLIを使うようにMakefileを以下のように書き換えましょう。

test: manifests generate fmt vet envtest ginkgo ## Run tests.
	KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" $(GINKGO) -r --cover --coverprofile cover.out

GINKGO ?= $(LOCALBIN)/ginkgo
GINKGO_VERSION ?= v2.1.4

.PHONY: ginkgo
ginkgo: $(GINKGO) ## Download controller-gen locally if necessary.
$(GINKGO): $(LOCALBIN)
	test -s $(LOCALBIN)/ginkgo || GOBIN=$(LOCALBIN) go install github.com/onsi/ginkgo/v2/ginkgo@$(GINKGO_VERSION)

変更後、make testでテストが実行できることを確認してください。

実際の修正コミットは以下のようになります。

https://github.com/zoetrope/test-controller/pull/1/commits/bb5cb2783d2ba6a00863bb8ef19803db004ff59d
脚注
  1. go/v4 pluginで対応される予定です: https://github.com/kubernetes-sigs/kubebuilder/issues/2532 ↩︎

  2. https://github.com/kubernetes/kubernetes/pull/110319 ↩︎

  3. https://github.com/onsi/ginkgo/issues/882 ↩︎