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

EVEREST-496 Multi namespace support #169

Merged
merged 42 commits into from
Nov 23, 2023
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
759eed9
EVEREST-496 Playing with reconcilers
gen1us2k Nov 16, 2023
88dd7e3
EVEREST-496 Playing with reconcilers
gen1us2k Nov 16, 2023
7e9e48c
EVEREST-496 still playing
gen1us2k Nov 17, 2023
55b714c
EVEREST-496 cool stuff
gen1us2k Nov 17, 2023
14f2728
EVEREST-496 added controllers
gen1us2k Nov 20, 2023
df8be18
EVEREST-496 Reconcile backup storages
gen1us2k Nov 20, 2023
008a5dc
EVEREST-496 handle deletion of secrets
gen1us2k Nov 21, 2023
7cb42e8
EVEREST-496 small refactoring
gen1us2k Nov 21, 2023
652ba32
EVEREST-496 check existence of the namespaces
gen1us2k Nov 21, 2023
52e7724
EVEREST-496 multins support for engines
gen1us2k Nov 21, 2023
6c22ac2
EVEREST-496 Working PoC for the secrets management
gen1us2k Nov 21, 2023
dd69de2
EVEREST-496 Fixed cleanup logic
gen1us2k Nov 22, 2023
4778a0e
EVEREST-496 cleanup
gen1us2k Nov 22, 2023
5e3f826
EVEREST-496 Small fixes
gen1us2k Nov 22, 2023
8800abd
EVEREST-496 linter fixes
gen1us2k Nov 22, 2023
286f2df
Merge
gen1us2k Nov 22, 2023
287d472
Merge
gen1us2k Nov 22, 2023
4d36502
Merge
gen1us2k Nov 22, 2023
266a998
Missed controller
gen1us2k Nov 22, 2023
d6bcee9
EVEREST-496 Fixed build
gen1us2k Nov 23, 2023
b8d4f4e
EVEREST-496 Fixed build
gen1us2k Nov 23, 2023
e60d5b0
Update controllers/databasecluster_controller.go
gen1us2k Nov 23, 2023
1b96a72
Update controllers/databasecluster_controller.go
gen1us2k Nov 23, 2023
3f438e8
Update controllers/databasecluster_controller.go
gen1us2k Nov 23, 2023
0d7c3e1
Update controllers/databasecluster_controller.go
gen1us2k Nov 23, 2023
23e5614
EVEREST-496 shut up linter
gen1us2k Nov 23, 2023
4a72d33
EVEREST-496 tests
gen1us2k Nov 23, 2023
0a4bf34
EVEREST-496 tests
gen1us2k Nov 23, 2023
a730a5b
EVEREST-496 Fixed build
gen1us2k Nov 23, 2023
240fb5a
EVEREST-496 psmdb tests
gen1us2k Nov 23, 2023
31b8745
EVEREST-496 psmdb tests
gen1us2k Nov 23, 2023
56c2fbf
EVEREST-496 restore pipeline
gen1us2k Nov 23, 2023
939796c
EVEREST-496 release
gen1us2k Nov 23, 2023
c1540d9
Revert "EVEREST-496 restore pipeline"
gen1us2k Nov 23, 2023
17b625b
u
gen1us2k Nov 23, 2023
acfd53e
EVEREST-496 cleanup backupstorages
gen1us2k Nov 23, 2023
af30eef
EVEREST-496 u
gen1us2k Nov 23, 2023
2a6aba0
u
gen1us2k Nov 23, 2023
2b7528b
Revert "EVEREST-496 cleanup backupstorages"
gen1us2k Nov 23, 2023
2fbe058
u
gen1us2k Nov 23, 2023
3535b3e
Revert "Revert "EVEREST-496 restore pipeline""
gen1us2k Nov 23, 2023
c0418a8
u
gen1us2k Nov 23, 2023
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
24 changes: 23 additions & 1 deletion api/v1alpha1/backupstorage_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,14 @@ type BackupStorageSpec struct {
Description string `json:"description,omitempty"`
// CredentialsSecretName is the name of the secret with credentials.
CredentialsSecretName string `json:"credentialsSecretName"`
// TargetNamespaces is the list of namespaces where the operator will copy secrets provided in the CredentialsSecretsName.
TargetNamespaces []string `json:"targetNamespaces"`
gen1us2k marked this conversation as resolved.
Show resolved Hide resolved
}

