/種類のバグ
/ sig api-machinery
@ kubernetes / sig-api-machinery-bugs
何が起こったのか:
私のカスタムリソースタイプにはステータスフィールドがあります。 genclientを使用してクライアントを生成しました。
これが私のCRDタイプの定義です:
// +genclient
// +k8s:openapi-gen=true
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type Recovery struct {
metav1.TypeMeta `json:",inline,omitempty"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec RecoverySpec `json:"spec,omitempty"`
Status RecoveryStatus `json:"status,omitempty"`
}
生成されたUpdateStatus()関数:
// UpdateStatus was generated because the type contains a Status member.
// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
func (c *recoveries) UpdateStatus(recovery *v1alpha1.Recovery) (result *v1alpha1.Recovery, err error) {
result = &v1alpha1.Recovery{}
err = c.client.Put().
Namespace(c.ns).
Resource("recoveries").
Name(recovery.Name).
SubResource("status").
Body(recovery).
Do().
Into(result)
return
}
ここで、Recoveryオブジェクト(stash-mduabx)に対してUpdateStatus()を呼び出すと、次のエラーが発生します。
the server could not find the requested resource (put recoveries.stash.appscode.com stash-mduabx)
そして、API呼び出しのログ:
PUT https://192.168.99.100:8443/apis/stash.appscode.com/v1alpha1/namespaces/test-stash/recoveries/stash-mduabx/status 404 Not Found in 11 milliseconds
あなたが起こると期待したこと:
ステータスフィールドを更新する必要があります。
それを再現する方法:
ステータスフィールドでCRDタイプを定義し、genclientを使用してそのクライアントを生成します。 kubectlを使用してそのタイプのオブジェクトを作成します。 次に、goプログラムからオブジェクトを取得し、オブジェクトに対してUpdateStatus()を呼び出します。
環境:
ステータスフィールドがあるため、クライアントはステータスメソッドを生成しますが、それはサーバーがそのメソッドをサポートしていることを意味するわけではありません。
https://github.com/kubernetes/community/pull/913は、CRDオブジェクトのステータスサブリソースのサーバーサポートを追加する提案です。
最も参考になるコメント
ステータスフィールドがあるため、クライアントはステータスメソッドを生成しますが、それはサーバーがそのメソッドをサポートしていることを意味するわけではありません。
https://github.com/kubernetes/community/pull/913は、CRDオブジェクトのステータスサブリソースのサーバーサポートを追加する提案です。