diff --git a/CHANGELOG/CHANGELOG-1.11.md b/CHANGELOG/CHANGELOG-1.11.md index 0f4fd1dd5..ba119b93a 100644 --- a/CHANGELOG/CHANGELOG-1.11.md +++ b/CHANGELOG/CHANGELOG-1.11.md @@ -15,4 +15,5 @@ When cutting a new release, update the `unreleased` heading to the tag being gen ## unreleased +* [ENHANCEMENT] [#1125](https://github.com/k8ssandra/k8ssandra-operator/issues/1125) Support Stargate with DSE and upgrade Stargate to 1.0.77 * [ENHANCEMENT] [#1122](https://github.com/k8ssandra/k8ssandra-operator/issues/1122) Expose backup size in MedusaBackup CRD diff --git a/apis/stargate/v1alpha1/stargate_types.go b/apis/stargate/v1alpha1/stargate_types.go index a8b88613d..8c1600132 100644 --- a/apis/stargate/v1alpha1/stargate_types.go +++ b/apis/stargate/v1alpha1/stargate_types.go @@ -45,7 +45,7 @@ type StargateTemplate struct { // ContainerImage is the image characteristics to use for Stargate containers. Leave nil // to use a default image. // +optional - // +kubebuilder:default={repository:"stargateio", tag:"v1.0.67"} + // +kubebuilder:default={repository:"stargateio", tag:"v1.0.77"} ContainerImage *images.Image `json:"containerImage,omitempty"` // ServiceAccount is the service account name to use for Stargate pods. diff --git a/config/crd/bases/k8ssandra.io_k8ssandraclusters.yaml b/config/crd/bases/k8ssandra.io_k8ssandraclusters.yaml index a89c222c7..9f19ffb93 100644 --- a/config/crd/bases/k8ssandra.io_k8ssandraclusters.yaml +++ b/config/crd/bases/k8ssandra.io_k8ssandraclusters.yaml @@ -12013,7 +12013,7 @@ spec: containerImage: default: repository: stargateio - tag: v1.0.67 + tag: v1.0.77 description: ContainerImage is the image characteristics to use for Stargate containers. Leave nil to use a default image. @@ -13481,7 +13481,7 @@ spec: containerImage: default: repository: stargateio - tag: v1.0.67 + tag: v1.0.77 description: ContainerImage is the image characteristics to use for Stargate containers. Leave nil to use a default image. @@ -30737,7 +30737,7 @@ spec: containerImage: default: repository: stargateio - tag: v1.0.67 + tag: v1.0.77 description: ContainerImage is the image characteristics to use for Stargate containers. Leave nil to use a default image. properties: diff --git a/config/crd/bases/stargate.k8ssandra.io_stargates.yaml b/config/crd/bases/stargate.k8ssandra.io_stargates.yaml index 118d7db5f..a4140b0f2 100644 --- a/config/crd/bases/stargate.k8ssandra.io_stargates.yaml +++ b/config/crd/bases/stargate.k8ssandra.io_stargates.yaml @@ -1103,7 +1103,7 @@ spec: containerImage: default: repository: stargateio - tag: v1.0.67 + tag: v1.0.77 description: ContainerImage is the image characteristics to use for Stargate containers. Leave nil to use a default image. properties: @@ -2306,7 +2306,7 @@ spec: containerImage: default: repository: stargateio - tag: v1.0.67 + tag: v1.0.77 description: ContainerImage is the image characteristics to use for Stargate containers. Leave nil to use a default image. properties: diff --git a/pkg/stargate/deployments.go b/pkg/stargate/deployments.go index 3523c27dc..cf7464e40 100644 --- a/pkg/stargate/deployments.go +++ b/pkg/stargate/deployments.go @@ -34,7 +34,8 @@ const ( DefaultImageRepository = "stargateio" DefaultImageName3 = "stargate-3_11" DefaultImageName4 = "stargate-4_0" - DefaultVersion = "1.0.67" + DefaultImageNameDse68 = "stargate-dse-68" + DefaultVersion = "1.0.77" // When changing the default version above, please also change the kubebuilder marker in // apis/stargate/v1alpha1/stargate_types.go accordingly. ) @@ -42,8 +43,9 @@ const ( type ClusterVersion string const ( - ClusterVersion3 ClusterVersion = "3.11" - ClusterVersion4 ClusterVersion = "4.0" + ClusterVersion3 ClusterVersion = "3.11" + ClusterVersion4 ClusterVersion = "4.0" + ClusterVersion68 ClusterVersion = "6.8" ) var ( @@ -59,6 +61,12 @@ var ( Name: DefaultImageName4, Tag: "v" + DefaultVersion, } + defaultImage68 = images.Image{ + Registry: images.DefaultRegistry, + Repository: DefaultImageRepository, + Name: DefaultImageNameDse68, + Tag: "v" + DefaultVersion, + } ) // NewDeployments compute the Deployments to create for the given Stargate and CassandraDatacenter @@ -189,6 +197,11 @@ func NewDeployments(stargate *api.Stargate, dc *cassdcapi.CassandraDatacenter, l }, } + if coreapi.ServerDistribution(dc.Spec.ServerType) == coreapi.ServerDistributionDse { + // Stargate requires a DSE env variable set to "1" to use the right backend. + deployment.Spec.Template.Spec.Containers[0].Env = append(deployment.Spec.Template.Spec.Containers[0].Env, corev1.EnvVar{Name: "DSE", Value: "1"}) + } + klusterName, nameFound := stargate.Labels[coreapi.K8ssandraClusterNameLabel] klusterNamespace, namespaceFound := stargate.Labels[coreapi.K8ssandraClusterNamespaceLabel] @@ -219,6 +232,9 @@ func computeSeedServiceUrl(dc *cassdcapi.CassandraDatacenter) string { } func computeClusterVersion(dc *cassdcapi.CassandraDatacenter) ClusterVersion { + if coreapi.ServerDistribution(dc.Spec.ServerType) == coreapi.ServerDistributionDse { + return ClusterVersion68 + } cassandraVersion := dc.Spec.ServerVersion if strings.HasPrefix(cassandraVersion, "3") { return ClusterVersion3 @@ -228,11 +244,13 @@ func computeClusterVersion(dc *cassdcapi.CassandraDatacenter) ClusterVersion { } func computeImage(template *api.StargateTemplate, clusterVersion ClusterVersion) *images.Image { + if clusterVersion == ClusterVersion68 { + return template.ContainerImage.ApplyDefaults(defaultImage68) + } if clusterVersion == ClusterVersion3 { return template.ContainerImage.ApplyDefaults(defaultImage3) - } else { - return template.ContainerImage.ApplyDefaults(defaultImage4) } + return template.ContainerImage.ApplyDefaults(defaultImage4) } func computeResourceRequirements(template *api.StargateTemplate) corev1.ResourceRequirements { diff --git a/pkg/stargate/deployments_test.go b/pkg/stargate/deployments_test.go index 2d55857fd..d1348e566 100644 --- a/pkg/stargate/deployments_test.go +++ b/pkg/stargate/deployments_test.go @@ -827,6 +827,45 @@ func testImages(t *testing.T) { assert.Contains(t, deployment.Spec.Template.Spec.ImagePullSecrets, corev1.LocalObjectReference{Name: "my-secret"}) assert.Len(t, deployment.Spec.Template.Spec.ImagePullSecrets, 1) }) + t.Run("default image DSE 6.8", func(t *testing.T) { + stargate := stargate.DeepCopy() + stargate.Spec.ContainerImage = &images.Image{ + Repository: "stargateio", + Tag: "v" + DefaultVersion, + } + dc := dc.DeepCopy() + dc.Spec.ServerVersion = "6.8.40" + dc.Spec.ServerType = "dse" + logger := testlogr.NewTestLogger(t) + deployments := NewDeployments(stargate, dc, logger) + require.Len(t, deployments, 1) + deployment := deployments["cluster1-dc1-default-stargate-deployment"] + assert.Equal(t, defaultImage68.String(), deployment.Spec.Template.Spec.Containers[0].Image) + assert.Equal(t, corev1.PullIfNotPresent, deployment.Spec.Template.Spec.Containers[0].ImagePullPolicy) + assert.Empty(t, deployment.Spec.Template.Spec.ImagePullSecrets) + assert.Equal(t, "1", utils.FindEnvVarInContainer(&deployment.Spec.Template.Spec.Containers[0], "DSE").Value) + }) + t.Run("custom image DSE 6.8", func(t *testing.T) { + stargate := stargate.DeepCopy() + image := &images.Image{ + Repository: "my-custom-repo", + Tag: "latest", + PullSecretRef: &corev1.LocalObjectReference{Name: "my-secret"}, + } + stargate.Spec.ContainerImage = image + dc := dc.DeepCopy() + dc.Spec.ServerVersion = "6.8.40" + dc.Spec.ServerType = "dse" + logger := testlogr.NewTestLogger(t) + deployments := NewDeployments(stargate, dc, logger) + require.Len(t, deployments, 1) + deployment := deployments["cluster1-dc1-default-stargate-deployment"] + assert.Equal(t, "docker.io/my-custom-repo/stargate-dse-68:latest", deployment.Spec.Template.Spec.Containers[0].Image) + assert.Equal(t, corev1.PullAlways, deployment.Spec.Template.Spec.Containers[0].ImagePullPolicy) + assert.Contains(t, deployment.Spec.Template.Spec.ImagePullSecrets, corev1.LocalObjectReference{Name: "my-secret"}) + assert.Len(t, deployment.Spec.Template.Spec.ImagePullSecrets, 1) + assert.Equal(t, "1", utils.FindEnvVarInContainer(&deployment.Spec.Template.Spec.Containers[0], "DSE").Value) + }) } func affinityForRack(dc *cassdcapi.CassandraDatacenter, rackName string) *corev1.Affinity { diff --git a/test/e2e/dse_test.go b/test/e2e/dse_test.go index beade52ac..9a82200bc 100644 --- a/test/e2e/dse_test.go +++ b/test/e2e/dse_test.go @@ -31,9 +31,10 @@ func createSingleDseDatacenterCluster(t *testing.T, ctx context.Context, namespa dcKey := framework.ClusterKey{K8sContext: f.DataPlaneContexts[0], NamespacedName: types.NamespacedName{Namespace: namespace, Name: "dc1"}} checkDatacenterReady(t, ctx, dcKey, f) assertCassandraDatacenterK8cStatusReady(ctx, t, f, kcKey, dcKey.Name) + dcPrefix := DcPrefix(t, f, dcKey) t.Log("Check that we can communicate through CQL with DSE") - _, err = f.ExecuteCql(ctx, f.DataPlaneContexts[0], namespace, kc.SanitizedName(), DcPrefix(t, f, dcKey)+"-default-sts-0", + _, err = f.ExecuteCql(ctx, f.DataPlaneContexts[0], namespace, kc.SanitizedName(), dcPrefix+"-default-sts-0", "SELECT * FROM system.local") require.NoError(t, err, "failed to execute CQL query against DSE") @@ -67,6 +68,11 @@ func createSingleDseDatacenterCluster(t *testing.T, ctx context.Context, namespa _, err = f.ExecuteCqlNoAuth(f.DataPlaneContexts[0], namespace, DcPrefix(t, f, dcKey)+"-default-sts-0", "SELECT server_id FROM system.local") require.Error(t, err, "expected CQL query without auth to fail") + + stargateKey := framework.ClusterKey{K8sContext: f.DataPlaneContexts[0], NamespacedName: types.NamespacedName{Namespace: namespace, Name: dcPrefix + "-stargate"}} + checkStargateReady(t, f, ctx, stargateKey) + + checkStargateK8cStatusReady(t, f, ctx, kcKey, dcKey) } // createSingleDseSearchDatacenterCluster creates a K8ssandraCluster with one CassandraDatacenter running with search enabled diff --git a/test/testdata/fixtures/single-dc-dse/k8ssandra.yaml b/test/testdata/fixtures/single-dc-dse/k8ssandra.yaml index 6897a9339..e347e9d67 100644 --- a/test/testdata/fixtures/single-dc-dse/k8ssandra.yaml +++ b/test/testdata/fixtures/single-dc-dse/k8ssandra.yaml @@ -4,6 +4,9 @@ metadata: name: test spec: auth: true + stargate: + size: 1 + heapSize: 384Mi cassandra: serverVersion: 6.8.26 serverType: dse