Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
19 changes: 14 additions & 5 deletions cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ func newManager(options *ctrl.Options) (ctrl.Manager, error) {

func setupReconcilers(mgr ctrl.Manager, ramenConfig *ramendrv1alpha1.RamenConfig) {
if controllers.ControllerType == ramendrv1alpha1.DRHubType {
setupReconcilersHub(mgr)
setupReconcilersHub(mgr, ramenConfig)
}

if controllers.ControllerType == ramendrv1alpha1.DRClusterType {
Expand Down Expand Up @@ -196,7 +196,7 @@ func setupReconcilersCluster(mgr ctrl.Manager, ramenConfig *ramendrv1alpha1.Rame
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Log: ctrl.Log.WithName("rgd"),
}).SetupWithManager(mgr); err != nil {
}).SetupWithManager(mgr, ramenConfig); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "ReplicationGroupDestination")
os.Exit(1)
}
Expand All @@ -206,14 +206,14 @@ func setupReconcilersCluster(mgr ctrl.Manager, ramenConfig *ramendrv1alpha1.Rame
APIReader: mgr.GetAPIReader(),
Scheme: mgr.GetScheme(),
Log: ctrl.Log.WithName("rgs"),
}).SetupWithManager(mgr); err != nil {
}).SetupWithManager(mgr, ramenConfig); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "ReplicationGroupSource")
os.Exit(1)
}
}
}

func setupReconcilersHub(mgr ctrl.Manager) {
func setupReconcilersHub(mgr ctrl.Manager, ramenConfig *ramendrv1alpha1.RamenConfig) {
if err := (&controllers.DRPolicyReconciler{
Client: mgr.GetClient(),
APIReader: mgr.GetAPIReader(),
Expand Down Expand Up @@ -255,7 +255,7 @@ func setupReconcilersHub(mgr ctrl.Manager) {
Scheme: mgr.GetScheme(),
Callback: func(string, string) {},
ObjStoreGetter: controllers.S3ObjectStoreGetter(),
}).SetupWithManager(mgr); err != nil {
}).SetupWithManager(mgr, ramenConfig); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "DRPlacementControl")
os.Exit(1)
}
Expand Down Expand Up @@ -286,6 +286,15 @@ func main() {
os.Exit(1)
}

if os.Getenv("RAMEN_CONTROLLER_TYPE") != "" {
_, ramenConfig, err = controllers.GetOrCreateConfigMap(context.Background(), mgr.GetClient(),
mgr.GetAPIReader(), ramenConfig, setupLog)
if err != nil {
setupLog.Error(err, "unable to ensure ramen config ConfigMap exists")
os.Exit(1)
}
}

setupReconcilers(mgr, ramenConfig)

// +kubebuilder:scaffold:builder
Expand Down
18 changes: 14 additions & 4 deletions config/dr-cluster/manager/kustomization.yaml
Original file line number Diff line number Diff line change
@@ -1,13 +1,23 @@
resources:
- ../../manager/manager.yaml

patches:
- patch: |-
- op: add
path: /spec/template/spec/containers/0/env/-
value:
name: RAMEN_CONTROLLER_TYPE
value: dr-cluster
target:
group: apps
kind: Deployment
name: operator
namespace: system
version: v1

generatorOptions:
disableNameSuffixHash: true

configMapGenerator:
- files:
- ramen_manager_config.yaml
name: operator-config
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
images:
Expand Down
18 changes: 14 additions & 4 deletions config/hub/manager/kustomization.yaml
Original file line number Diff line number Diff line change
@@ -1,15 +1,25 @@
resources:
- ../../manager/manager.yaml

patches:
- patch: |-
- op: add
path: /spec/template/spec/containers/0/env/-
value:
name: RAMEN_CONTROLLER_TYPE
value: dr-hub
target:
group: apps
kind: Deployment
name: operator
namespace: system
version: v1

generatorOptions:
disableNameSuffixHash: true
labels:
cluster.open-cluster-management.io/backup: resource