// BackupStorageStatus defines the observed state of BackupStorage.
type BackupStorageStatus struct{}
type BackupStorageStatus struct {
Namespaces map[string]bool `json:"usedNamespaces"`
gen1us2k marked this conversation as resolved.
Show resolved Hide resolved
}

//+kubebuilder:object:root=true
//+kubebuilder:subresource:status
Expand All @@ -74,3 +78,21 @@ type BackupStorageList struct {
func init() {
SchemeBuilder.Register(&BackupStorage{}, &BackupStorageList{})
}
func (b *BackupStorage) UpdateNamespacesList(namespace string) {
if b.Status.Namespaces == nil {
b.Status.Namespaces = make(map[string]bool)
}
b.Status.Namespaces[namespace] = true
oksana-grishchenko marked this conversation as resolved.
Show resolved Hide resolved
}
func (b *BackupStorage) IsNamespaceAllowed(namespace string) bool {
oksana-grishchenko marked this conversation as resolved.
Show resolved Hide resolved
if len(b.Spec.TargetNamespaces) == 0 {
return true
}
for _, ns := range b.Spec.TargetNamespaces {
ns := ns
if ns == namespace {
return true
}
}
return false
}
7 changes: 6 additions & 1 deletion api/v1alpha1/zz_generated.deepcopy.go

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

2 changes: 1 addition & 1 deletion config/manager/manager.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ spec:
cpu: 10m
memory: 64Mi
env:
- name: WATCH_NAMESPACE
- name: EVEREST_NAMESPACE
gen1us2k marked this conversation as resolved.
Show resolved Hide resolved
valueFrom:
fieldRef:
fieldPath: metadata.namespace
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,9 @@ spec:
type: OwnNamespace
- supported: true
type: SingleNamespace
- supported: false
type: MultiNamespace
- supported: true
gen1us2k marked this conversation as resolved.
Show resolved Hide resolved
type: MultiNamespace
- supported: false
type: AllNamespaces
keywords:
- everest
Expand Down
36 changes: 35 additions & 1 deletion controllers/databasecluster_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,8 @@ var (
// DatabaseClusterReconciler reconciles a DatabaseCluster object.
type DatabaseClusterReconciler struct {
client.Client
Scheme *runtime.Scheme
Scheme *runtime.Scheme
everestNamespace string
gen1us2k marked this conversation as resolved.
Show resolved Hide resolved
}

//+kubebuilder:rbac:groups=everest.percona.com,resources=databaseclusters,verbs=get;list;watch;create;update;patch;delete
Expand Down Expand Up @@ -329,6 +330,12 @@ func (r *DatabaseClusterReconciler) genPSMDBBackupSpec(
if err != nil {
return psmdbv1.BackupSpec{Enabled: false}, errors.Join(err, fmt.Errorf("failed to get backup storage %s", backup.Spec.BackupStorageName))
}
if database.Namespace != r.everestNamespace {
if err := r.reconcileSecret(ctx, backupStorage, database); err != nil {
gen1us2k marked this conversation as resolved.
Show resolved Hide resolved
return psmdbv1.BackupSpec{Enabled: false}, err
}

}

switch backupStorage.Spec.Type {
case everestv1alpha1.BackupStorageTypeS3:
Expand Down Expand Up @@ -2614,6 +2621,9 @@ func (r *DatabaseClusterReconciler) addPGToScheme(scheme *runtime.Scheme) error
builder := runtime.NewSchemeBuilder(r.addPGKnownTypes)
return builder.AddToScheme(scheme)
}
func (r *DatabaseClusterReconciler) SetEverestNamespace(namespace string) {
r.everestNamespace = namespace
}

// SetupWithManager sets up the controller with the Manager.
func (r *DatabaseClusterReconciler) SetupWithManager(mgr ctrl.Manager) error {
Expand Down Expand Up @@ -3234,3 +3244,27 @@ func (r *DatabaseClusterReconciler) defaultPSMDBSpec() *psmdbv1.PerconaServerMon
},
}
}
func (r *DatabaseClusterReconciler) reconcileSecret(ctx context.Context, backupStorage *everestv1alpha1.BackupStorage, database *everestv1alpha1.DatabaseCluster) error {
secret := &corev1.Secret{}
err := r.Get(ctx, types.NamespacedName{Name: backupStorage.Spec.CredentialsSecretName, Namespace: database.Namespace}, secret)
if err != nil && !k8serrors.IsNotFound(err) {
return err
}
err = r.Get(ctx, types.NamespacedName{Name: backupStorage.Spec.CredentialsSecretName, Namespace: r.everestNamespace}, secret)
oksana-grishchenko marked this conversation as resolved.
Show resolved Hide resolved
if err != nil {
return err
}
secret.Namespace = database.Namespace
if !backupStorage.IsNamespaceAllowed(database.Namespace) {
return fmt.Errorf("%s namespace is not allowed to use for %s backup storage", database.Namespace, backupStorage.Name)
gen1us2k marked this conversation as resolved.
Show resolved Hide resolved
}
err = r.Create(ctx, secret)
if err != nil {
return err
}
backupStorage.UpdateNamespacesList(database.Namespace)
if err := r.Status().Update(ctx, backupStorage); err != nil {
return err
}
return nil
}
29 changes: 23 additions & 6 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,12 @@ import (
"flag"
"fmt"
"os"
"strings"

"k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
clientgoscheme "k8s.io/client-go/kubernetes/scheme"

// Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.)
// to ensure that exec-entrypoint and run can make use of them.
_ "k8s.io/client-go/plugin/pkg/client/auth"
Expand All @@ -40,7 +42,10 @@ import (
"github.com/percona/everest-operator/controllers"
)

const watchNamespaceEnvVar = "WATCH_NAMESPACE"
const (
everestNamespaceEnvVar = "EVEREST_NAMESPACE"
watchNamespacesEnvVar = "WATCH_NAMESPACES"
)

var (
scheme = runtime.NewScheme()
Expand Down Expand Up @@ -70,12 +75,23 @@ func main() {
flag.Parse()

ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts)))
ns, found := os.LookupEnv(watchNamespaceEnvVar)
ns, found := os.LookupEnv(everestNamespaceEnvVar)
if !found {
setupLog.Error(errors.New("failed to get namespace"), fmt.Sprintf("%s must be set", watchNamespaceEnvVar))
setupLog.Error(errors.New("failed to get everest watch namespace namespace"), fmt.Sprintf("%s must be set", everestNamespaceEnvVar))

os.Exit(1)
}
rawNamespaces, found := os.LookupEnv(watchNamespacesEnvVar)
if !found {
setupLog.Error(errors.New("failed to get everest watch namespace namespace"), fmt.Sprintf("%s must be set", everestNamespaceEnvVar))

}
cacheConfig := map[string]cache.Config{
ns: {},
}
for _, ns := range strings.Split(rawNamespaces, ",") {
cacheConfig[ns] = cache.Config{}
}

mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
Scheme: scheme,
Expand Down Expand Up @@ -106,14 +122,15 @@ func main() {
setupLog.Error(err, "unable to start manager")
os.Exit(1)
}

if err = (&controllers.DatabaseClusterReconciler{
dbReconciler := &controllers.DatabaseClusterReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
}).SetupWithManager(mgr); err != nil {
}
if err := dbReconciler.SetupWithManager(mgr); err != nil {
gen1us2k marked this conversation as resolved.
Show resolved Hide resolved
setupLog.Error(err, "unable to create controller", "controller", "DatabaseCluster")
os.Exit(1)
}
dbReconciler.SetEverestNamespace(ns)
if err = (&controllers.DatabaseEngineReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Expand Down