
# 定义API
在设计的CR spec中，包含size、image、storage属性，因此需要修改api/v1/hwfka_types.go中HwfkaSpec和HwfkaStatus部分，为应用定义参数和状态属性。
```
package v1
import (
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// HwfkaSpec defines the desired state of Hwfka
type HwfkaSpec struct {
// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
// Important: Run "make" to regenerate code after modifying this file
// +kubebuilder:validation:Minimum=1
// +kubebuilder:validation:Maximum=3
// +kubebuilder:validation:ExclusiveMaximum=false  // 包含最大值
Size    int32        `json:"size"`    // Hwfka 应用包含的 broker 数量
Image   string       `json:"image"`   // Hwfka 镜像地址
Storage *StorageSpec `json:"storage"` // Hwfka 数据存储相关配置
}
type StorageSpec struct {
Class       string                            `json:"class"`
AccessModes corev1.PersistentVolumeAccessMode `json:"accessModes"`
Size        resource.Quantity                 `json:"size"`
// 华为公有云 EVS 场景需额外指定 diskType, region, zone
DiskType string `json:"diskType,omitempty"`  // omitempty 表示可以为空
Region   string `json:"region,omitempty"`
Zone     string `json:"zone,omitempty"`
}
// HwfkaStatus defines the observed state of Hwfka
type HwfkaStatus struct {
// INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
// Important: Run "make" to regenerate code after modifying this file
Phase  string `json:"phase,omitempty"`  // Hwfka 实例安装状态
Server string `json:"server,omitempty"` // Hwfka 访问地址
}
```
使用Kubebuilder，可通过在API结构的属性上定义[Markers](https://book.kubebuilder.io/reference/markers.html)，自动生成CRD中的spec.validation.openAPIV3Schema，即基于OpenAPI的校验规则，以便校验用户创建的CR中字段值的合法性。如上述设置size属性的最小值和最大值：
```
// +kubebuilder:validation:Minimum=1
// +kubebuilder:validation:Maximum=3
```
详细使用方法参见：[CRD Validation](https://book.kubebuilder.io/reference/markers/crd-validation.html)。每次修改API定义后，需要执行命令自动重新生成代码和CRD：
```
$ make generate
$ make manifests
```
