Skip to content

Commit 295d347

Browse files
authored
refactor: Apply kubebuilder annotations for required/optional everywhere (#604)
Following advice from an upstream PR to explicitly mark fields as optional/required to ensure there are no surprises/bugs that arise through tooling. Also, add API conventions doc to contributing section for reference.
1 parent c0acfbd commit 295d347

30 files changed

+320
-181
lines changed

api/v1alpha1/addon_types.go

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -57,19 +57,19 @@ const (
5757
)
5858

5959
type Addons struct {
60-
// +optional
60+
// +kubebuilder:validation:Optional
6161
CNI *CNI `json:"cni,omitempty"`
6262

63-
// +optional
63+
// +kubebuilder:validation:Optional
6464
NFD *NFD `json:"nfd,omitempty"`
6565

66-
// +optional
66+
// +kubebuilder:validation:Optional
6767
ClusterAutoscaler *ClusterAutoscaler `json:"clusterAutoscaler,omitempty"`
6868

69-
// +optional
69+
// +kubebuilder:validation:Optional
7070
CCM *CCM `json:"ccm,omitempty"`
7171

72-
// +optional
72+
// +kubebuilder:validation:Optional
7373
CSIProviders *CSI `json:"csi,omitempty"`
7474

7575
// +optional
@@ -81,16 +81,19 @@ type AddonStrategy string
8181
// CNI required for providing CNI configuration.
8282
type CNI struct {
8383
// CNI provider to deploy.
84+
// +kubebuilder:validation:Required
8485
// +kubebuilder:validation:Enum=Calico;Cilium
8586
Provider string `json:"provider"`
8687
// Addon strategy used to deploy the CNI provider to the workload cluster.
88+
// +kubebuilder:validation:Required
8789
// +kubebuilder:validation:Enum=ClusterResourceSet;HelmAddon
8890
Strategy AddonStrategy `json:"strategy"`
8991
}
9092

9193
// NFD tells us to enable or disable the node feature discovery addon.
9294
type NFD struct {
9395
// Addon strategy used to deploy Node Feature Discovery (NFD) to the workload cluster.
96+
// +kubebuilder:validation:Required
9497
// +kubebuilder:validation:Enum=ClusterResourceSet;HelmAddon
9598
Strategy AddonStrategy `json:"strategy"`
9699
}
@@ -99,71 +102,81 @@ type NFD struct {
99102
type ClusterAutoscaler struct {
100103
// Addon strategy used to deploy cluster-autoscaler to the management cluster
101104
// targeting the workload cluster.
105+
// +kubebuilder:validation:Required
102106
// +kubebuilder:validation:Enum=ClusterResourceSet;HelmAddon
103107
Strategy AddonStrategy `json:"strategy"`
104108
}
105109

106110
type DefaultStorage struct {
107111
// Name of the CSI Provider for the default storage class.
112+
// +kubebuilder:validation:Required
108113
// +kubebuilder:validation:Enum=aws-ebs;nutanix
109114
ProviderName string `json:"providerName"`
115+
110116
// Name of storage class config in any of the provider objects.
117+
// +kubebuilder:validation:Required
118+
// +kubebuilder:validation:MinLength=1
111119
StorageClassConfigName string `json:"storageClassConfigName"`
112120
}
113121

114122
type CSI struct {
115-
// +optional
123+
// +kubebuilder:validation:Optional
116124
Providers []CSIProvider `json:"providers,omitempty"`
117-
// +optional
125+
126+
// +kubebuilder:validation:Optional
118127
DefaultStorage *DefaultStorage `json:"defaultStorage,omitempty"`
119128
}
120129

121130
type CSIProvider struct {
122131
// Name of the CSI Provider.
132+
// +kubebuilder:validation:Required
123133
// +kubebuilder:validation:Enum=aws-ebs;nutanix
124134
Name string `json:"name"`
125135

126-
// +optional
136+
// +kubebuilder:validation:Optional
127137
StorageClassConfig []StorageClassConfig `json:"storageClassConfig,omitempty"`
128138

129139
// Addon strategy used to deploy the CSI provider to the workload cluster.
140+
// +kubebuilder:validation:Required
130141
// +kubebuilder:validation:Enum=ClusterResourceSet;HelmAddon
131142
Strategy AddonStrategy `json:"strategy"`
132143

133144
// The reference to any secret used by the CSI Provider.
134-
// +optional
135-
Credentials *corev1.LocalObjectReference `json:"credentials,omitempty"`
145+
// +kubebuilder:validation:Optional
146+
Credentials *LocalObjectReference `json:"credentials,omitempty"`
136147
}
137148

138149
type StorageClassConfig struct {
139150
// Name of storage class config.
151+
// +kubebuilder:validation:Required
152+
// +kubebuilder:validation:MinLength=1
140153
Name string `json:"name"`
141154

142155
// Parameters passed into the storage class object.
143-
// +optional
156+
// +kubebuilder:validation:Optional
144157
Parameters map[string]string `json:"parameters,omitempty"`
145158

159+
// +kubebuilder:validation:Optional
146160
// +kubebuilder:validation:Enum=Delete;Retain;Recycle
147161
// +kubebuilder:default=Delete
148-
// +optional
149-
ReclaimPolicy corev1.PersistentVolumeReclaimPolicy `json:"reclaimPolicy,omitempty"`
162+
ReclaimPolicy *corev1.PersistentVolumeReclaimPolicy `json:"reclaimPolicy,omitempty"`
150163

151164
// +kubebuilder:validation:Enum=Immediate;WaitForFirstConsumer
165+
// +kubebuilder:validation:Optional
152166
// +kubebuilder:default=WaitForFirstConsumer
153-
// +optional
154-
VolumeBindingMode storagev1.VolumeBindingMode `json:"volumeBindingMode,omitempty"`
167+
VolumeBindingMode *storagev1.VolumeBindingMode `json:"volumeBindingMode,omitempty"`
155168

156169
// If the storage class should allow volume expanding
170+
// +kubebuilder:validation:Optional
157171
// +kubebuilder:default=false
158-
// +optional
159172
AllowExpansion bool `json:"allowExpansion,omitempty"`
160173
}
161174

162175
// CCM tells us to enable or disable the cloud provider interface.
163176
type CCM struct {
164177
// A reference to the Secret for credential information for the target Prism Central instance
165-
// +optional
166-
Credentials *corev1.LocalObjectReference `json:"credentials,omitempty"`
178+
// +kubebuilder:validation:Optional
179+
Credentials *LocalObjectReference `json:"credentials,omitempty"`
167180
}
168181

169182
type ServiceLoadBalancer struct {

api/v1alpha1/aws_clusterconfig_types.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,32 @@ import (
99

1010
type AWSSpec struct {
1111
// AWS region to create cluster in.
12-
// +optional
12+
// +kubebuilder:validation:Optional
1313
Region *Region `json:"region,omitempty"`
14+
1415
// AWS network configuration.
15-
// +optional
16+
// +kubebuilder:validation:Optional
1617
Network *AWSNetwork `json:"network,omitempty"`
17-
// +optional
18+
19+
// +kubebuilder:validation:Optional
1820
ControlPlaneLoadBalancer *AWSLoadBalancerSpec `json:"controlPlaneLoadBalancer,omitempty"`
1921
}
2022

2123
type Region string
2224

2325
type AWSNetwork struct {
24-
// +optional
26+
// +kubebuilder:validation:Optional
2527
VPC *VPC `json:"vpc,omitempty"`
2628

2729
// AWS Subnet configuration.
28-
// +optional
30+
// +kubebuilder:validation:Optional
2931
Subnets Subnets `json:"subnets,omitempty"`
3032
}
3133

3234
type VPC struct {
3335
// Existing VPC ID to use for the cluster.
36+
// +kubebuilder:validation:Required
37+
// +kubebuilder:validation:MinLength=1
3438
ID string `json:"id"`
3539
}
3640

@@ -39,14 +43,16 @@ type Subnets []SubnetSpec
3943
// SubnetSpec configures an AWS Subnet.
4044
type SubnetSpec struct {
4145
// Existing Subnet ID to use for the cluster.
46+
// +kubebuilder:validation:Required
47+
// +kubebuilder:validation:MinLength=1
4248
ID string `json:"id"`
4349
}
4450

4551
// AWSLoadBalancerSpec configures an AWS control-plane LoadBalancer.
4652
type AWSLoadBalancerSpec struct {
4753
// Scheme sets the scheme of the load balancer.
54+
// +kubebuilder:validation:Optional
4855
// +kubebuilder:default=internet-facing
4956
// +kubebuilder:validation:Enum=internet-facing;internal
50-
// +optional
5157
Scheme *capav1.ELBScheme `json:"scheme,omitempty"`
5258
}

api/v1alpha1/aws_node_types.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,26 @@ package v1alpha1
55

66
type AWSControlPlaneNodeSpec struct {
77
// The IAM instance profile to use for the cluster Machines.
8+
// +kubebuilder:validation:Optional
89
// +kubebuilder:default=control-plane.cluster-api-provider-aws.sigs.k8s.io
9-
// +optional
1010
IAMInstanceProfile string `json:"iamInstanceProfile,omitempty"`
1111

12+
// +kubebuilder:validation:Optional
1213
// +kubebuilder:default=m5.xlarge
13-
// +optional
1414
InstanceType string `json:"instanceType,omitempty"`
1515

1616
AWSGenericNodeSpec `json:",inline"`
1717
}
1818

1919
type AWSWorkerNodeSpec struct {
2020
// The IAM instance profile to use for the cluster Machines.
21+
// +kubebuilder:validation:Optional
2122
// +kubebuilder:default=nodes.cluster-api-provider-aws.sigs.k8s.io
22-
// +optional
2323
IAMInstanceProfile string `json:"iamInstanceProfile,omitempty"`
2424

2525
// The AWS instance type to use for the cluster Machines.
26+
// +kubebuilder:validation:Optional
2627
// +kubebuilder:default=m5.2xlarge
27-
// +optional
2828
InstanceType string `json:"instanceType,omitempty"`
2929

3030
AWSGenericNodeSpec `json:",inline"`
@@ -33,43 +33,43 @@ type AWSWorkerNodeSpec struct {
3333
type AWSGenericNodeSpec struct {
3434
// AMI or AMI Lookup arguments for machine image of a AWS machine.
3535
// If both AMI ID and AMI lookup arguments are provided then AMI ID takes precedence
36-
//+optional
36+
// +kubebuilder:validation:Optional
3737
AMISpec *AMISpec `json:"ami,omitempty"`
3838

39-
//+optional
39+
// +kubebuilder:validation:Optional
4040
AdditionalSecurityGroups AdditionalSecurityGroup `json:"additionalSecurityGroups,omitempty"`
4141
}
4242

4343
type AdditionalSecurityGroup []SecurityGroup
4444

4545
type SecurityGroup struct {
4646
// ID is the id of the security group
47-
// +optional
47+
// +kubebuilder:validation:Optional
4848
ID string `json:"id,omitempty"`
4949
}
5050

5151
type AMISpec struct {
5252
// AMI ID is the reference to the AMI from which to create the machine instance.
53-
// +optional
53+
// +kubebuilder:validation:Optional
5454
ID string `json:"id,omitempty"`
5555

5656
// Lookup is the lookup arguments for the AMI.
57-
// +optional
57+
// +kubebuilder:validation:Optional
5858
Lookup *AMILookup `json:"lookup,omitempty"`
5959
}
6060

6161
type AMILookup struct {
6262
// AMI naming format. Supports substitutions for {{.BaseOS}} and {{.K8sVersion}} with the
6363
// base OS and kubernetes version.
64+
// +kubebuilder:validation:Optional
6465
// +kubebuilder:example=`capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-*`
65-
// +optional
6666
Format string `json:"format,omitempty"`
6767

6868
// The AWS Organization ID to use for image lookup.
69-
// +optional
69+
// +kubebuilder:validation:Optional
7070
Org string `json:"org,omitempty"`
7171

7272
// The name of the base os for image lookup
73-
// +optional
73+
// +kubebuilder:validation:Optional
7474
BaseOS string `json:"baseOS,omitempty"`
7575
}

0 commit comments

Comments
 (0)