Skip to content

Commit b67b93d

Browse files
authored
[Feature] Fix Group Schema Type (#1671)
1 parent 34228e9 commit b67b93d

34 files changed

+1409
-4112
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
## [master](https://github.com/arangodb/kube-arangodb/tree/master) (N/A)
44
- (Maintenance) Go 1.22.4 & Kubernetes 1.29.6 libraries
5+
- (Feature) Fix CRD Schema types
56

67
## [1.2.41](https://github.com/arangodb/kube-arangodb/tree/1.2.41) (2024-05-24)
78
- (Maintenance) Bump Prometheus API Version

README.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,8 @@ Flags:
141141
--backup-concurrent-uploads int Number of concurrent uploads per deployment (default 4)
142142
--chaos.allowed Set to allow chaos in deployments. Only activated when allowed and enabled in deployment
143143
--crd.install Install missing CRD if access is possible (default true)
144-
--crd.validation-schema stringArray Overrides default set of CRDs which should have validation schema enabled <crd-name>=<true/false>.
144+
--crd.preserve-unknown-fields stringArray Controls which CRD should have enabled preserve unknown fields in validation schema <crd-name>=<true/false>. To apply for all, use crd-name 'all'.
145+
--crd.validation-schema stringArray Overrides default set of CRDs which should have validation schema enabled <crd-name>=<true/false>. To apply for all, use crd-name 'all'.
145146
--deployment.feature.agency-poll Enable Agency Poll for Enterprise deployments - Required ArangoDB 3.8.0 or higher (default true)
146147
--deployment.feature.all Enable ALL Features
147148
--deployment.feature.async-backup-creation Create backups asynchronously to avoid blocking the operator and reaching the timeout - Required ArangoDB 3.8.0 or higher (default true)

cmd/cmd.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,9 @@ var (
136136
timeout time.Duration
137137
}
138138
crdOptions struct {
139-
install bool
140-
validationSchema []string
139+
install bool
140+
preserveUnknownFields []string
141+
validationSchema []string
141142
}
142143
operatorKubernetesOptions struct {
143144
maxBatchSize int64
@@ -242,7 +243,8 @@ func init() {
242243
f.Float32Var(&operatorKubernetesOptions.qps, "kubernetes.qps", kclient.DefaultQPS, "Number of queries per second for k8s API")
243244
f.IntVar(&operatorKubernetesOptions.burst, "kubernetes.burst", kclient.DefaultBurst, "Burst for the k8s API")
244245
f.BoolVar(&crdOptions.install, "crd.install", true, "Install missing CRD if access is possible")
245-
f.StringArrayVar(&crdOptions.validationSchema, "crd.validation-schema", defaultValidationSchemaEnabled, "Overrides default set of CRDs which should have validation schema enabled <crd-name>=<true/false>.")
246+
f.StringArrayVar(&crdOptions.preserveUnknownFields, "crd.preserve-unknown-fields", nil, "Controls which CRD should have enabled preserve unknown fields in validation schema <crd-name>=<true/false>. To apply for all, use crd-name 'all'.")
247+
f.StringArrayVar(&crdOptions.validationSchema, "crd.validation-schema", defaultValidationSchemaEnabled, "Overrides default set of CRDs which should have validation schema enabled <crd-name>=<true/false>. To apply for all, use crd-name 'all'.")
246248
f.IntVar(&operatorBackup.concurrentUploads, "backup-concurrent-uploads", globals.DefaultBackupConcurrentUploads, "Number of concurrent uploads per deployment")
247249
f.Uint64Var(&memoryLimit.hardLimit, "memory-limit", 0, "Define memory limit for hard shutdown and the dump of goroutines. Used for testing")
248250
f.StringArrayVar(&metricsOptions.excludedMetricPrefixes, "metrics.excluded-prefixes", nil, "List of the excluded metrics prefixes")
@@ -389,7 +391,7 @@ func executeMain(cmd *cobra.Command, args []string) {
389391
ctx, cancel := context.WithTimeout(shutdown.Context(), time.Minute)
390392
defer cancel()
391393

392-
crdOpts, err := prepareCRDOptions(crdOptions.validationSchema)
394+
crdOpts, err := prepareCRDOptions(crdOptions.validationSchema, crdOptions.preserveUnknownFields)
393395
if err != nil {
394396
logger.Fatal("Invalid --crd.validation-schema args: %s", err)
395397
}

cmd/crd.go

+105-14
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ import (
3737
"github.com/arangodb/kube-arangodb/pkg/util/shutdown"
3838
)
3939

40+
const (
41+
AllSchemasValue = "all"
42+
)
43+
4044
var (
4145
cmdCRD = &cobra.Command{
4246
Use: "crd",
@@ -48,12 +52,18 @@ var (
4852
Run: cmdCRDInstallRun,
4953
Short: "Install and update all required CRDs",
5054
}
55+
cmdCRDGenerate = &cobra.Command{
56+
Use: "generate",
57+
Run: cmdCRDGenerateRun,
58+
Short: "Generates YAML of all required CRDs",
59+
}
5160
)
5261

5362
var (
5463
crdInstallOptions struct {
55-
validationSchema []string
56-
force bool
64+
validationSchema []string
65+
preserveUnknownFields []string
66+
force bool
5767
}
5868
)
5969

@@ -65,39 +75,107 @@ func init() {
6575
cmdMain.AddCommand(cmdCRD)
6676
cmdOps.AddCommand(cmdCRD)
6777

68-
f := cmdCRDInstall.Flags()
78+
f := cmdCRD.PersistentFlags()
6979
f.StringArrayVar(&crdInstallOptions.validationSchema, "crd.validation-schema", defaultValidationSchemaEnabled, "Controls which CRD should have validation schema <crd-name>=<true/false>.")
80+
f.StringArrayVar(&crdInstallOptions.preserveUnknownFields, "crd.preserve-unknown-fields", nil, "Controls which CRD should have enabled preserve unknown fields in validation schema <crd-name>=<true/false>.")
7081
f.BoolVar(&crdInstallOptions.force, "crd.force-update", false, "Enforce CRD Schema update")
82+
7183
cmdCRD.AddCommand(cmdCRDInstall)
84+
cmdCRD.AddCommand(cmdCRDGenerate)
7285
}
7386

74-
func prepareCRDOptions(schemaEnabledArgs []string) (map[string]crds.CRDOptions, error) {
87+
func prepareCRDOptions(schemaEnabledArgs []string, preserveUnknownFieldsArgs []string) (map[string]crds.CRDOptions, error) {
7588
defaultOptions := crd.GetDefaultCRDOptions()
76-
result := make(map[string]crds.CRDOptions)
7789
var err error
90+
91+
schemaEnabled := map[string]bool{}
92+
preserveUnknownFields := map[string]bool{}
93+
7894
for _, arg := range schemaEnabledArgs {
79-
parts := strings.Split(arg, "=")
95+
parts := strings.SplitN(arg, "=", 2)
96+
97+
var enabled bool
98+
99+
if len(parts) == 2 {
100+
enabled, err = strconv.ParseBool(parts[1])
101+
if err != nil {
102+
return nil, errors.Wrapf(err, "not a bool value: %s", parts[1])
103+
}
80104

81-
crdName := parts[0]
82-
opts, ok := defaultOptions[crdName]
83-
if !ok {
84-
return nil, fmt.Errorf("unknown CRD %s", crdName)
85105
}
86106

107+
schemaEnabled[parts[0]] = enabled
108+
}
109+
110+
for _, arg := range preserveUnknownFieldsArgs {
111+
parts := strings.SplitN(arg, "=", 2)
112+
113+
var enabled bool
114+
87115
if len(parts) == 2 {
88-
opts.WithSchema, err = strconv.ParseBool(parts[1])
116+
enabled, err = strconv.ParseBool(parts[1])
89117
if err != nil {
90118
return nil, errors.Wrapf(err, "not a bool value: %s", parts[1])
91119
}
120+
121+
}
122+
123+
preserveUnknownFields[parts[0]] = enabled
124+
}
125+
126+
for k := range schemaEnabled {
127+
if k == AllSchemasValue {
128+
continue
129+
}
130+
if _, ok := defaultOptions[k]; !ok {
131+
return nil, fmt.Errorf("unknown CRD %s", k)
92132
}
133+
}
134+
135+
for k := range preserveUnknownFields {
136+
if k == AllSchemasValue {
137+
continue
138+
}
139+
if _, ok := defaultOptions[k]; !ok {
140+
return nil, fmt.Errorf("unknown CRD %s", k)
141+
}
142+
}
93143

94-
result[crdName] = opts
144+
// Override the defaults
145+
if v, ok := schemaEnabled[AllSchemasValue]; ok {
146+
delete(preserveUnknownFields, AllSchemasValue)
147+
for k := range defaultOptions {
148+
z := defaultOptions[k]
149+
z.WithSchema = v
150+
defaultOptions[k] = z
151+
}
152+
}
153+
if v, ok := preserveUnknownFields[AllSchemasValue]; ok {
154+
delete(preserveUnknownFields, AllSchemasValue)
155+
for k := range defaultOptions {
156+
z := defaultOptions[k]
157+
z.WithPreserve = v
158+
defaultOptions[k] = z
159+
}
160+
}
161+
162+
// Set explicit words
163+
for k, v := range schemaEnabled {
164+
z := defaultOptions[k]
165+
z.WithSchema = v
166+
defaultOptions[k] = z
167+
}
168+
for k, v := range preserveUnknownFields {
169+
z := defaultOptions[k]
170+
z.WithPreserve = v
171+
defaultOptions[k] = z
95172
}
96-
return result, nil
173+
174+
return defaultOptions, nil
97175
}
98176

99177
func cmdCRDInstallRun(cmd *cobra.Command, args []string) {
100-
crdOpts, err := prepareCRDOptions(crdInstallOptions.validationSchema)
178+
crdOpts, err := prepareCRDOptions(crdInstallOptions.validationSchema, crdInstallOptions.preserveUnknownFields)
101179
if err != nil {
102180
logger.Fatal("Invalid --crd.validation-schema args: %s", err)
103181
return
@@ -117,3 +195,16 @@ func cmdCRDInstallRun(cmd *cobra.Command, args []string) {
117195
os.Exit(1)
118196
}
119197
}
198+
199+
func cmdCRDGenerateRun(cmd *cobra.Command, args []string) {
200+
crdOpts, err := prepareCRDOptions(crdInstallOptions.validationSchema, crdInstallOptions.preserveUnknownFields)
201+
if err != nil {
202+
logger.Fatal("Invalid --crd.validation-schema args: %s", err)
203+
return
204+
}
205+
206+
err = crd.GenerateCRDYAMLWithOptions(crd.EnsureCRDOptions{IgnoreErrors: false, CRDOptions: crdOpts, ForceUpdate: crdInstallOptions.force}, cmd.OutOrStdout())
207+
if err != nil {
208+
os.Exit(1)
209+
}
210+
}

docs/api/ArangoMember.V1.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ title: ArangoMember V1
1010

1111
### .spec.deletion_priority
1212

13-
Type: `integer` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.41/pkg/apis/deployment/v1/arango_member_spec.go#L47)</sup>
13+
Type: `integer` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.41/pkg/apis/deployment/v1/arango_member_spec.go#L48)</sup>
1414

1515
DeletionPriority define Deletion Priority.
1616
Higher value means higher priority. Default is 0.
@@ -20,23 +20,23 @@ Example: set 1 for Coordinator which should be deleted first and scale down coor
2020

2121
### .spec.deploymentUID
2222

23-
Type: `string` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.41/pkg/apis/deployment/v1/arango_member_spec.go#L36)</sup>
23+
Type: `string` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.41/pkg/apis/deployment/v1/arango_member_spec.go#L37)</sup>
2424

2525
DeploymentUID define Deployment UID.
2626

2727
***
2828

2929
### .spec.group
3030

31-
Type: `integer` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.41/pkg/apis/deployment/v1/arango_member_spec.go#L31)</sup>
31+
Type: `string` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.41/pkg/apis/deployment/v1/arango_member_spec.go#L32)</sup>
3232

3333
Group define Member Groups.
3434

3535
***
3636

3737
### .spec.id
3838

39-
Type: `string` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.41/pkg/apis/deployment/v1/arango_member_spec.go#L33)</sup>
39+
Type: `string` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.41/pkg/apis/deployment/v1/arango_member_spec.go#L34)</sup>
4040

4141
***
4242

0 commit comments

Comments
 (0)