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 27, 2024
1 parent 13f37bd commit 0785828
Show file tree
Hide file tree
Showing 12 changed files with 119 additions and 54 deletions.
5 changes: 3 additions & 2 deletions apis/clusters/v1beta1/cassandra_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,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
23 changes: 0 additions & 23 deletions apis/clusters/v1beta1/kafkaconnect_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@ limitations under the License.
package v1beta1

import (
"fmt"

k8scorev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/intstr"
Expand Down Expand Up @@ -543,27 +541,6 @@ func (tc *TargetCluster) ManagedClustersToInstAPI() (iClusters []*models.Managed
return
}

func (k *KafkaConnect) 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, k.Name),
Namespace: k.Namespace,
Labels: map[string]string{
models.ControlledByLabel: k.Name,
models.DefaultSecretLabel: "true",
},
},
StringData: map[string]string{
models.Username: username,
models.Password: password,
},
}
}

func (k *KafkaConnect) GetExposePorts() []k8scorev1.ServicePort {
var exposePorts []k8scorev1.ServicePort
if !k.Spec.PrivateNetwork {
Expand Down
24 changes: 0 additions & 24 deletions apis/clusters/v1beta1/zookeeper_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,6 @@ package v1beta1

import (
"encoding/json"
"fmt"

"k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"sigs.k8s.io/controller-runtime/pkg/client"

Expand Down Expand Up @@ -217,24 +214,3 @@ func (rs *ZookeeperSpec) areDCsEqual(b []*ZookeeperDataCentre) bool {

return true
}

func (a *Zookeeper) NewDefaultUserSecret(username, password string) *v1.Secret {
return &v1.Secret{
TypeMeta: metav1.TypeMeta{
Kind: models.SecretKind,
APIVersion: models.K8sAPIVersionV1,
},
ObjectMeta: metav1.ObjectMeta{
Name: fmt.Sprintf(models.DefaultUserSecretNameTemplate, models.DefaultUserSecretPrefix, a.Name),
Namespace: a.Namespace,
Labels: map[string]string{
models.ControlledByLabel: a.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 @@ -4,7 +4,7 @@ metadata:
name: cassandra-cluster
spec:
name: "example-cassandra" #(immutable)
version: "4.0.10" #(immutable)
version: "4.1.3" #(immutable)
privateNetwork: false #(immutable)
dataCentres:
- name: "AWS_cassandra" #(mutable)
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 @@ -888,6 +907,59 @@ func (r *CassandraReconciler) newWatchBackupsJob(c *v1beta1.Cassandra) scheduler
}
}

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

return err
}

patch := c.NewPatch()
secret := newDefaultUserSecret(username, password, c.Name, c.Namespace)
err = r.Create(ctx, secret)
if err != nil {
l.Error(err, "Cannot create secret with default user credentials",
"cluster ID", c.Status.ID,
)
r.EventRecorder.Eventf(c, 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,
)

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

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

r.EventRecorder.Eventf(
c, 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
23 changes: 23 additions & 0 deletions controllers/clusters/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,10 @@ import (

"github.com/go-logr/logr"
"github.com/hashicorp/go-version"
k8scorev1 "k8s.io/api/core/v1"
v1 "k8s.io/api/core/v1"
k8serrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
"k8s.io/client-go/tools/record"
"k8s.io/utils/strings/slices"
Expand Down Expand Up @@ -197,6 +199,27 @@ func createSpecDifferenceMessage[T any](k8sSpec, iSpec T) (string, error) {
return fmt.Sprintf("%s Diffs: %s", models.ExternalChangesBaseMessage, b), nil
}

func newDefaultUserSecret(username, password, name, namespace 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, name),
Namespace: namespace,
Labels: map[string]string{
models.ControlledByLabel: name,
models.DefaultSecretLabel: "true",
},
},
StringData: map[string]string{
models.Username: username,
models.Password: password,
},
}
}

var msgDeleteClusterWithTwoFactorDelete = "Please confirm cluster deletion via email or phone. " +
"If you have canceled a cluster deletion and want to put the cluster on deletion again, " +
"remove \"triggered\" from Instaclustr.com/clusterDeletion annotation."
Expand Down
2 changes: 1 addition & 1 deletion controllers/clusters/kafkaconnect_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,7 @@ func (r *KafkaConnectReconciler) createDefaultSecret(ctx context.Context, kc *v1
}

patch := kc.NewPatch()
secret := kc.NewDefaultUserSecret(username, password)
secret := newDefaultUserSecret(username, password, kc.Name, kc.Namespace)
err = r.Create(ctx, secret)
if err != nil {
l.Error(err, "Cannot create secret with default user credentials",
Expand Down
2 changes: 1 addition & 1 deletion controllers/clusters/kafkaconnect_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ var _ = Describe("Kafka Connect Controller", func() {
<-done

By("creating secret with the default user credentials")
secret := kafkaConnect.NewDefaultUserSecret("", "")
secret := newDefaultUserSecret("", "", kafkaConnect.Name, kafkaConnectManifest.Namespace)
secretNamespacedName := types.NamespacedName{
Namespace: secret.Namespace,
Name: secret.Name,
Expand Down
2 changes: 1 addition & 1 deletion controllers/clusters/zookeeper_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ func (r *ZookeeperReconciler) createDefaultSecret(ctx context.Context, zk *v1bet
}

patch := zk.NewPatch()
secret := zk.NewDefaultUserSecret(username, password)
secret := newDefaultUserSecret(username, password, zk.Name, zk.Namespace)
err = r.Create(ctx, secret)
if err != nil {
l.Error(err, "Cannot create secret with default user credentials",
Expand Down
2 changes: 1 addition & 1 deletion controllers/clusters/zookeeper_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ var _ = Describe("Zookeeper Controller", func() {
<-done

By("creating secret with the default user credentials")
secret := zookeeper.NewDefaultUserSecret("", "")
secret := newDefaultUserSecret("", "", zookeeper.Name, zookeeper.Namespace)
secretNamespacedName := types.NamespacedName{
Namespace: secret.Namespace,
Name: secret.Name,
Expand Down

0 comments on commit 0785828

Please sign in to comment.