Skip to content

Commit

Permalink
issue-698-Save-default-user-ref-for-cassandra
Browse files Browse the repository at this point in the history
  • Loading branch information
OleksiienkoMykyta committed Feb 21, 2024
1 parent f65ce9e commit ea2f4b1
Show file tree
Hide file tree
Showing 5 changed files with 114 additions and 3 deletions.
27 changes: 25 additions & 2 deletions apis/clusters/v1beta1/cassandra_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ limitations under the License.
package v1beta1

import (
"fmt"
"strconv"

k8scorev1 "k8s.io/api/core/v1"
Expand Down Expand Up @@ -65,8 +66,9 @@ type CassandraSpec struct {

// CassandraStatus defines the observed state of Cassandra
type CassandraStatus struct {
GenericStatus `json:",inline"`
DataCentres []*CassandraDataCentreStatus `json:"dataCentres,omitempty"`
GenericStatus `json:",inline"`
DataCentres []*CassandraDataCentreStatus `json:"dataCentres,omitempty"`
DefaultUserSecretRef *Reference `json:"defaultUserSecretRef,omitempty"`

AvailableUsers References `json:"availableUsers,omitempty"`
}
Expand Down Expand Up @@ -612,3 +614,24 @@ func (c *Cassandra) GetHeadlessPorts() []k8scorev1.ServicePort {
}
return headlessPorts
}

func (c *Cassandra) NewDefaultUserSecret(username, password string) *k8scorev1.Secret {
return &k8scorev1.Secret{
TypeMeta: metav1.TypeMeta{
Kind: models.SecretKind,
APIVersion: models.K8sAPIVersionV1,
},
ObjectMeta: metav1.ObjectMeta{
Name: fmt.Sprintf(models.DefaultUserSecretNameTemplate, models.DefaultUserSecretPrefix, c.Name),
Namespace: c.Namespace,
Labels: map[string]string{
models.ControlledByLabel: c.Name,
models.DefaultSecretLabel: "true",
},
},
StringData: map[string]string{
models.Username: username,
models.Password: password,
},
}
}
5 changes: 5 additions & 0 deletions apis/clusters/v1beta1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions config/crd/bases/clusters.instaclustr.com_cassandras.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -449,6 +449,17 @@ spec:
- nodes
type: object
type: array
defaultUserSecretRef:
description: ObjectReference is namespaced reference to an object
properties:
name:
type: string
namespace:
type: string
required:
- name
- namespace
type: object
id:
type: string
maintenanceEvents:
Expand Down
2 changes: 1 addition & 1 deletion config/samples/clusters_v1beta1_cassandra.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ kind: Cassandra
metadata:
name: cassandra-cluster-2
spec:
name: "example-cassandra" #(immutable)
name: "mykyta-cassandra" #(immutable)
version: "4.0.10" #(immutable)
privateNetwork: false #(immutable)
dataCentres:
Expand Down
72 changes: 72 additions & 0 deletions controllers/clusters/cassandra_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,25 @@ func (r *CassandraReconciler) handleCreateCluster(
}
}

err := r.createDefaultSecret(ctx, c, l)
if err != nil {
l.Error(err, "Cannot create default secret for Cassandra",
"cluster name", c.Spec.Name,
"clusterID", c.Status.ID,
)
r.EventRecorder.Eventf(
c, models.Warning, models.CreationFailed,
"Default user secret creation on the Instaclustr is failed. Reason: %v",
err,
)

return reconcile.Result{}, err
}

l.Info("Cassandra cluster has been created",
"cluster ID", c.Status.ID,
)

if c.Status.State != models.DeletedStatus {
patch := c.NewPatch()
c.Annotations[models.ResourceStateAnnotation] = models.CreatedEvent
Expand Down Expand Up @@ -895,6 +914,59 @@ func (r *CassandraReconciler) newWatchBackupsJob(c *v1beta1.Cassandra) scheduler
}
}

func (r *CassandraReconciler) createDefaultSecret(ctx context.Context, kc *v1beta1.Cassandra, l logr.Logger) error {
username, password, err := r.API.GetDefaultCredentialsV1(kc.Status.ID)
if err != nil {
l.Error(err, "Cannot get default user creds for Cassandra cluster from the Instaclustr API",
"cluster ID", kc.Status.ID,
)
r.EventRecorder.Eventf(kc, models.Warning, models.FetchFailed,
"Default user password fetch from the Instaclustr API is failed. Reason: %v", err,
)

return err
}

patch := kc.NewPatch()
secret := kc.NewDefaultUserSecret(username, password)
err = r.Create(ctx, secret)
if err != nil {
l.Error(err, "Cannot create secret with default user credentials",
"cluster ID", kc.Status.ID,
)
r.EventRecorder.Eventf(kc, models.Warning, models.CreationFailed,
"Creating secret with default user credentials is failed. Reason: %v", err,
)

return err
}

l.Info("Default secret was created",
"secret name", secret.Name,
"secret namespace", secret.Namespace,
)

kc.Status.DefaultUserSecretRef = &v1beta1.Reference{
Name: secret.Name,
Namespace: secret.Namespace,
}

err = r.Status().Patch(ctx, kc, patch)
if err != nil {
l.Error(err, "Cannot patch Cassandra resource",
"cluster name", kc.Spec.Name,
"status", kc.Status)

r.EventRecorder.Eventf(
kc, models.Warning, models.PatchFailed,
"Cluster resource patch is failed. Reason: %v", err)

return err
}

return nil
}

func (r *CassandraReconciler) newUsersCreationJob(c *v1beta1.Cassandra) scheduler.Job {
l := log.Log.WithValues("component", "cassandraUsersCreationJob")

Expand Down

0 comments on commit ea2f4b1

Please sign in to comment.