Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement unstructured cassandra and dse yaml configuration #711

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG/CHANGELOG-1.3.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ When cutting a new release, update the `unreleased` heading to the tag being gen

* [FEATURE] [#657](https://github.com/k8ssandra/k8ssandra-operator/issues/657) Basic DSE Support
* [FEATURE] [#661](https://github.com/k8ssandra/k8ssandra-operator/issues/661) Support all dse.yaml options
* [FEATURE] [#710](https://github.com/k8ssandra/k8ssandra-operator/issues/710) Implement unstructured cassandra and dse yaml configuration
* [ENHANCEMENT] [#681](https://github.com/k8ssandra/k8ssandra-operator/issues/681) Update to Go 1.18, Kubernetes 1.24, Operator SDK 1.23, controller-gen 0.9.2, Kustomize 4.5.7, controller-runtime 0.12.2
* [ENHANCEMENT] [#699](https://github.com/k8ssandra/k8ssandra-operator/issues/699) Prevent DC decommission if user keyspaces are replicated to it
* [ENHANCEMENT] [#695](https://github.com/k8ssandra/k8ssandra-operator/issues/695) Support DSE multi DC clusters
Expand Down
963 changes: 7 additions & 956 deletions apis/k8ssandra/v1alpha1/cassandraconfig_types.go

Large diffs are not rendered by default.

2,114 changes: 0 additions & 2,114 deletions apis/k8ssandra/v1alpha1/dseconfig_types.go

This file was deleted.

6 changes: 2 additions & 4 deletions apis/k8ssandra/v1alpha1/k8ssandracluster_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -247,8 +247,6 @@ type CassandraClusterTemplate struct {
ServerType ServerDistribution `json:"serverType,omitempty"`
}

// +kubebuilder:pruning:PreserveUnknownFields

type CassandraDatacenterTemplate struct {
Meta EmbeddedObjectMeta `json:"metadata,omitempty"`

Expand Down Expand Up @@ -289,8 +287,8 @@ type DatacenterOptions struct {
// +optional
ServerImage string `json:"serverImage,omitempty"`

// CassandraConfig is configuration settings that are applied to cassandra.yaml and
// the various jvm*.options files.
// CassandraConfig contains configuration settings that are applied to cassandra.yaml, dse.yaml
// and the various jvm*.options files.
// +optional
CassandraConfig *CassandraConfig `json:"config,omitempty"`

Expand Down
29 changes: 8 additions & 21 deletions apis/k8ssandra/v1alpha1/k8ssandracluster_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@ package v1alpha1
import (
"fmt"

"github.com/k8ssandra/k8ssandra-operator/pkg/utils"

"github.com/k8ssandra/k8ssandra-operator/pkg/clientcache"
"github.com/pkg/errors"
"k8s.io/apimachinery/pkg/runtime"
Expand Down Expand Up @@ -117,28 +115,17 @@ func (r *K8ssandraCluster) ValidateUpdate(old runtime.Object) error {
oldCassConfig := oldCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig
newCassConfig := r.Spec.Cassandra.DatacenterOptions.CassandraConfig

// If num_tokens was set previously, do not allow modifying the value or leaving it out
if !utils.IsNil(oldCassConfig) && !utils.IsNil(oldCassConfig.CassandraYaml) &&
!utils.IsNil(oldCassConfig.CassandraYaml.NumTokens) {
var oldNumTokens, newNumTokens interface{}

// Changing num_tokens is not allowed
if utils.IsNil(newCassConfig) || utils.IsNil(newCassConfig.CassandraYaml) ||
utils.IsNil(newCassConfig.CassandraYaml.NumTokens) {
return ErrNumTokens
} else if *(newCassConfig.CassandraYaml.NumTokens) != *(oldCassConfig.CassandraYaml.NumTokens) {
return ErrNumTokens
}
if oldCassConfig != nil {
oldNumTokens = oldCassConfig.CassandraYaml["num_tokens"]
}
if newCassConfig != nil {
newNumTokens = newCassConfig.CassandraYaml["num_tokens"]
}

// If num_tokens was unset previously, do not allow setting it now
if !utils.IsNil(newCassConfig) && !utils.IsNil(newCassConfig.CassandraYaml) &&
!utils.IsNil(newCassConfig.CassandraYaml.NumTokens) {

// Old num_tokens wasn't specified
if utils.IsNil(oldCassConfig) || utils.IsNil(oldCassConfig.CassandraYaml) ||
utils.IsNil(oldCassConfig.CassandraYaml.NumTokens) {
return ErrNumTokens
}
if oldNumTokens != newNumTokens {
return ErrNumTokens
}

// Verify that the cluster name override was not changed
Expand Down
50 changes: 26 additions & 24 deletions apis/k8ssandra/v1alpha1/k8ssandracluster_webhook_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import (
logrusr "github.com/bombsimon/logrusr/v2"
"github.com/k8ssandra/cass-operator/apis/cassandra/v1beta1"
"github.com/k8ssandra/k8ssandra-operator/pkg/clientcache"
"github.com/k8ssandra/k8ssandra-operator/pkg/unstructured"
"github.com/sirupsen/logrus"
"github.com/stretchr/testify/require"
admissionv1 "k8s.io/api/admission/v1"
Expand Down Expand Up @@ -220,7 +221,8 @@ func testNumTokens(t *testing.T) {
required.NoError(err)

tokens := 256
cluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml.NumTokens = &tokens
cluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml = unstructured.Unstructured{}
cluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml["num_tokens"] = tokens
err = k8sClient.Update(ctx, cluster)
required.Error(err)

Expand All @@ -233,11 +235,11 @@ func testNumTokens(t *testing.T) {
required.NoError(err)

newTokens := 16
cluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml.NumTokens = &newTokens
cluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml["num_tokens"] = newTokens
err = k8sClient.Update(ctx, cluster)
required.Error(err)

cluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml.NumTokens = nil
delete(cluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml, "num_tokens")
err = k8sClient.Update(ctx, cluster)
required.Error(err)

Expand All @@ -248,47 +250,47 @@ func testNumTokens(t *testing.T) {
oldCluster := createClusterObjWithCassandraConfig("numtokens-test-1", "numtokens-namespace-1")
newCluster := createClusterObjWithCassandraConfig("numtokens-test-2", "numtokens-namespace-2")

oldCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml.NumTokens = nil
newCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml.NumTokens = &newTokens
delete(oldCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml, "num_tokens")
newCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml["num_tokens"] = newTokens

var oldCassConfig = oldCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig
var newCassConfig = newCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig

// Handle new num_token value different from previously specified as nil
required.NotEqual(oldCassConfig.CassandraYaml.NumTokens, newCassConfig.CassandraYaml.NumTokens)
required.NotEqual(oldCassConfig.CassandraYaml["num_tokens"], newCassConfig.CassandraYaml["num_tokens"])
var errorWhenNew = (*newCluster).ValidateUpdate(oldCluster)
required.Error(errorWhenNew, "expected error having new num_token value different from previous specified as nil")

oldCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml.NumTokens = &tokens
newCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml.NumTokens = &newTokens
oldCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml["num_tokens"] = tokens
newCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml["num_tokens"] = newTokens

oldCassConfig = oldCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig
newCassConfig = newCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig

// Handle new num_token value different from previously specified as an actual value
required.NotEqual(oldCassConfig.CassandraYaml.NumTokens, newCassConfig.CassandraYaml.NumTokens)
required.NotEqual(oldCassConfig.CassandraYaml["num_tokens"], newCassConfig.CassandraYaml["num_tokens"])
errorWhenNew = (*newCluster).ValidateUpdate(oldCluster)
required.Error(errorWhenNew, "expected error having new num_token value different from previous specified")

// Handle new num_token not specified when previously specified
oldCassConfig.CassandraYaml.NumTokens = &tokens
newCassConfig.CassandraYaml.NumTokens = nil
oldCassConfig.CassandraYaml["num_tokens"] = tokens
delete(newCassConfig.CassandraYaml, "num_tokens")

var errorWhenNil = (*newCluster).ValidateUpdate(oldCluster)
required.Error(errorWhenNil, "expected error having new num_token value as nil from previous specified")

oldCassConfig.CassandraYaml.NumTokens = &tokens
newCassConfig.CassandraYaml = CassandraYaml{}
oldCassConfig.CassandraYaml["num_tokens"] = tokens
newCassConfig.CassandraYaml = unstructured.Unstructured{}

errorWhenNil = (*newCluster).ValidateUpdate(oldCluster)
required.Error(errorWhenNil, "expected error having new num_token value as nil from previous specified")

oldCassConfig.CassandraYaml.NumTokens = &tokens
oldCassConfig.CassandraYaml["num_tokens"] = tokens
newCassConfig = &CassandraConfig{}
errorWhenNil = (*newCluster).ValidateUpdate(oldCluster)
required.Error(errorWhenNil, "expected error having new num_token value as nil from previous specified")

oldCassConfig.CassandraYaml.NumTokens = &tokens
oldCassConfig.CassandraYaml["num_tokens"] = tokens
newCassConfig = &CassandraConfig{}
errorWhenNil = (*newCluster).ValidateUpdate(oldCluster)
required.Error(errorWhenNil, "expected error having new num_token value as nil from previous specified")
Expand All @@ -299,19 +301,19 @@ func testNumTokens(t *testing.T) {
intervalInMins := 9035768
enabled := true

oldCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml.NumTokens = &sameNumTokens
newCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml.NumTokens = &sameNumTokens
newCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml.CdcEnabled = &enabled
newCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml.IndexSummaryResizeIntervalInMinutes = &intervalInMins
oldCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml["num_tokens"] = sameNumTokens
newCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml["num_tokens"] = sameNumTokens
newCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml["cdc_enabled"] = enabled
newCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml["index_summary_resize_interval_in_minutes"] = intervalInMins

errorOnValidate := (*newCluster).ValidateUpdate(oldCluster)
required.NoError(errorOnValidate)

// Expected failure for validation with token change while changes to other config values are being made
oldCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml.NumTokens = &sameNumTokens
newCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml.NumTokens = &diffNumTokens
newCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml.CdcEnabled = &enabled
newCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml.IndexSummaryResizeIntervalInMinutes = &intervalInMins
oldCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml["num_tokens"] = sameNumTokens
newCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml["num_tokens"] = diffNumTokens
newCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml["cdc_enabled"] = enabled
newCluster.Spec.Cassandra.DatacenterOptions.CassandraConfig.CassandraYaml["index_summary_resize_interval_in_minutes"] = intervalInMins

errorOnValidate = (*newCluster).ValidateUpdate(oldCluster)
required.Error(errorOnValidate, "expected error when changing the value of num tokens while also changing other field values")
Expand All @@ -338,7 +340,7 @@ func createClusterObjWithCassandraConfig(name, namespace string) *K8ssandraClust
Cassandra: &CassandraClusterTemplate{
DatacenterOptions: DatacenterOptions{
CassandraConfig: &CassandraConfig{
CassandraYaml: CassandraYaml{NumTokens: nil},
CassandraYaml: unstructured.Unstructured{"num_tokens": nil},
},
StorageConfig: &v1beta1.StorageConfig{},
},
Expand Down
Loading