Skip to content

Commit 1854534

Browse files
committed
controller: handle internal client in provider mode upgrade
Signed-off-by: Rewant Soni <[email protected]>
1 parent 3f085cd commit 1854534

File tree

4 files changed

+92
-29
lines changed

4 files changed

+92
-29
lines changed

controllers/defaults/defaults.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@ const (
2525
// propagated to the associated StorageClasses.
2626
KeyRotationEnableAnnotation = "keyrotation.csiaddons.openshift.io/enable"
2727
// OnboardingTokenKey is the name of the field in the OnboardingSecret data
28-
OnboardingTokenKey = "onboarding-token"
29-
LocalStorageConsumerName = "internal"
28+
OnboardingTokenKey = "onboarding-token"
29+
LocalStorageConsumerName = "internal"
30+
LocalStorageConsumerConfigMapName = "storageconsumer-internal"
3031
// KMSConfigMapName is the name configmap which has KMS config details
3132
KMSConfigMapName = "ocs-kms-connection-details"
3233
)

controllers/storagecluster/storageconsumer.go

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,6 @@ import (
1616
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
1717
)
1818

19-
const (
20-
localStorageConsumerConfigMapName = "storageconsumer-internal"
21-
)
22-
2319
type storageConsumer struct{}
2420

2521
var _ resourceManager = &storageConsumer{}
@@ -35,7 +31,7 @@ func (s *storageConsumer) ensureCreated(r *StorageClusterReconciler, storageClus
3531
}
3632
spec := &storageConsumer.Spec
3733
// will be filled by the consumer controller based on defaults
38-
spec.ResourceNameMappingConfigMap.Name = localStorageConsumerConfigMapName
34+
spec.ResourceNameMappingConfigMap.Name = defaults.LocalStorageConsumerConfigMapName
3935
spec.StorageClasses = []ocsv1a1.StorageClassSpec{
4036
// TODO: after finding virt availability need to send corresponding sc
4137
{Name: util.GenerateNameForCephBlockPoolStorageClass(storageCluster)},
@@ -101,9 +97,14 @@ func (s *storageConsumer) ensureCreated(r *StorageClusterReconciler, storageClus
10197
return ctrl.Result{}, fmt.Errorf("failed to get available services configured in StorageCluster: %v", err)
10298
}
10399
consumerConfigMap := &corev1.ConfigMap{}
104-
consumerConfigMap.Name = localStorageConsumerConfigMapName
100+
consumerConfigMap.Name = defaults.LocalStorageConsumerConfigMapName
105101
consumerConfigMap.Namespace = storageCluster.Namespace
106-
if _, err := controllerutil.CreateOrUpdate(r.ctx, r.Client, consumerConfigMap, func() error {
102+
103+
if err = r.Client.Get(r.ctx, client.ObjectKeyFromObject(consumerConfigMap), consumerConfigMap); client.IgnoreNotFound(err) != nil {
104+
return ctrl.Result{}, err
105+
}
106+
107+
if consumerConfigMap.UID == "" {
107108
data := util.GetStorageConsumerDefaultResourceNames(
108109
defaults.LocalStorageConsumerName,
109110
string(storageConsumer.UID),
@@ -118,9 +119,9 @@ func (s *storageConsumer) ensureCreated(r *StorageClusterReconciler, storageClus
118119
resourceMap.ReplaceNfsClientProfileName("openshift-storage")
119120
// NB: Do we need to allow user changing/overwriting any values in this configmap?
120121
consumerConfigMap.Data = data
121-
return nil
122-
}); err != nil {
123-
return ctrl.Result{}, fmt.Errorf("failed to create/update storageconsumer configmap %s: %v", localStorageConsumerConfigMapName, err)
122+
if err = r.Client.Create(r.ctx, consumerConfigMap); err != nil {
123+
return ctrl.Result{}, fmt.Errorf("failed to create storageconsumer configmap: %v", err)
124+
}
124125
}
125126

126127
return ctrl.Result{}, nil

controllers/storageconsumer/storageconsumer_upgrade_controller.go

Lines changed: 75 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,10 @@ import (
2828

2929
ocsv1 "github.com/red-hat-storage/ocs-operator/api/v4/v1"
3030
ocsv1alpha1 "github.com/red-hat-storage/ocs-operator/api/v4/v1alpha1"
31+
"github.com/red-hat-storage/ocs-operator/v4/controllers/defaults"
3132
"github.com/red-hat-storage/ocs-operator/v4/controllers/util"
3233

34+
ocsclientv1a1 "github.com/red-hat-storage/ocs-client-operator/api/v1alpha1"
3335
rookCephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
3436
corev1 "k8s.io/api/core/v1"
3537
"k8s.io/apimachinery/pkg/api/errors"
@@ -38,6 +40,7 @@ import (
3840
ctrl "sigs.k8s.io/controller-runtime"
3941
"sigs.k8s.io/controller-runtime/pkg/builder"
4042
"sigs.k8s.io/controller-runtime/pkg/client"
43+
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
4144
"sigs.k8s.io/controller-runtime/pkg/event"
4245
"sigs.k8s.io/controller-runtime/pkg/predicate"
4346
"sigs.k8s.io/controller-runtime/pkg/reconcile"
@@ -114,6 +117,19 @@ func (r *StorageConsumerUpgradeReconciler) Reconcile(ctx context.Context, reques
114117
}
115118

116119
consumerConfigMapName := fmt.Sprintf("storageconsumer-%v", util.FnvHash(storageConsumer.Name))
120+
consumerName := storageConsumer.Name
121+
122+
clusterID := util.GetClusterID(ctx, r.Client, &log)
123+
if clusterID == "" {
124+
return reconcile.Result{}, fmt.Errorf("failed to get openshift cluster ID")
125+
}
126+
127+
internalConsumer := clusterID == storageConsumer.Status.Client.ClusterID
128+
129+
if internalConsumer {
130+
consumerConfigMapName = defaults.LocalStorageConsumerConfigMapName
131+
consumerName = defaults.LocalStorageConsumerName
132+
}
117133

118134
if err = r.reconcileConsumerConfigMap(ctx, storageCluster, storageConsumer, consumerConfigMapName); err != nil {
119135
return reconcile.Result{}, err
@@ -123,10 +139,20 @@ func (r *StorageConsumerUpgradeReconciler) Reconcile(ctx context.Context, reques
123139
return reconcile.Result{}, err
124140
}
125141

126-
if err = r.reconcileStorageConsumer(ctx, storageCluster, storageConsumer, consumerConfigMapName); err != nil {
142+
if err = r.reconcileStorageConsumer(ctx, storageCluster, consumerName, consumerConfigMapName); err != nil {
127143
return reconcile.Result{}, err
128144
}
129145

146+
if internalConsumer {
147+
if err = r.reconcileStorageClient(ctx, storageCluster, consumerName); err != nil {
148+
return reconcile.Result{}, err
149+
}
150+
if err = r.Client.Delete(ctx, storageConsumer); err != nil {
151+
return reconcile.Result{}, err
152+
}
153+
util.RestartPod(ctx, r.Client, &log, "ocs-provider-server", storageCluster.Namespace)
154+
}
155+
130156
return reconcile.Result{}, nil
131157
}
132158

@@ -269,24 +295,58 @@ func (r *StorageConsumerUpgradeReconciler) removeStorageRequestOwner(ctx context
269295
return nil
270296
}
271297

272-
func (r *StorageConsumerUpgradeReconciler) reconcileStorageConsumer(ctx context.Context, storageCluster *ocsv1.StorageCluster, storageConsumer *ocsv1alpha1.StorageConsumer, consumerConfigMapName string) error {
273-
spec := &storageConsumer.Spec
274-
spec.ResourceNameMappingConfigMap.Name = consumerConfigMapName
275-
spec.StorageClasses = []ocsv1alpha1.StorageClassSpec{
276-
{Name: util.GenerateNameForCephBlockPoolStorageClass(storageCluster)},
277-
{Name: util.GenerateNameForCephFilesystemStorageClass(storageCluster)},
298+
func (r *StorageConsumerUpgradeReconciler) reconcileStorageConsumer(
299+
ctx context.Context,
300+
storageCluster *ocsv1.StorageCluster,
301+
consumerName, consumerConfigMapName string,
302+
) error {
303+
304+
storageConsumer := &ocsv1alpha1.StorageConsumer{}
305+
storageConsumer.Name = consumerName
306+
storageConsumer.Namespace = storageCluster.Namespace
307+
308+
if _, err := controllerutil.CreateOrUpdate(ctx, r.Client, storageConsumer, func() error {
309+
spec := &storageConsumer.Spec
310+
spec.Enable = true
311+
spec.ResourceNameMappingConfigMap.Name = consumerConfigMapName
312+
spec.StorageClasses = []ocsv1alpha1.StorageClassSpec{
313+
{Name: util.GenerateNameForCephBlockPoolStorageClass(storageCluster)},
314+
{Name: util.GenerateNameForCephFilesystemStorageClass(storageCluster)},
315+
}
316+
spec.VolumeSnapshotClasses = []ocsv1alpha1.VolumeSnapshotClassSpec{
317+
{Name: util.GenerateNameForSnapshotClass(storageCluster.Name, util.RbdSnapshotter)},
318+
{Name: util.GenerateNameForSnapshotClass(storageCluster.Name, util.CephfsSnapshotter)},
319+
}
320+
spec.VolumeGroupSnapshotClasses = []ocsv1alpha1.VolumeGroupSnapshotClassSpec{
321+
{Name: util.GenerateNameForGroupSnapshotClass(storageCluster, util.RbdGroupSnapshotter)},
322+
{Name: util.GenerateNameForGroupSnapshotClass(storageCluster, util.CephfsGroupSnapshotter)},
323+
}
324+
util.AddAnnotation(storageConsumer, util.Is419AdjustedAnnotationKey, strconv.FormatBool(true))
325+
return nil
326+
}); err != nil {
327+
return err
278328
}
279-
spec.VolumeSnapshotClasses = []ocsv1alpha1.VolumeSnapshotClassSpec{
280-
{Name: util.GenerateNameForSnapshotClass(storageCluster.Name, util.RbdSnapshotter)},
281-
{Name: util.GenerateNameForSnapshotClass(storageCluster.Name, util.CephfsSnapshotter)},
329+
330+
return nil
331+
}
332+
333+
// reconcileStorageClient Updates the status of the internal client to point to the new consumer
334+
func (r *StorageConsumerUpgradeReconciler) reconcileStorageClient(ctx context.Context, storageCluster *ocsv1.StorageCluster, consumerName string) error {
335+
storageConsumer := &ocsv1alpha1.StorageConsumer{}
336+
storageConsumer.Name = consumerName
337+
storageConsumer.Namespace = storageCluster.Namespace
338+
if err := r.Client.Get(ctx, client.ObjectKeyFromObject(storageConsumer), storageConsumer); err != nil {
339+
return err
282340
}
283-
spec.VolumeGroupSnapshotClasses = []ocsv1alpha1.VolumeGroupSnapshotClassSpec{
284-
{Name: util.GenerateNameForGroupSnapshotClass(storageCluster, util.RbdGroupSnapshotter)},
285-
{Name: util.GenerateNameForGroupSnapshotClass(storageCluster, util.CephfsGroupSnapshotter)},
341+
342+
storageClient := &ocsclientv1a1.StorageClient{}
343+
storageClient.Name = storageCluster.Name
344+
if err := r.Client.Get(ctx, client.ObjectKeyFromObject(storageClient), storageClient); err != nil {
345+
return err
286346
}
287-
util.AddAnnotation(storageConsumer, util.Is419AdjustedAnnotationKey, strconv.FormatBool(true))
288347

289-
if err := r.Client.Update(ctx, storageConsumer); client.IgnoreNotFound(err) != nil {
348+
storageClient.Status.ConsumerID = string(storageConsumer.UID)
349+
if err := r.Client.Status().Update(ctx, storageClient); err != nil {
290350
return err
291351
}
292352
return nil

metrics/vendor/github.com/red-hat-storage/ocs-operator/v4/controllers/defaults/defaults.go

Lines changed: 3 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)