configMapGenerator:
- files:
- ramen_manager_config.yaml
name: operator-config
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
images:
Expand Down
4 changes: 2 additions & 2 deletions internal/controller/drplacementcontrol_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,8 @@ type DRPlacementControlReconciler struct {
// SetupWithManager sets up the controller with the Manager.
//
//nolint:funlen
func (r *DRPlacementControlReconciler) SetupWithManager(mgr ctrl.Manager) error {
return r.setupWithManagerAndAddWatchers(mgr)
func (r *DRPlacementControlReconciler) SetupWithManager(mgr ctrl.Manager, ramenConfig *rmn.RamenConfig) error {
return r.setupWithManagerAndAddWatchers(mgr, ramenConfig)
}

//nolint:lll
Expand Down
6 changes: 4 additions & 2 deletions internal/controller/drplacementcontrol_watcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -594,7 +594,9 @@ func (r *DRPlacementControlReconciler) FilterDRPCsForDRPolicyUpdate(drpolicy *rm
}

//nolint:funlen
func (r *DRPlacementControlReconciler) setupWithManagerAndAddWatchers(mgr ctrl.Manager) error {
func (r *DRPlacementControlReconciler) setupWithManagerAndAddWatchers(mgr ctrl.Manager,
ramenConfig *rmn.RamenConfig,
) error {
mwPred := ManifestWorkPredicateFunc()

mwMapFun := handler.EnqueueRequestsFromMapFunc(handler.MapFunc(
Expand Down Expand Up @@ -682,7 +684,7 @@ func (r *DRPlacementControlReconciler) setupWithManagerAndAddWatchers(mgr ctrl.M
r.eventRecorder = rmnutil.NewEventReporter(mgr.GetEventRecorderFor("controller_DRPlacementControl"))

options := ctrlcontroller.Options{
MaxConcurrentReconciles: getMaxConcurrentReconciles(ctrl.Log),
MaxConcurrentReconciles: getMaxConcurrentReconciles(ramenConfig),
}
if r.RateLimiter != nil {
options.RateLimiter = *r.RateLimiter
Expand Down
118 changes: 115 additions & 3 deletions internal/controller/ramenconfig.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,10 @@ import (

"github.com/go-logr/logr"
corev1 "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"
configv1alpha1 "k8s.io/component-base/config/v1alpha1"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/yaml"
Expand Down Expand Up @@ -50,9 +52,71 @@ var ControllerType ramendrv1alpha1.ControllerType

var cachedRamenConfigFileName string

func defaultRamenConfig(controllerType ramendrv1alpha1.ControllerType) *ramendrv1alpha1.RamenConfig {
cfg := &ramendrv1alpha1.RamenConfig{}

cfg.MaxConcurrentReconciles = 50
cfg.TypeMeta.APIVersion = ramendrv1alpha1.GroupVersion.String()
cfg.TypeMeta.Kind = "RamenConfig"

cfg.Health.HealthProbeBindAddress = ":8081"
cfg.Metrics.BindAddress = "127.0.0.1:9289"

if cfg.LeaderElection == nil {
cfg.LeaderElection = &configv1alpha1.LeaderElectionConfiguration{}
}

leaderElect := true
cfg.LeaderElection.LeaderElect = &leaderElect

switch controllerType {
case ramendrv1alpha1.DRHubType:
cfg.LeaderElection.ResourceName = HubLeaderElectionResourceName
case ramendrv1alpha1.DRClusterType:
cfg.LeaderElection.ResourceName = drClusterLeaderElectionResourceName
default:
panic(fmt.Sprintf("unknown controller type %q", controllerType))
}

cfg.RamenControllerType = controllerType

cfg.DrClusterOperator.ChannelName = drClusterOperatorChannelNameDefault
cfg.DrClusterOperator.PackageName = drClusterOperatorPackageNameDefault
cfg.DrClusterOperator.CatalogSourceName = drClusterOperatorCatalogSourceNameDefault
cfg.DrClusterOperator.DeploymentAutomationEnabled = true
cfg.DrClusterOperator.S3SecretDistributionEnabled = true

cfg.KubeObjectProtection.VeleroNamespaceName = VeleroNamespaceNameDefault
cfg.VolSync.DestinationCopyMethod = "Direct"
cfg.VolSync.Disabled = false

cfg.RamenOpsNamespace = "ramen-ops"
cfg.VolumeUnprotectionEnabled = true

cfg.MultiNamespace.FeatureEnabled = true
cfg.MultiNamespace.VolsyncSupported = true

return cfg
}

func LoadControllerConfig(configFile string,
log logr.Logger,
) (ramenConfig *ramendrv1alpha1.RamenConfig) {
controllerType := os.Getenv("RAMEN_CONTROLLER_TYPE")
if controllerType != "" {
ct := ramendrv1alpha1.ControllerType(os.Getenv("RAMEN_CONTROLLER_TYPE"))
if ct != ramendrv1alpha1.DRHubType && ct != ramendrv1alpha1.DRClusterType {
panic(fmt.Errorf("invalid controller type specified (%s), should be one of [%s|%s]",
ct, ramendrv1alpha1.DRHubType, ramendrv1alpha1.DRClusterType))
}

log.Info("loading Ramen configuration from defaults")

ramenConfig = defaultRamenConfig(ct)

return
}

if configFile == "" {
log.Info("Ramen config file not specified")

Expand Down Expand Up @@ -188,11 +252,10 @@ func s3StoreProfileFormatCheck(s3StoreProfile *ramendrv1alpha1.S3StoreProfile) (
return nil
}

func getMaxConcurrentReconciles(log logr.Logger) int {
func getMaxConcurrentReconciles(ramenConfig *ramendrv1alpha1.RamenConfig) int {
const defaultMaxConcurrentReconciles = 1

ramenConfig, err := ReadRamenConfigFile(log)
if err != nil {
if ramenConfig == nil {
return defaultMaxConcurrentReconciles
}

Expand All @@ -203,6 +266,55 @@ func getMaxConcurrentReconciles(log logr.Logger) int {
return ramenConfig.MaxConcurrentReconciles
}

func GetOrCreateConfigMap(
ctx context.Context,
c client.Client,
r client.Reader,
defaultRamenConfig *ramendrv1alpha1.RamenConfig,
log logr.Logger,
) (configMap *corev1.ConfigMap, ramenConfig *ramendrv1alpha1.RamenConfig, err error) {
configMapName := HubOperatorConfigMapName
if ControllerType != ramendrv1alpha1.DRHubType {
configMapName = DrClusterOperatorConfigMapName
}

configMap = &corev1.ConfigMap{}
key := types.NamespacedName{
Namespace: RamenOperatorNamespace(),
Name: configMapName,
}

//nolint:nestif
if err = r.Get(ctx, key, configMap); err != nil {
if !k8serrors.IsNotFound(err) {
return
}

var newCM *corev1.ConfigMap

newCM, err = ConfigMapNew(key.Namespace, key.Name, defaultRamenConfig)
if err != nil {
return
}

if err = c.Create(ctx, newCM); err != nil {
if !k8serrors.IsAlreadyExists(err) {
return
}
}

if err = r.Get(ctx, key, configMap); err != nil {
return
}
}

// Parse and return the config from the CM we ended up with
ramenConfig = &ramendrv1alpha1.RamenConfig{}
err = yaml.Unmarshal([]byte(configMap.Data[ConfigMapRamenConfigKeyName]), ramenConfig)

return
}

func ConfigMapNew(
namespaceName string,
name string,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,9 @@ func (r *ReplicationGroupDestinationReconciler) Reconcile(ctx context.Context, r
}

// SetupWithManager sets up the controller with the Manager.
func (r *ReplicationGroupDestinationReconciler) SetupWithManager(mgr ctrl.Manager) error {
func (r *ReplicationGroupDestinationReconciler) SetupWithManager(mgr ctrl.Manager,
ramenConfig *ramendrv1alpha1.RamenConfig,
) error {
vsMapFun := handler.EnqueueRequestsFromMapFunc(handler.MapFunc(
func(ctx context.Context, obj client.Object) []reconcile.Request {
if rgdName, ok := obj.GetLabels()[util.RGDOwnerLabel]; ok {
Expand All @@ -121,7 +123,7 @@ func (r *ReplicationGroupDestinationReconciler) SetupWithManager(mgr ctrl.Manage

return ctrl.NewControllerManagedBy(mgr).
WithOptions(ctrlcontroller.Options{
MaxConcurrentReconciles: getMaxConcurrentReconciles(ctrl.Log),
MaxConcurrentReconciles: getMaxConcurrentReconciles(ramenConfig),
}).
Owns(&volsyncv1alpha1.ReplicationDestination{}).
For(&ramendrv1alpha1.ReplicationGroupDestination{}).
Expand Down
6 changes: 4 additions & 2 deletions internal/controller/replicationgroupsource_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -151,14 +151,16 @@ func (r *ReplicationGroupSourceReconciler) Reconcile(ctx context.Context, req ct
}

// SetupWithManager sets up the controller with the Manager.
func (r *ReplicationGroupSourceReconciler) SetupWithManager(mgr ctrl.Manager) error {
func (r *ReplicationGroupSourceReconciler) SetupWithManager(mgr ctrl.Manager,
ramenConfig *ramendrv1alpha1.RamenConfig,
) error {
if util.IsCRDInstalled(context.TODO(), r.APIReader, util.VGSCRDPrivateName) {
r.volumeGroupSnapshotCRsAreWatched = true
}

builder := ctrl.NewControllerManagedBy(mgr).
WithOptions(ctrlcontroller.Options{
MaxConcurrentReconciles: getMaxConcurrentReconciles(ctrl.Log),
MaxConcurrentReconciles: getMaxConcurrentReconciles(ramenConfig),
}).
Owns(&corev1.PersistentVolumeClaim{}).
Owns(&volsyncv1alpha1.ReplicationSource{}).
Expand Down
2 changes: 1 addition & 1 deletion internal/controller/suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -397,7 +397,7 @@ var _ = BeforeSuite(func() {
ObjStoreGetter: fakeObjectStoreGetter{},
RateLimiter: &rateLimiter,
})
err = drpcReconciler.SetupWithManager(k8sManager)
err = drpcReconciler.SetupWithManager(k8sManager, ramenConfig)
Expect(err).ToNot(HaveOccurred())

ctx, cancel = context.WithCancel(context.TODO())
Expand Down
2 changes: 1 addition & 1 deletion internal/controller/volumereplicationgroup_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ func (r *VolumeReplicationGroupReconciler) SetupWithManager(

ctrlBuilder := ctrl.NewControllerManagedBy(mgr).
WithOptions(ctrlcontroller.Options{
MaxConcurrentReconciles: getMaxConcurrentReconciles(r.Log),
MaxConcurrentReconciles: getMaxConcurrentReconciles(ramenConfig),
RateLimiter: rateLimiter,
}).
For(&ramendrv1alpha1.VolumeReplicationGroup{},
Expand Down
Loading