Skip to content

Commit

Permalink
feat(postgresql-database): enforce database max length with kubebuild…
Browse files Browse the repository at this point in the history
…er validation instead of doing it in reconciliation loop
  • Loading branch information
duizabojul committed Oct 19, 2022
1 parent fb44c62 commit 0d4e9d7
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 28 deletions.
18 changes: 18 additions & 0 deletions apis/postgresql/v1alpha1/postgresqldatabase_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,19 @@ type PostgresqlDatabaseSpec struct {
// +required
// +kubebuilder:validation:Required
// +kubebuilder:validation:MinLength=1
// +kubebuilder:validation:MaxLength=56
Database string `json:"database"`
// Master role name will be used to create top group role.
// Database owner and users will be in this group role.
// +optional
// +kubebuilder:validation:MaxLength=56
MasterRole string `json:"masterRole,omitempty"`
// Should drop database on Custom Resource deletion ?
// +optional
DropOnDelete bool `json:"dropOnDelete,omitempty"`
// link to configmap to run on database creation
// +optional
InitScript *ConfigMapValueLink `json:"initScript,omitempty"`
// Wait for linked resource to be deleted
// +optional
WaitLinkedResourcesDeletion bool `json:"waitLinkedResourcesDeletion,omitempty"`
Expand All @@ -57,6 +62,19 @@ type PostgresqlDatabaseSpec struct {
EngineConfiguration *CRLink `json:"engineConfiguration"`
}

type ConfigMapValueLink struct {
// ConfigMap name
// +required
// +kubebuilder:validation:Required
Name string `json:"name"`
// ConfigMap namespace
// +optional
Namespace string `json:"namespace,omitempty"`
// ConfigMap key
// +kubebuilder:validation:Required
Key string `json:"key"`
}

type DatabaseModulesList struct {
// Modules list
// +optional
Expand Down
20 changes: 20 additions & 0 deletions apis/postgresql/v1alpha1/zz_generated.deepcopy.go

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

18 changes: 18 additions & 0 deletions config/crd/bases/postgresql.easymile.com_postgresqldatabases.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ spec:
properties:
database:
description: Database name
maxLength: 56
minLength: 1
type: string
dropOnDelete:
Expand Down Expand Up @@ -93,9 +94,26 @@ spec:
type: array
x-kubernetes-list-type: set
type: object
initScript:
description: link to configmap to run on database creation
properties:
key:
description: ConfigMap key
type: string
name:
description: ConfigMap name
type: string
namespace:
description: ConfigMap namespace
type: string
required:
- key
- name
type: object
masterRole:
description: Master role name will be used to create top group role.
Database owner and users will be in this group role.
maxLength: 56
type: string
schemas:
description: Schema to create in database
Expand Down
35 changes: 7 additions & 28 deletions controllers/postgresql/postgresqldatabase_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,6 @@ func (r *PostgresqlDatabaseReconciler) Reconcile(ctx context.Context, req ctrl.R
}

updated, err := r.ensureFinalizerAndOwnerReference(ctx, instance, pgEngCfg)
// Check error
if err != nil {
return r.manageError(ctx, reqLogger, instance, originalPatch, err)
}
Expand All @@ -158,31 +157,13 @@ func (r *PostgresqlDatabaseReconciler) Reconcile(ctx context.Context, req ctrl.R
// Create PG instance
pg := utils.CreatePgInstance(reqLogger, secret.Data, pgEngCfg)

// Create all identifiers now to check length
owner := instance.Spec.MasterRole
if owner == "" {
owner = fmt.Sprintf("%s-owner", instance.Spec.Database)
}
reader := fmt.Sprintf("%s-reader", instance.Spec.Database)
writer := fmt.Sprintf("%s-writer", instance.Spec.Database)

// Check identifier length
if len(owner) > postgres.MaxIdentifierLength {
errStr := fmt.Sprintf("identifier too long, must be <= 63, %s is %d character, must reduce master role or database name length", owner, len(owner))

return r.manageError(ctx, reqLogger, instance, originalPatch, errors.NewBadRequest(errStr))
}
if len(reader) > postgres.MaxIdentifierLength {
errStr := fmt.Sprintf("identifier too long, must be <= 63, %s is %d character, must reduce database name length", reader, len(reader))

return r.manageError(ctx, reqLogger, instance, originalPatch, errors.NewBadRequest(errStr))
}
if len(writer) > postgres.MaxIdentifierLength {
errStr := fmt.Sprintf("identifier too long, must be <= 63, %s is %d character, must reduce database name length", writer, len(writer))

return r.manageError(ctx, reqLogger, instance, originalPatch, errors.NewBadRequest(errStr))
}

// Create owner role
err = r.manageOwnerRole(pg, owner, instance)
if err != nil {
Expand Down Expand Up @@ -271,16 +252,14 @@ func (r *PostgresqlDatabaseReconciler) manageDBCreationOrUpdate(pg postgres.PG,
func (r *PostgresqlDatabaseReconciler) manageDropDatabase(logger logr.Logger, instance *postgresqlv1alpha1.PostgresqlDatabase) error {
// Try to find PostgresqlEngineConfiguration CR
pgEngCfg, err := utils.FindPgEngineCfg(r.Client, instance)
if err != nil {
// In case of not found => Can't delete => skip
if errors.IsNotFound(err) {
logger.Error(err, "can't delete database because PostgresEngineConfiguration didn't exists anymore")

return nil
} else {
if err != nil && !errors.IsNotFound(err) {
return err
}
// In case of not found => Can't delete => skip
if errors.IsNotFound(err) {
logger.Error(err, "can't delete database because PostgresEngineConfiguration didn't exists anymore")

return err
}
return nil
}

// Get secret linked to PostgresqlEngineConfiguration CR
Expand Down

0 comments on commit 0d4e9d7

Please sign in to comment.