diff --git a/PendingReleaseNotes.md b/PendingReleaseNotes.md index 7f5538831..8a36e4f80 100644 --- a/PendingReleaseNotes.md +++ b/PendingReleaseNotes.md @@ -12,3 +12,5 @@ being managed by the same Rook operator. Concurrency is enabled by increasing the operator setting `ROOK_RECONCILE_CONCURRENT_CLUSTERS` to a value greater than `1`. +- Improved logging with namespaced names for the controllers for more consistency in + troubleshooting the rook operator log. diff --git a/pkg/operator/ceph/client/controller.go b/pkg/operator/ceph/client/controller.go index a64baa834..104f77178 100644 --- a/pkg/operator/ceph/client/controller.go +++ b/pkg/operator/ceph/client/controller.go @@ -42,6 +42,7 @@ import ( opcontroller "github.com/rook/rook/pkg/operator/ceph/controller" "github.com/rook/rook/pkg/operator/ceph/reporting" "github.com/rook/rook/pkg/operator/k8sutil" + "github.com/rook/rook/pkg/util/log" v1 "k8s.io/api/core/v1" kerrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -144,11 +145,12 @@ func (r *ReconcileCephClient) Reconcile(context context.Context, request reconci func (r *ReconcileCephClient) reconcile(request reconcile.Request) (reconcile.Result, cephv1.CephClient, error) { // Fetch the CephClient instance + nsName := opcontroller.NsName(request.Namespace, request.Name) cephClient := &cephv1.CephClient{} err := r.client.Get(r.opManagerContext, request.NamespacedName, cephClient) if err != nil { if kerrors.IsNotFound(err) { - logger.Debug("cephClient resource not found. Ignoring since object must be deleted.") + log.NamedDebug(nsName, logger, "cephClient resource not found. Ignoring since object must be deleted.") return reconcile.Result{}, *cephClient, nil } // Error reading the object - requeue the request. @@ -165,7 +167,7 @@ func (r *ReconcileCephClient) reconcile(request reconcile.Request) (reconcile.Re return reconcile.Result{}, *cephClient, errors.Wrap(err, "failed to add finalizer") } if generationUpdated { - logger.Infof("reconciling the cephclient %q after adding finalizer", cephClient.Name) + log.NamedInfo(request.NamespacedName, logger, "reconciling the cephclient after adding finalizer") return reconcile.Result{}, *cephClient, nil } @@ -212,7 +214,7 @@ func (r *ReconcileCephClient) reconcile(request reconcile.Request) (reconcile.Re // DELETE: the CR was deleted if !cephClient.GetDeletionTimestamp().IsZero() { - logger.Debugf("deleting client %q", cephClient.Name) + log.NamedDebug(request.NamespacedName, logger, "deleting client") err := r.deleteClient(cephClient) if err != nil { return reconcile.Result{}, *cephClient, errors.Wrapf(err, "failed to delete ceph client %q", cephClient.Name) @@ -240,7 +242,7 @@ func (r *ReconcileCephClient) reconcile(request reconcile.Request) (reconcile.Re runningCephVersion, err := cephclient.LeastUptodateDaemonVersion(r.context, r.clusterInfo, config.MonType) if err != nil { if strings.Contains(err.Error(), opcontroller.UninitializedCephConfigError) { - logger.Info(opcontroller.OperatorNotInitializedMessage) + log.NamedInfo(nsName, logger, opcontroller.OperatorNotInitializedMessage) return opcontroller.WaitForRequeueIfOperatorNotInitialized, *cephClient, nil } return reconcile.Result{}, *cephClient, errors.Wrapf(err, "failed to retrieve current ceph %q version", config.MonType) @@ -256,7 +258,7 @@ func (r *ReconcileCephClient) reconcile(request reconcile.Request) (reconcile.Re err = r.createOrUpdateClient(cephClient, shouldRotateCephxKeys) if err != nil { if strings.Contains(err.Error(), opcontroller.UninitializedCephConfigError) { - logger.Info(opcontroller.OperatorNotInitializedMessage) + log.NamedInfo(nsName, logger, opcontroller.OperatorNotInitializedMessage) return opcontroller.WaitForRequeueIfOperatorNotInitialized, *cephClient, nil } var nilCephxStatus *cephv1.CephxStatus = nil // leave cephx status as-is @@ -276,14 +278,15 @@ func (r *ReconcileCephClient) reconcile(request reconcile.Request) (reconcile.Re } // Return and do not requeue - logger.Debug("done reconciling") + log.NamedDebug(nsName, logger, "done reconciling") return reconcile.Result{}, *cephClient, nil } // Create the client func (r *ReconcileCephClient) createOrUpdateClient(cephClient *cephv1.CephClient, shouldRotateCephxKeys bool) error { clientName := getClientName(cephClient) - logger.Infof("creating client %s in namespace %s", clientName, cephClient.Namespace) + nsName := opcontroller.NsName(cephClient.Namespace, cephClient.Name) + log.NamedInfo(nsName, logger, "creating client %s in namespace %s", clientName, cephClient.Namespace) // Generate the CephX details clientEntity, caps := genClientEntity(cephClient) @@ -304,7 +307,7 @@ func (r *ReconcileCephClient) createOrUpdateClient(cephClient *cephv1.CephClient if shouldRotateCephxKeys { // rotate the CephX key if the user requested it - logger.Infof("rotating cephx key for CephClient %v", types.NamespacedName{Name: cephClient.Name, Namespace: cephClient.Namespace}) + log.NamedInfo(nsName, logger, "rotating cephx key for CephClient %v", types.NamespacedName{Name: cephClient.Name, Namespace: cephClient.Namespace}) rotatedKey, err := cephclient.AuthRotate(r.context, r.clusterInfo, clientEntity) if err != nil { @@ -359,12 +362,12 @@ func (r *ReconcileCephClient) reconcileCephClientSecret( } if kerrors.IsNotFound(getSecretErr) { - logger.Debugf("creating secret %q", secret.Namespace+"/"+secret.Name) + log.NamedDebug(opcontroller.NsName(secret.Namespace, secret.Name), logger, "creating secret") if _, err := r.context.Clientset.CoreV1(). Secrets(secret.Namespace).Create(r.clusterInfo.Context, secret, metav1.CreateOptions{}); err != nil { return errors.Wrapf(err, "failed to create secret %q", secret.Name) } - logger.Infof("created secret for CephClient %q", cephClient.Namespace+"/"+cephClient.Name) + log.NamedInfo(opcontroller.NsName(cephClient.Namespace, cephClient.Name), logger, "created secret for CephClient %q", cephClient.Namespace+"/"+cephClient.Name) return nil } @@ -374,13 +377,14 @@ func (r *ReconcileCephClient) reconcileCephClientSecret( // Delete the client func (r *ReconcileCephClient) deleteClient(cephClient *cephv1.CephClient) error { clientName := getClientName(cephClient) - logger.Infof("deleting client object %q", clientName) + nsName := opcontroller.NsName(cephClient.Namespace, cephClient.Name) + log.NamedInfo(nsName, logger, "deleting client object %q", clientName) if err := cephclient.AuthDelete(r.context, r.clusterInfo, generateClientName(clientName)); err != nil { return errors.Wrapf(err, "failed to delete client %q", clientName) } - logger.Infof("deleted client %q", clientName) + log.NamedInfo(opcontroller.NsName(cephClient.Namespace, cephClient.Name), logger, "deleted client %q", clientName) return nil } @@ -433,10 +437,10 @@ func (r *ReconcileCephClient) updateStatus(observedGeneration int64, name types. cephClient := &cephv1.CephClient{} if err := r.client.Get(r.opManagerContext, name, cephClient); err != nil { if kerrors.IsNotFound(err) { - logger.Debug("CephClient resource not found. Ignoring since object must be deleted.") + log.NamedDebug(name, logger, "CephClient resource not found. Ignoring since object must be deleted.") return nil } - logger.Warningf("failed to retrieve ceph client %q to update status to %q. %v", name, status, err) + log.NamedWarning(name, logger, "failed to retrieve ceph client %q to update status to %q. %v", name, status, err) return errors.Wrapf(err, "failed to retrieve ceph client %q to update status to %q", name, status) } if cephClient.Status == nil { @@ -454,7 +458,7 @@ func (r *ReconcileCephClient) updateStatus(observedGeneration int64, name types. cephClient.Status.Cephx = *cephx } if err := reporting.UpdateStatus(r.client, cephClient); err != nil { - logger.Errorf("failed to set ceph client %q status to %q. %v", name, status, err) + log.NamedError(name, logger, "failed to set ceph client status to %q. %v", status, err) return errors.Wrapf(err, "failed to set ceph client %q status to %q", name, status) } return nil @@ -463,7 +467,7 @@ func (r *ReconcileCephClient) updateStatus(observedGeneration int64, name types. return err } - logger.Debugf("ceph client %q status updated to %q", name, status) + log.NamedDebug(name, logger, "ceph client status updated to %q", status) return nil } diff --git a/pkg/operator/ceph/cluster/controller.go b/pkg/operator/ceph/cluster/controller.go index 960bc8f4d..af1dd2ed8 100644 --- a/pkg/operator/ceph/cluster/controller.go +++ b/pkg/operator/ceph/cluster/controller.go @@ -19,7 +19,6 @@ package cluster import ( "context" - "fmt" "os" "strconv" "sync" @@ -330,10 +329,7 @@ func (r *ReconcileCephCluster) reconcile(request reconcile.Request) (reconcile.R } func (r *ReconcileCephCluster) reconcileDelete(cephCluster *cephv1.CephCluster) (reconcile.Result, cephv1.CephCluster, error) { - nsName := types.NamespacedName{ - Namespace: cephCluster.Namespace, - Name: cephCluster.Name, - } + nsName := opcontroller.NsName(cephCluster.Namespace, cephCluster.Name) var err error // Set the deleting status @@ -433,13 +429,13 @@ func (c *ClusterController) reconcileCephCluster(clusterObj *cephv1.CephCluster, } func (c *ClusterController) requestClusterDelete(clusterObj *cephv1.CephCluster) (reconcile.Result, error) { - nsName := fmt.Sprintf("%s/%s", clusterObj.Namespace, clusterObj.Name) + nsName := opcontroller.NsName(clusterObj.Namespace, clusterObj.Name) var existingCluster *cluster if rawCluster, ok := c.clusterMap.Load(clusterObj.Namespace); ok { existingCluster = rawCluster.(*cluster) if existingCluster.namespacedName.Name != clusterObj.Name { - log.NamespacedError(nsName, logger, "skipping deletion of CephCluster %q. CephCluster CR %q already exists in this namespace. only one cluster cr per namespace is supported.", + log.NamedError(nsName, logger, "skipping deletion of CephCluster %q. CephCluster CR %q already exists in this namespace. only one cluster cr per namespace is supported.", nsName, existingCluster.namespacedName.Name) return reconcile.Result{}, nil // do not requeue the delete } diff --git a/pkg/operator/ceph/controller/cluster_info.go b/pkg/operator/ceph/controller/cluster_info.go index be6331f59..22a16119a 100644 --- a/pkg/operator/ceph/controller/cluster_info.go +++ b/pkg/operator/ceph/controller/cluster_info.go @@ -36,6 +36,7 @@ import ( "github.com/rook/rook/pkg/operator/ceph/cluster/osd/topology" "github.com/rook/rook/pkg/operator/k8sutil" "github.com/rook/rook/pkg/util/exec" + "github.com/rook/rook/pkg/util/log" "github.com/rook/rook/pkg/util/sys" v1 "k8s.io/api/core/v1" kerrors "k8s.io/apimachinery/pkg/api/errors" @@ -149,7 +150,7 @@ func CreateOrLoadClusterInfo(clusterdContext *clusterd.Context, context context. if len(secrets.OwnerReferences) > 0 { clusterInfo.OwnerInfo = k8sutil.NewOwnerInfoWithOwnerRef(&secrets.GetOwnerReferences()[0], namespace) } - logger.Debugf("found existing monitor secrets for cluster %s", clusterInfo.Namespace) + log.NamespacedDebug(namespace, logger, "found existing monitor secrets for cluster %s", clusterInfo.Namespace) } // get the existing monitor config @@ -164,7 +165,7 @@ func CreateOrLoadClusterInfo(clusterdContext *clusterd.Context, context context. clusterInfo.NetworkSpec = cephClusterSpec.Network // update clusterInfo with cephClusterSpec.CSI settings - clusterInfo.CSIDriverSpec = loadCsiSettings(cephClusterSpec) + clusterInfo.CSIDriverSpec = loadCsiSettings(namespace, cephClusterSpec) // If an admin key was provided we don't need to load the other resources // Some people might want to give the admin key @@ -188,7 +189,7 @@ func CreateOrLoadClusterInfo(clusterdContext *clusterd.Context, context context. return clusterInfo, maxMonID, monMapping, nil } -func loadCsiSettings(cephClusterSpec *cephv1.ClusterSpec) cephv1.CSIDriverSpec { +func loadCsiSettings(namespace string, cephClusterSpec *cephv1.ClusterSpec) cephv1.CSIDriverSpec { settings := cephClusterSpec.CSI if len(settings.ReadAffinity.CrushLocationLabels) == 0 { settings.ReadAffinity.CrushLocationLabels = strings.Split(topology.GetDefaultTopologyLabels(), ",") @@ -199,7 +200,7 @@ func loadCsiSettings(cephClusterSpec *cephv1.ClusterSpec) cephv1.CSIDriverSpec { // if the kernel mount options are not set and encryption is enabled, set the default to secure if settings.CephFS.KernelMountOptions == "" { if cephClusterSpec.NetworkEncryptionEnabled() { - logger.Info("setting default cephfs kernel mount options to 'ms_mode=secure' since encryption is enabled") + log.NamespacedInfo(namespace, logger, "setting default cephfs kernel mount options to 'ms_mode=secure' since encryption is enabled") settings.CephFS.KernelMountOptions = "ms_mode=secure" } } @@ -329,7 +330,7 @@ func loadMonConfig(clientset kubernetes.Interface, namespace string) (extMons ma if monInfo, ok := internalMons[monName]; ok { monInfo.OutOfQuorum = true } else { - logger.Warningf("did not find mon %q to set it out of quorum in the cluster info", monName) + log.NamespacedWarning(namespace, logger, "did not find mon %q to set it out of quorum in the cluster info", monName) } } } @@ -339,7 +340,7 @@ func loadMonConfig(clientset kubernetes.Interface, namespace string) (extMons ma if id, ok := cm.Data[MaxMonIDKey]; ok { storedMaxMonID, err = strconv.Atoi(id) if err != nil { - logger.Errorf("invalid max mon id %q. %v", id, err) + log.NamespacedError(namespace, logger, "invalid max mon id %q. %v", id, err) } else { maxMonID = storedMaxMonID } @@ -353,12 +354,12 @@ func loadMonConfig(clientset kubernetes.Interface, namespace string) (extMons ma } } if maxMonID != storedMaxMonID { - logger.Infof("updating obsolete maxMonID %d to actual value %d", storedMaxMonID, maxMonID) + log.NamespacedInfo(namespace, logger, "updating obsolete maxMonID %d to actual value %d", storedMaxMonID, maxMonID) } err = json.Unmarshal([]byte(cm.Data[MappingKey]), &monMapping) if err != nil { - logger.Errorf("invalid JSON in mon mapping. %v", err) + log.NamespacedError(namespace, logger, "invalid JSON in mon mapping. %v", err) } // filter external mons: if extMonIDsStr, ok := cm.Data[EndpointExternalMonsKey]; ok && extMonIDsStr != "" { @@ -371,7 +372,7 @@ func loadMonConfig(clientset kubernetes.Interface, namespace string) (extMons ma } } - logger.Debugf("loaded: maxMonID=%d, extMons=%+v, mons=%+v, assignment=%+v", maxMonID, extMons, internalMons, monMapping) + log.NamespacedDebug(namespace, logger, "loaded: maxMonID=%d, extMons=%+v, mons=%+v, assignment=%+v", maxMonID, extMons, internalMons, monMapping) return extMons, internalMons, maxMonID, monMapping, nil } @@ -385,7 +386,7 @@ func fullNameToIndex(name string) (int, error) { } func createClusterAccessSecret(clientset kubernetes.Interface, namespace string, clusterInfo *cephclient.ClusterInfo, ownerInfo *k8sutil.OwnerInfo) error { - logger.Infof("creating mon secrets for a new cluster") + log.NamespacedInfo(namespace, logger, "creating mon secrets for a new cluster") var err error // store the secrets for internal usage of the rook pods @@ -427,7 +428,7 @@ func UpdateClusterAccessSecret(clientset kubernetes.Interface, clusterInfo *ceph secret.Data[MonSecretNameKey] = []byte(clusterInfo.MonitorSecret) - logger.Infof("updating secret %q in the namespace %q", secret.Name, clusterInfo.Namespace) + log.NamespacedInfo(clusterInfo.Namespace, logger, "updating secret %q in the namespace %q", secret.Name, clusterInfo.Namespace) _, err = clientset.CoreV1().Secrets(clusterInfo.Namespace).Update(clusterInfo.Context, secret, metav1.UpdateOptions{}) if err != nil { return errors.Wrapf(err, "failed to update secret %q in the namespace %q", secret.Name, clusterInfo.Namespace) @@ -463,12 +464,12 @@ func PopulateExternalClusterInfo(cephClusterSpec *cephv1.ClusterSpec, context *c } clusterInfo, _, _, err := CreateOrLoadClusterInfo(context, ctx, namespace, nil, cephClusterSpec) if err != nil { - logger.Warningf("waiting for connection info of the external cluster. retrying in %s.", externalConnectionRetry.String()) - logger.Debugf("%v", err) + log.NamespacedWarning(namespace, logger, "waiting for connection info of the external cluster. retrying in %s.", externalConnectionRetry.String()) + log.NamespacedDebug(namespace, logger, "%v", err) time.Sleep(externalConnectionRetry) continue } - logger.Infof("found the cluster info to connect to the external cluster. will use %q to check health and monitor status. mons=%+v", clusterInfo.CephCred.Username, clusterInfo.AllMonitors()) + log.NamespacedInfo(namespace, logger, "found the cluster info to connect to the external cluster. will use %q to check health and monitor status. mons=%+v", clusterInfo.CephCred.Username, clusterInfo.AllMonitors()) clusterInfo.OwnerInfo = ownerInfo return clusterInfo, nil diff --git a/pkg/operator/ceph/controller/conditions.go b/pkg/operator/ceph/controller/conditions.go index c2fa70d7d..686a2ba27 100644 --- a/pkg/operator/ceph/controller/conditions.go +++ b/pkg/operator/ceph/controller/conditions.go @@ -25,6 +25,7 @@ import ( "github.com/rook/rook/pkg/clusterd" "github.com/rook/rook/pkg/operator/ceph/reporting" "github.com/rook/rook/pkg/operator/k8sutil" + "github.com/rook/rook/pkg/util/log" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" @@ -35,7 +36,7 @@ func UpdateCondition(ctx context.Context, c *clusterd.Context, namespaceName typ // use client.Client unit test this more easily with updating statuses which must use the client cluster := &cephv1.CephCluster{} if err := c.Client.Get(ctx, namespaceName, cluster); err != nil { - logger.Errorf("failed to get cluster %v to update the conditions. %v", namespaceName, err) + log.NamedError(namespaceName, logger, "failed to get cluster %v to update the conditions. %v", namespaceName, err) return } @@ -101,11 +102,11 @@ func UpdateClusterCondition(c *clusterd.Context, cluster *cephv1.CephCluster, na cluster.Status.State = state } cluster.Status.Message = currentCondition.Message - logger.Debugf("CephCluster %q status: %q. %q", namespaceName.Namespace, cluster.Status.Phase, cluster.Status.Message) + log.NamedDebug(namespaceName, logger, "CephCluster status: %q. %q", cluster.Status.Phase, cluster.Status.Message) } if err := reporting.UpdateStatus(c.Client, cluster); err != nil { - logger.Errorf("failed to update cluster condition to %+v. %v", *currentCondition, err) + log.NamedError(namespaceName, logger, "failed to update cluster condition to %+v. %v", *currentCondition, err) } } diff --git a/pkg/operator/ceph/controller/controller_utils.go b/pkg/operator/ceph/controller/controller_utils.go index 859745bd8..17904f6bd 100644 --- a/pkg/operator/ceph/controller/controller_utils.go +++ b/pkg/operator/ceph/controller/controller_utils.go @@ -29,6 +29,7 @@ import ( cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1" "github.com/rook/rook/pkg/operator/k8sutil" "github.com/rook/rook/pkg/util/exec" + "github.com/rook/rook/pkg/util/log" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/client" @@ -220,42 +221,42 @@ func IsReadyToReconcile(ctx context.Context, c client.Client, namespacedName typ clusterList := &cephv1.CephClusterList{} err := c.List(ctx, clusterList, client.InNamespace(namespacedName.Namespace)) if err != nil { - logger.Errorf("%q: failed to fetch CephCluster %v", controllerName, err) + log.NamedError(namespacedName, logger, "%q: failed to fetch CephCluster %v", controllerName, err) return cephCluster, false, cephClusterExists, ImmediateRetryResult } if len(clusterList.Items) == 0 { - logger.Debugf("%q: no CephCluster resource found in namespace %q", controllerName, namespacedName.Namespace) + log.NamedDebug(namespacedName, logger, "%q: no CephCluster resource found in namespace", controllerName) return cephCluster, false, cephClusterExists, WaitForRequeueIfCephClusterNotReady } cephCluster = clusterList.Items[0] // If the cluster has a cleanup policy to destroy the cluster and it has been marked for deletion, treat it as if it does not exist if cephCluster.Spec.CleanupPolicy.HasDataDirCleanPolicy() && !cephCluster.DeletionTimestamp.IsZero() { - logger.Infof("%q: CephCluster has a destructive cleanup policy, allowing %q to be deleted", controllerName, namespacedName) + log.NamedInfo(namespacedName, logger, "%q: CephCluster has a destructive cleanup policy, allowing it to be deleted", controllerName) return cephCluster, false, cephClusterExists, WaitForRequeueIfCephClusterNotReady } cephClusterExists = true - logger.Debugf("%q: CephCluster resource %q found in namespace %q", controllerName, cephCluster.Name, namespacedName.Namespace) + log.NamedDebug(namespacedName, logger, "%q: CephCluster resource found", controllerName) // read the CR status of the cluster if cephCluster.Status.CephStatus != nil { operatorDeploymentOk := cephCluster.Status.CephStatus.Health == "HEALTH_OK" || cephCluster.Status.CephStatus.Health == "HEALTH_WARN" if operatorDeploymentOk || canIgnoreHealthErrStatusInReconcile(cephCluster, controllerName) { - logger.Debugf("%q: ceph status is %q, operator is ready to run ceph command, reconciling", controllerName, cephCluster.Status.CephStatus.Health) + log.NamedDebug(namespacedName, logger, "%q: ceph status is %q, operator is ready to run ceph command, reconciling", controllerName, cephCluster.Status.CephStatus.Health) return cephCluster, true, cephClusterExists, WaitForRequeueIfCephClusterNotReady } details := cephCluster.Status.CephStatus.Details message, ok := details["error"] if ok && len(details) == 1 && strings.Contains(message.Message, "Error initializing cluster client") { - logger.Infof("%s: skipping reconcile since operator is still initializing", controllerName) + log.NamedInfo(namespacedName, logger, "%q: skipping reconcile since operator is still initializing", controllerName) } else { - logger.Infof("%s: CephCluster %q found but skipping reconcile since ceph health is %+v", controllerName, cephCluster.Name, cephCluster.Status.CephStatus) + log.NamedInfo(namespacedName, logger, "%q: CephCluster %q found but skipping reconcile since ceph health is %+v", controllerName, cephCluster.Name, cephCluster.Status.CephStatus) } } - logger.Debugf("%q: CephCluster %q initial reconcile is not complete yet...", controllerName, namespacedName) + log.NamedDebug(namespacedName, logger, "%q: CephCluster initial reconcile is not complete yet...", controllerName) return cephCluster, false, cephClusterExists, WaitForRequeueIfCephClusterNotReady } @@ -290,3 +291,7 @@ func RecoverAndLogException() { logger.Errorf("Stack trace:\n%s", string(debug.Stack())) } } + +func NsName(namespace, name string) types.NamespacedName { + return types.NamespacedName{Namespace: namespace, Name: name} +} diff --git a/pkg/operator/ceph/controller/finalizer.go b/pkg/operator/ceph/controller/finalizer.go index b64837a78..e5c038d43 100644 --- a/pkg/operator/ceph/controller/finalizer.go +++ b/pkg/operator/ceph/controller/finalizer.go @@ -23,6 +23,7 @@ import ( "github.com/pkg/errors" cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1" + "github.com/rook/rook/pkg/util/log" "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/client" @@ -60,7 +61,7 @@ func AddFinalizerIfNotPresent(ctx context.Context, client client.Client, obj cli } if !contains(accessor.GetFinalizers(), objectFinalizer) { - logger.Infof("adding finalizer %q on %q", objectFinalizer, accessor.GetName()) + log.NamedInfo(NsName(obj.GetNamespace(), obj.GetName()), logger, "adding finalizer %q", objectFinalizer) accessor.SetFinalizers(append(accessor.GetFinalizers(), objectFinalizer)) originalGeneration := obj.GetGeneration() @@ -69,7 +70,7 @@ func AddFinalizerIfNotPresent(ctx context.Context, client client.Client, obj cli return false, errors.Wrapf(err, "failed to add finalizer %q on %q", objectFinalizer, accessor.GetName()) } newGeneration := obj.GetGeneration() - logger.Debugf("when adding finalizer on %q, original generation %d, new generation %d", accessor.GetName(), originalGeneration, newGeneration) + log.NamedDebug(NsName(obj.GetNamespace(), obj.GetName()), logger, "when adding finalizer, original generation %d, new generation %d", originalGeneration, newGeneration) return originalGeneration != newGeneration, nil } @@ -94,7 +95,7 @@ func RemoveFinalizerWithName(ctx context.Context, client client.Client, obj clie } if contains(accessor.GetFinalizers(), finalizerName) { - logger.Infof("removing finalizer %q on %q", finalizerName, accessor.GetName()) + log.NamedInfo(NsName(obj.GetNamespace(), obj.GetName()), logger, "removing finalizer %q", finalizerName) accessor.SetFinalizers(remove(accessor.GetFinalizers(), finalizerName)) if err := client.Update(ctx, obj); err != nil { return errors.Wrapf(err, "failed to remove finalizer %q on %q", finalizerName, accessor.GetName()) diff --git a/pkg/operator/ceph/controller/mirror_peer.go b/pkg/operator/ceph/controller/mirror_peer.go index 27cf1fe1f..552f4bd3b 100644 --- a/pkg/operator/ceph/controller/mirror_peer.go +++ b/pkg/operator/ceph/controller/mirror_peer.go @@ -29,6 +29,7 @@ import ( "github.com/rook/rook/pkg/operator/ceph/config/keyring" "github.com/rook/rook/pkg/operator/ceph/reporting" "github.com/rook/rook/pkg/operator/k8sutil" + "github.com/rook/rook/pkg/util/log" v1 "k8s.io/api/core/v1" kerrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -122,7 +123,7 @@ func CreateBootstrapPeerSecret(ctx *clusterd.Context, clusterInfo *cephclient.Cl } // Create Secret - logger.Debugf("store %s-mirror bootstrap token in a Kubernetes Secret %q in namespace %q", daemonType, s.Name, ns) + log.NamedDebug(NsName(ns, s.Name), logger, "store %s-mirror bootstrap token in a Kubernetes Secret", daemonType) _, err = k8sutil.CreateOrUpdateSecret(clusterInfo.Context, ctx.Clientset, s) if err != nil && !kerrors.IsAlreadyExists(err) { return ImmediateRetryResult, errors.Wrapf(err, "failed to create %s-mirror bootstrap peer %q secret", daemonType, s.Name) @@ -266,7 +267,7 @@ func updateCephClusterCephxRbdMirrorStatus(c *clusterd.Context, clusterInfo *cep } updatedStatus := keyring.UpdatedCephxStatus(didRotate, cluster.Spec.Security.CephX.RBDMirrorPeer, clusterInfo.CephVersion, cluster.Status.Cephx.RBDMirrorPeer) cluster.Status.Cephx.RBDMirrorPeer = updatedStatus - logger.Debugf("updating rbd-mirror cephx status to %+v", cluster.Status.Cephx.RBDMirrorPeer) + log.NamespacedDebug(clusterInfo.Namespace, logger, "updating rbd-mirror cephx status to %+v", cluster.Status.Cephx.RBDMirrorPeer) if err := reporting.UpdateStatus(c.Client, cluster); err != nil { return errors.Wrap(err, "failed to update cluster cephx status for rbd-mirror") } @@ -275,6 +276,6 @@ func updateCephClusterCephxRbdMirrorStatus(c *clusterd.Context, clusterInfo *cep if err != nil { return err } - logger.Debugf("successfully updated rbd-mirror cephx status on the cluster %q", clusterInfo.NamespacedName()) + log.NamespacedDebug(clusterInfo.Namespace, logger, "successfully updated rbd-mirror cephx status") return nil } diff --git a/pkg/operator/ceph/controller/network.go b/pkg/operator/ceph/controller/network.go index 55b491c10..532f2da44 100644 --- a/pkg/operator/ceph/controller/network.go +++ b/pkg/operator/ceph/controller/network.go @@ -31,6 +31,7 @@ import ( "github.com/rook/rook/pkg/operator/ceph/config" "github.com/rook/rook/pkg/operator/k8sutil" "github.com/rook/rook/pkg/operator/k8sutil/cmdreporter" + "github.com/rook/rook/pkg/util/log" corev1 "k8s.io/api/core/v1" ) @@ -53,7 +54,7 @@ func ApplyCephNetworkSettings( if !netSpec.IsHost() && !netSpec.IsMultus() { // do not apply specs when using k8s pod network, and for safety, only apply net specs for // nets where it is definitely safe to do so (e.g., multus, hostnet) - logger.Infof("not applying network settings for cluster %q ceph networks", clusterInfo.Namespace) + log.NamespacedInfo(clusterInfo.Namespace, logger, "not applying network settings for ceph networks") return nil } @@ -66,12 +67,12 @@ func ApplyCephNetworkSettings( // if user specifies CIDRs in the network config, that is the definitive source of truth // do not auto-detect CIDRs if given by user if len(netSpec.AddressRanges.Public) > 0 { - logger.Infof("using user-provided network CIDR(s) for cluster %q public network", clusterInfo.Namespace) + log.NamespacedInfo(clusterInfo.Namespace, logger, "using user-provided network CIDR(s) for public network") discoverPublic = false publicCIDRs = netSpec.AddressRanges.Public } if len(netSpec.AddressRanges.Cluster) > 0 { - logger.Infof("using user-provided network CIDR(s) for cluster %q cluster network", clusterInfo.Namespace) + log.NamespacedInfo(clusterInfo.Namespace, logger, "using user-provided network CIDR(s) for cluster network") discoverCluster = false clusterCIDRs = netSpec.AddressRanges.Cluster } @@ -115,7 +116,7 @@ func setNetworkCIDRs(clusterdCtx *clusterd.Context, clusterInfo *cephclient.Clus settingKey := fmt.Sprintf("%s_network", string(cephNet)) settingVal := cidrs.String() - logger.Infof("ensuring cluster %q %q network is configured to use CIDR(s) %q", ns, cephNet, settingVal) + log.NamespacedInfo(clusterInfo.Namespace, logger, "ensuring cluster %q network is configured to use CIDR(s) %q", cephNet, settingVal) if len(cidrs) > 0 { s := getMonStoreFunc(clusterdCtx, clusterInfo) changed, err := s.SetIfChanged("global", settingKey, settingVal) @@ -123,7 +124,7 @@ func setNetworkCIDRs(clusterdCtx *clusterd.Context, clusterInfo *cephclient.Clus return errors.Wrapf(err, "failed to set CIDR(s) %q on cluster %q %q network", settingVal, cephNet, ns) } if changed { - logger.Infof("modified cluster %q %q network config to use CIDR(s) %q", ns, cephNet, settingVal) + log.NamespacedInfo(clusterInfo.Namespace, logger, "modified cluster %q network config to use CIDR(s) %q", cephNet, settingVal) } } return nil @@ -207,7 +208,7 @@ func discoverAddressRanges( ranges = []string{} clusterNamespace := clusterInfo.Namespace - logger.Infof("discovering ceph %q network CIDR(s) for cluster %q", cephNetwork, clusterNamespace) + log.NamespacedInfo(clusterInfo.Namespace, logger, "discovering ceph %q network CIDR(s) for cluster %q", cephNetwork, clusterNamespace) netSelection, err := clusterInfo.NetworkSpec.GetNetworkSelection(clusterNamespace, cephNetwork) if err != nil { diff --git a/pkg/operator/ceph/controller/object_operations.go b/pkg/operator/ceph/controller/object_operations.go index 2b5543027..62ab27565 100644 --- a/pkg/operator/ceph/controller/object_operations.go +++ b/pkg/operator/ceph/controller/object_operations.go @@ -23,6 +23,7 @@ import ( "k8s.io/apimachinery/pkg/api/meta" "github.com/pkg/errors" + "github.com/rook/rook/pkg/util/log" kerrors "k8s.io/apimachinery/pkg/api/errors" "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -46,12 +47,12 @@ func CreateOrUpdateObject(ctx context.Context, client client.Client, obj client. return errors.Wrapf(err, "failed to update ceph %q object %q", objType, objName) } - logger.Infof("updated ceph %q object %q", objType, objName) + log.NamedInfo(NsName(obj.GetNamespace(), obj.GetName()), logger, "updated ceph %q object %q", objType, objName) return nil } return errors.Wrapf(err, "failed to create ceph %v object %q", objType, objName) } - logger.Infof("created ceph %v object %q", objType, objName) + log.NamedInfo(NsName(obj.GetNamespace(), obj.GetName()), logger, "created ceph %v object %q", objType, objName) return nil } diff --git a/pkg/operator/ceph/controller/predicate.go b/pkg/operator/ceph/controller/predicate.go index 4acc32ba4..0d0ea9075 100644 --- a/pkg/operator/ceph/controller/predicate.go +++ b/pkg/operator/ceph/controller/predicate.go @@ -55,10 +55,7 @@ func objectInfo(scheme *runtime.Scheme, obj client.Object) (string, types.Namesp logger.Debugf("Unable to get GVK for object %+v", obj) } - nsName := types.NamespacedName{ - Namespace: obj.GetNamespace(), - Name: obj.GetName(), - } + nsName := NsName(obj.GetNamespace(), obj.GetName()) return gvk.Kind, nsName } diff --git a/pkg/operator/ceph/file/controller.go b/pkg/operator/ceph/file/controller.go index 3db1d3d76..92d4d8f1f 100644 --- a/pkg/operator/ceph/file/controller.go +++ b/pkg/operator/ceph/file/controller.go @@ -34,6 +34,7 @@ import ( opcontroller "github.com/rook/rook/pkg/operator/ceph/controller" "github.com/rook/rook/pkg/operator/ceph/reporting" "github.com/rook/rook/pkg/operator/k8sutil" + "github.com/rook/rook/pkg/util/log" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" kerrors "k8s.io/apimachinery/pkg/api/errors" @@ -184,7 +185,7 @@ func (r *ReconcileCephFilesystem) Reconcile(context context.Context, request rec // workaround because the rook logging mechanism is not compatible with the controller-runtime logging interface reconcileResponse, cephFilesystem, err := r.reconcile(request) if err != nil { - logger.Errorf("failed to reconcile %v", err) + log.NamedError(request.NamespacedName, logger, "failed to reconcile %v", err) } return reporting.ReportReconcileResult(logger, r.recorder, request, &cephFilesystem, reconcileResponse, err) @@ -196,7 +197,7 @@ func (r *ReconcileCephFilesystem) reconcile(request reconcile.Request) (reconcil err := r.client.Get(r.opManagerContext, request.NamespacedName, cephFilesystem) if err != nil { if kerrors.IsNotFound(err) { - logger.Debug("cephFilesystem resource not found. Ignoring since object must be deleted.") + log.NamedDebug(request.NamespacedName, logger, "cephFilesystem resource not found. Ignoring since object must be deleted.") // If there was a previous error or if a user removed this resource's finalizer, it's // possible Rook didn't clean up the monitoring routine for this resource. Ensure the // routine is stopped when we see the resource is gone. @@ -220,7 +221,7 @@ func (r *ReconcileCephFilesystem) reconcile(request reconcile.Request) (reconcil return reconcile.Result{}, *cephFilesystem, errors.Wrap(err, "failed to add finalizer") } if generationUpdated { - logger.Infof("reconciling the filesystem %q after adding finalizer", cephFilesystem.Name) + log.NamedInfo(request.NamespacedName, logger, "reconciling the filesystem after adding finalizer") return reconcile.Result{}, *cephFilesystem, nil } @@ -301,7 +302,7 @@ func (r *ReconcileCephFilesystem) reconcile(request reconcile.Request) (reconcil r.clusterInfo.CephVersion = runningCephVersion // Detect against running version only - logger.Debugf("deleting filesystem %q", cephFilesystem.Name) + log.NamedDebug(request.NamespacedName, logger, "deleting filesystem") err = r.reconcileDeleteFilesystem(cephFilesystem) if err != nil { return reconcile.Result{}, *cephFilesystem, @@ -334,7 +335,7 @@ func (r *ReconcileCephFilesystem) reconcile(request reconcile.Request) (reconcil ) if err != nil { if strings.Contains(err.Error(), opcontroller.UninitializedCephConfigError) { - logger.Info(opcontroller.OperatorNotInitializedMessage) + log.NamedInfo(request.NamespacedName, logger, opcontroller.OperatorNotInitializedMessage) return opcontroller.WaitForRequeueIfOperatorNotInitialized, *cephFilesystem, nil } return reconcile.Result{}, *cephFilesystem, errors.Wrap(err, "failed to detect running and desired ceph version") @@ -354,7 +355,7 @@ func (r *ReconcileCephFilesystem) reconcile(request reconcile.Request) (reconcil // validate the filesystem settings if err := validateFilesystem(r.context, r.clusterInfo, r.cephClusterSpec, cephFilesystem); err != nil { if strings.Contains(err.Error(), opcontroller.UninitializedCephConfigError) { - logger.Info(opcontroller.OperatorNotInitializedMessage) + log.NamedInfo(request.NamespacedName, logger, opcontroller.OperatorNotInitializedMessage) return opcontroller.WaitForRequeueIfOperatorNotInitialized, *cephFilesystem, nil } return reconcile.Result{}, *cephFilesystem, @@ -367,11 +368,11 @@ func (r *ReconcileCephFilesystem) reconcile(request reconcile.Request) (reconcil return reconcile.Result{}, *cephFilesystem, errors.Wrap(err, "failed to determine if cephx keys should be rotated") } if r.shouldRotateCephxKeys { - logger.Infof("cephx keys for CephFileSystem %q will be rotated", request.NamespacedName) + log.NamedInfo(request.NamespacedName, logger, "cephx keys for CephFileSystem will be rotated") } // RECONCILE - logger.Debug("reconciling ceph filesystem store deployments") + log.NamedDebug(request.NamespacedName, logger, "reconciling ceph filesystem store deployments") reconcileResponse, err = r.reconcileCreateFilesystem(cephFilesystem) if err != nil { _, err := r.updateStatus(k8sutil.ObservedGenerationNotAvailable, request.NamespacedName, cephv1.ConditionFailure, nil, nil) @@ -399,7 +400,7 @@ func (r *ReconcileCephFilesystem) reconcile(request reconcile.Request) (reconcil errors.Wrapf(err, "failed to disable mirroring on filesystem %q", cephFilesystem.Name) } } else { - logger.Info("reconciling cephfs-mirror mirroring configuration") + log.NamedInfo(request.NamespacedName, logger, "reconciling cephfs-mirror mirroring configuration") err = r.reconcileMirroring(cephFilesystem, request.NamespacedName) if err != nil { return opcontroller.ImmediateRetryResult, *cephFilesystem, @@ -407,7 +408,7 @@ func (r *ReconcileCephFilesystem) reconcile(request reconcile.Request) (reconcil } // Always create a bootstrap peer token in case another cluster wants to add us as a peer - logger.Info("reconciling create cephfs-mirror peer configuration") + log.NamedInfo(request.NamespacedName, logger, "reconciling create cephfs-mirror peer configuration") reconcileResponse, err = opcontroller.CreateBootstrapPeerSecret(r.context, r.clusterInfo, cephFilesystem, k8sutil.NewOwnerInfo(cephFilesystem, r.scheme)) if err != nil { _, err := r.updateStatus(k8sutil.ObservedGenerationNotAvailable, request.NamespacedName, cephv1.ConditionFailure, nil, nil) @@ -418,7 +419,7 @@ func (r *ReconcileCephFilesystem) reconcile(request reconcile.Request) (reconcil errors.Wrapf(err, "failed to create cephfs-mirror bootstrap peer for filesystem %q.", cephFilesystem.Name) } - logger.Info("reconciling add cephfs-mirror peer configuration") + log.NamedInfo(request.NamespacedName, logger, "reconciling add cephfs-mirror peer configuration") err = r.reconcileAddBootstrapPeer(cephFilesystem, request.NamespacedName) if err != nil { return opcontroller.ImmediateRetryResult, *cephFilesystem, @@ -437,7 +438,7 @@ func (r *ReconcileCephFilesystem) reconcile(request reconcile.Request) (reconcil if !cephFilesystem.Spec.StatusCheck.Mirror.Disabled { // Start monitoring cephfs-mirror status if r.fsContexts[fsChannelKeyName(cephFilesystem)].started { - logger.Debug("ceph filesystem mirror status monitoring go routine already running!") + log.NamedDebug(request.NamespacedName, logger, "ceph filesystem mirror status monitoring go routine already running!") } else { checker := newMirrorChecker(r.context, r.client, r.clusterInfo, request.NamespacedName, &cephFilesystem.Spec, cephFilesystem.Name) go checker.checkMirroring(r.fsContexts[fsChannelKeyName(cephFilesystem)].internalCtx) @@ -474,7 +475,7 @@ func (r *ReconcileCephFilesystem) reconcileCreateFilesystem(cephFilesystem *ceph // If preservePoolsOnDelete is set to true, assume the user means preserveFilesystemOnDelete instead. if cephFilesystem.Spec.PreservePoolsOnDelete { if !cephFilesystem.Spec.PreserveFilesystemOnDelete { - logger.Warning("preservePoolsOnDelete (currently set 'true') has been deprecated in favor of preserveFilesystemOnDelete (currently set 'false') due to data loss concerns so Rook will assume preserveFilesystemOnDelete 'true'") + log.NamedWarning(opcontroller.NsName(cephFilesystem.Namespace, cephFilesystem.Name), logger, "preservePoolsOnDelete (currently set 'true') has been deprecated in favor of preserveFilesystemOnDelete (currently set 'false') due to data loss concerns so Rook will assume preserveFilesystemOnDelete 'true'") cephFilesystem.Spec.PreserveFilesystemOnDelete = true } } @@ -545,7 +546,7 @@ func (r *ReconcileCephFilesystem) reconcileAddBootstrapPeer(cephFilesystem *ceph // List all the peers secret, we can have more than one peer we might want to configure // For each, get the Kubernetes Secret and import the "peer token" so that we can configure the mirroring for _, peerSecret := range cephFilesystem.Spec.Mirroring.Peers.SecretNames { - logger.Debugf("fetching bootstrap peer kubernetes secret %q", peerSecret) + log.NamedDebug(opcontroller.NsName(cephFilesystem.Namespace, cephFilesystem.Name), logger, "fetching bootstrap peer kubernetes secret %q", peerSecret) s, err := r.context.Clientset.CoreV1().Secrets(r.clusterInfo.Namespace).Get(r.opManagerContext, peerSecret, metav1.GetOptions{}) // We don't care about IsNotFound here, we still need to fail if err != nil { diff --git a/pkg/operator/ceph/file/dependent.go b/pkg/operator/ceph/file/dependent.go index 53fdcfa0d..3cda690c2 100644 --- a/pkg/operator/ceph/file/dependent.go +++ b/pkg/operator/ceph/file/dependent.go @@ -24,10 +24,13 @@ import ( v1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1" "github.com/rook/rook/pkg/clusterd" cephclient "github.com/rook/rook/pkg/daemon/ceph/client" + "github.com/rook/rook/pkg/operator/ceph/controller" "github.com/rook/rook/pkg/util" "github.com/rook/rook/pkg/util/dependents" kexec "github.com/rook/rook/pkg/util/exec" + "github.com/rook/rook/pkg/util/log" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" ) const subvolumeGroupDependentType = "filesystem subvolume groups that contain subvolumes (could be from CephFilesystem PVCs or CephNFS exports)" @@ -53,11 +56,11 @@ var ignoredDependentSubvolumeGroups = []string{"_nogroup", "_index", "_legacy", var CephFilesystemDependents = cephFilesystemDependents // check filesystem whether it exists -func filesystemExists(clusterdCtx *clusterd.Context, clusterInfo *cephclient.ClusterInfo, name, nsName string) (bool, error) { +func filesystemExists(clusterdCtx *clusterd.Context, clusterInfo *cephclient.ClusterInfo, name string, nsName types.NamespacedName) (bool, error) { _, err := cephclient.GetFilesystem(clusterdCtx, clusterInfo, name) if err != nil { if code, ok := kexec.ExitStatus(err); ok && code == int(syscall.ENOENT) { - logger.Infof("filesystem %q deletion will continue without checking for dependencies since the the filesystem does not exist within Ceph", nsName) + log.NamedInfo(nsName, logger, "filesystem deletion will continue without checking for dependencies since the the filesystem does not exist within Ceph") return false, nil } return false, errors.Wrapf(err, "failed to check for existence of CephFilesystem %q", nsName) @@ -67,7 +70,7 @@ func filesystemExists(clusterdCtx *clusterd.Context, clusterInfo *cephclient.Clu // with above, allow this to be overridden for unit testing func cephFilesystemDependents(clusterdCtx *clusterd.Context, clusterInfo *cephclient.ClusterInfo, filesystem *v1.CephFilesystem) (*dependents.DependentList, error) { - nsName := fmt.Sprintf("%s/%s", filesystem.Namespace, filesystem.Name) + nsName := controller.NsName(filesystem.Namespace, filesystem.Name) baseErrMsg := fmt.Sprintf("failed to get dependents of CephFilesystem %q", nsName) deps := dependents.NewDependentList() @@ -93,7 +96,7 @@ func cephFilesystemDependents(clusterdCtx *clusterd.Context, clusterInfo *cephcl if subVolumeGroup.Spec.FilesystemName == filesystem.Name { deps.Add("CephFilesystemSubVolumeGroups", subVolumeGroup.Name) } - logger.Debugf("found CephFilesystemSubVolumeGroups %q that does not depend on CephFilesystem %q", subVolumeGroup.Name, nsName) + log.NamedDebug(nsName, logger, "found CephFilesystemSubVolumeGroups %q that does not depend on CephFilesystem", subVolumeGroup.Name) } return deps, nil @@ -143,7 +146,7 @@ func subvolumeGroupDependents(clusterdCtx *clusterd.Context, clusterInfo *cephcl func ignoreSVG(name string) bool { for _, ignore := range ignoredDependentSubvolumeGroups { if name == ignore { - logger.Debugf("skipping dependency check for subvolumes in subvolumegroup %q", ignore) + log.NamespacedDebug(name, logger, "skipping dependency check for subvolumes in subvolumegroup %q", ignore) return true } } diff --git a/pkg/operator/ceph/file/filesystem.go b/pkg/operator/ceph/file/filesystem.go index ad509c0d2..4668b1299 100644 --- a/pkg/operator/ceph/file/filesystem.go +++ b/pkg/operator/ceph/file/filesystem.go @@ -20,11 +20,13 @@ import ( "fmt" "github.com/rook/rook/pkg/operator/k8sutil" + "github.com/rook/rook/pkg/util/log" "github.com/pkg/errors" cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1" "github.com/rook/rook/pkg/clusterd" cephclient "github.com/rook/rook/pkg/daemon/ceph/client" + opcontroller "github.com/rook/rook/pkg/operator/ceph/controller" "github.com/rook/rook/pkg/operator/ceph/file/mds" cephpool "github.com/rook/rook/pkg/operator/ceph/pool" ) @@ -52,7 +54,7 @@ func createFilesystem( dataDirHostPath string, shouldRotateCephxKeys bool, ) error { - logger.Infof("start running mdses for filesystem %q", fs.Name) + log.NamedInfo(opcontroller.NsName(fs.Namespace, fs.Name), logger, "start running mdses for filesystem %q", fs.Name) c := mds.NewCluster(clusterInfo, context, clusterSpec, fs, ownerInfo, dataDirHostPath, shouldRotateCephxKeys) if err := c.Start(); err != nil { return err @@ -71,7 +73,7 @@ func createFilesystem( // set the number of active mds instances if fs.Spec.MetadataServer.ActiveCount > 1 { if err := cephclient.SetNumMDSRanks(context, clusterInfo, fs.Name, fs.Spec.MetadataServer.ActiveCount); err != nil { - logger.Warningf("failed setting active mds count to %d. %v", fs.Spec.MetadataServer.ActiveCount, err) + log.NamedWarning(opcontroller.NsName(fs.Namespace, fs.Name), logger, "failed setting active mds count to %d. %v", fs.Spec.MetadataServer.ActiveCount, err) } } @@ -111,7 +113,7 @@ func deleteFilesystem( if err := downFilesystem(context, clusterInfo, fs.Name); err != nil { // If the fs isn't deleted from Ceph, leave the daemons so it can still be used. // Log the error for best effort and continue - logger.Warningf("continuing to remove filesystem CR even though downing the filesystem failed. %v", err) + log.NamedWarning(opcontroller.NsName(fs.Namespace, fs.Name), logger, "continuing to remove filesystem CR even though downing the filesystem failed. %v", err) } // TODO: should we move the `RemoveFilesystem()` call to be before removing MDSes? If the below @@ -125,7 +127,7 @@ func deleteFilesystem( if len(fs.Spec.DataPools) != 0 && !fs.Spec.PreserveFilesystemOnDelete { if err := cephclient.RemoveFilesystem(context, clusterInfo, fs.Name, fs.Spec.PreservePoolsOnDelete); err != nil { // log the error for best effort and continue - logger.Warningf("continuing to remove filesystem CR even though removal failed. %v", err) + log.NamedWarning(opcontroller.NsName(fs.Namespace, fs.Name), logger, "continuing to remove filesystem CR even though removal failed. %v", err) } } return nil @@ -218,7 +220,7 @@ func createOrUpdatePools(f *Filesystem, context *clusterd.Context, clusterInfo * func (f *Filesystem) updateFilesystem(context *clusterd.Context, clusterInfo *cephclient.ClusterInfo, clusterSpec *cephv1.ClusterSpec, spec cephv1.FilesystemSpec) error { // Even if the fs already exists, the num active mdses may have changed if err := cephclient.SetNumMDSRanks(context, clusterInfo, f.Name, spec.MetadataServer.ActiveCount); err != nil { - logger.Errorf( + log.NamedError(opcontroller.NsName(f.Namespace, f.Name), logger, "failed to set num mds ranks (max_mds) to %d for filesystem %s, still continuing. "+ "this error is not critical, but mdses may not be as failure tolerant as desired. "+ "USER should verify that the number of active mdses is %d with 'ceph fs get %s'. %v", @@ -245,7 +247,7 @@ func (f *Filesystem) updateFilesystem(context *clusterd.Context, clusterInfo *ce func (f *Filesystem) doFilesystemCreate(context *clusterd.Context, clusterInfo *cephclient.ClusterInfo, clusterSpec *cephv1.ClusterSpec, spec cephv1.FilesystemSpec) error { _, err := cephclient.GetFilesystem(context, clusterInfo, f.Name) if err == nil { - logger.Infof("filesystem %q already exists", f.Name) + log.NamedInfo(opcontroller.NsName(f.Namespace, f.Name), logger, "filesystem %q already exists", f.Name) return f.updateFilesystem(context, clusterInfo, clusterSpec, spec) } if len(spec.DataPools) == 0 { @@ -257,7 +259,7 @@ func (f *Filesystem) doFilesystemCreate(context *clusterd.Context, clusterInfo * return errors.Wrap(err, "failed to get pool names") } - logger.Infof("creating filesystem %q", f.Name) + log.NamedInfo(opcontroller.NsName(f.Namespace, f.Name), logger, "creating filesystem %q", f.Name) // Make easy to locate a pool by name and avoid repeated searches reversedPoolMap := make(map[string]int) @@ -289,7 +291,7 @@ func (f *Filesystem) doFilesystemCreate(context *clusterd.Context, clusterInfo * if dataPool.IsErasureCoded() { // An erasure coded data pool used for a filesystem must allow overwrites if err := cephclient.SetPoolProperty(context, clusterInfo, dataPool.Name, "allow_ec_overwrites", "true"); err != nil { - logger.Warningf("failed to set ec pool property. %v", err) + log.NamedWarning(opcontroller.NsName(f.Namespace, f.Name), logger, "failed to set ec pool property. %v", err) } } } @@ -301,18 +303,18 @@ func (f *Filesystem) doFilesystemCreate(context *clusterd.Context, clusterInfo * return err } - logger.Infof("created filesystem %q on %d data pool(s) and metadata pool %q", f.Name, len(dataPoolNames), metadataPool.Name) + log.NamedInfo(opcontroller.NsName(f.Namespace, f.Name), logger, "created filesystem %q on %d data pool(s) and metadata pool %q", f.Name, len(dataPoolNames), metadataPool.Name) return nil } // downFilesystem marks the filesystem as down and the MDS' as failed func downFilesystem(context *clusterd.Context, clusterInfo *cephclient.ClusterInfo, filesystemName string) error { - logger.Infof("downing filesystem %q", filesystemName) + log.NamedInfo(opcontroller.NsName(clusterInfo.Namespace, filesystemName), logger, "downing filesystem %q", filesystemName) if err := cephclient.FailFilesystem(context, clusterInfo, filesystemName); err != nil { return err } - logger.Infof("downed filesystem %q", filesystemName) + log.NamedInfo(opcontroller.NsName(clusterInfo.Namespace, filesystemName), logger, "downed filesystem %q", filesystemName) return nil } diff --git a/pkg/operator/ceph/file/health.go b/pkg/operator/ceph/file/health.go index 031fa1c29..aa821a57c 100644 --- a/pkg/operator/ceph/file/health.go +++ b/pkg/operator/ceph/file/health.go @@ -24,6 +24,7 @@ import ( cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1" "github.com/rook/rook/pkg/clusterd" cephclient "github.com/rook/rook/pkg/daemon/ceph/client" + "github.com/rook/rook/pkg/util/log" "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -57,7 +58,7 @@ func newMirrorChecker(context *clusterd.Context, client client.Client, clusterIn // allow overriding the check interval checkInterval := fsSpec.StatusCheck.Mirror.Interval if checkInterval != nil { - logger.Infof("filesystem %q mirroring status check interval is %q", namespacedName.Name, checkInterval) + log.NamedInfo(namespacedName, logger, "filesystem mirroring status check interval is %q", checkInterval) c.interval = checkInterval.Duration } @@ -70,21 +71,21 @@ func (c *mirrorChecker) checkMirroring(context context.Context) { err := c.checkMirroringHealth() if err != nil { c.updateStatusMirroring(nil, nil, err.Error()) - logger.Debugf("failed to check filesystem mirroring status %q. %v", c.namespacedName.Name, err) + log.NamedDebug(c.namespacedName, logger, "failed to check filesystem mirroring status. %v", err) } for { select { case <-context.Done(): - logger.Infof("stopping monitoring filesystem mirroring status %q", c.namespacedName.Name) + log.NamedInfo(c.namespacedName, logger, "stopping monitoring filesystem mirroring status") return case <-time.After(c.interval): - logger.Debugf("checking filesystem mirroring status %q", c.namespacedName.Name) + log.NamedDebug(c.namespacedName, logger, "checking filesystem mirroring status") err := c.checkMirroringHealth() if err != nil { c.updateStatusMirroring(nil, nil, err.Error()) - logger.Debugf("failed to check filesystem %q mirroring status. %v", c.namespacedName.Name, err) + log.NamedDebug(c.namespacedName, logger, "failed to check filesystem mirroring status. %v", err) } } } diff --git a/pkg/operator/ceph/file/mds/config.go b/pkg/operator/ceph/file/mds/config.go index 6cb74ca98..35174bc2e 100644 --- a/pkg/operator/ceph/file/mds/config.go +++ b/pkg/operator/ceph/file/mds/config.go @@ -23,6 +23,8 @@ import ( "github.com/pkg/errors" "github.com/rook/rook/pkg/operator/ceph/config" "github.com/rook/rook/pkg/operator/ceph/config/keyring" + opcontroller "github.com/rook/rook/pkg/operator/ceph/controller" + "github.com/rook/rook/pkg/util/log" kerrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -50,7 +52,7 @@ func (c *Cluster) generateKeyring(m *mdsConfig) (string, error) { } if c.shouldRotateCephxKeys { - logger.Infof("rotating cephx key for CephFileSystem %q", m.ResourceName) + log.NamedInfo(opcontroller.NsName(c.fs.Namespace, c.fs.Name), logger, "rotating cephx key for CephFileSystem") newKey, err := s.RotateKey(user) if err != nil { return "", errors.Wrapf(err, "failed to rotate cephx key for CephFileSystem %q", m.ResourceName) @@ -63,9 +65,9 @@ func (c *Cluster) generateKeyring(m *mdsConfig) (string, error) { err = c.context.Clientset.CoreV1().Secrets(c.fs.Namespace).Delete(c.clusterInfo.Context, m.ResourceName, metav1.DeleteOptions{}) if err != nil { if kerrors.IsNotFound(err) { - logger.Debugf("legacy mds key %s is already removed", m.ResourceName) + log.NamedDebug(opcontroller.NsName(c.fs.Namespace, c.fs.Name), logger, "legacy mds key %s is already removed", m.ResourceName) } else { - logger.Warningf("legacy mds key %q could not be removed. %v", m.ResourceName, err) + log.NamedWarning(opcontroller.NsName(c.fs.Namespace, c.fs.Name), logger, "legacy mds key %q could not be removed. %v", m.ResourceName, err) } } diff --git a/pkg/operator/ceph/file/mds/mds.go b/pkg/operator/ceph/file/mds/mds.go index 4f55dc500..1181f4e87 100644 --- a/pkg/operator/ceph/file/mds/mds.go +++ b/pkg/operator/ceph/file/mds/mds.go @@ -37,6 +37,7 @@ import ( cephver "github.com/rook/rook/pkg/operator/ceph/version" "github.com/rook/rook/pkg/operator/k8sutil" "github.com/rook/rook/pkg/util/exec" + "github.com/rook/rook/pkg/util/log" kerrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" @@ -96,6 +97,7 @@ var UpdateDeploymentAndWait = mon.UpdateCephDeploymentAndWait // Start starts or updates a Ceph mds cluster in Kubernetes. func (c *Cluster) Start() error { + nsName := controller.NsName(c.fs.Namespace, c.fs.Name) // Validate pod's memory if specified err := controller.CheckPodMemory(cephv1.ResourcesKeyMDS, c.fs.Spec.MetadataServer.Resources, cephMdsPodMinimumMemory) if err != nil { @@ -116,13 +118,13 @@ func (c *Cluster) Start() error { if err := c.upgradeMDS(); err != nil { return errors.Wrapf(err, "failed to upgrade MDS cluster for filesystem %q", c.fs.Name) } - logger.Infof("successfully upgraded MDS cluster for filesystem %q", c.fs.Name) + log.NamedInfo(controller.NsName(c.fs.Namespace, c.fs.Name), logger, "successfully upgraded MDS cluster for filesystem %q", c.fs.Name) } defer func() { if fsPreparedForUpgrade { if err := finishedWithDaemonUpgrade(c.context, c.clusterInfo, c.fs); err != nil { - logger.Errorf("for filesystem %q, USER should make sure the Ceph fs max_mds property is set to %d. %v", + log.NamedError(nsName, logger, "for filesystem %q, USER should make sure the Ceph fs max_mds property is set to %d. %v", c.fs.Name, c.fs.Spec.MetadataServer.ActiveCount, err) } } @@ -145,7 +147,7 @@ func (c *Cluster) Start() error { for i := 0; i < int(replicas); i++ { mdsDaemonName := k8sutil.IndexToName(i) if mdsToSkipReconcile.Has(mdsDaemonName) { - logger.Warningf("skipping reconcile for mds daemon %q with %q label", mdsDaemonName, cephv1.SkipReconcileLabelKey) + log.NamedWarning(nsName, logger, "skipping reconcile for mds daemon %q with %q label", mdsDaemonName, cephv1.SkipReconcileLabelKey) return nil } @@ -164,6 +166,7 @@ func (c *Cluster) Start() error { } func (c *Cluster) startDeployment(ctx context.Context, daemonLetterID string) (string, error) { + nsName := controller.NsName(c.fs.Namespace, c.fs.Name) // Each mds is id'ed by - daemonName := fmt.Sprintf("%s-%s", c.fs.Name, daemonLetterID) // resource name is rook-ceph-mds-- @@ -186,7 +189,7 @@ func (c *Cluster) startDeployment(ctx context.Context, daemonLetterID string) (s // Which means that we would only set the flag on newly created CephFilesystem CR // Unfortunately, on upgrade we would not set the flags which is not ideal for old clusters where we were no setting those flags // The KV supports setting those flags even if the MDS is running - logger.Info("setting mds config flags") + log.NamedInfo(nsName, logger, "setting mds config flags") err = c.setDefaultFlagsMonConfigStore(mdsConfig.DaemonID) if err != nil { // Getting EPERM typically happens when the flag may not be modified at runtime @@ -224,7 +227,7 @@ func (c *Cluster) startDeployment(ctx context.Context, daemonLetterID string) (s if !kerrors.IsAlreadyExists(createErr) { return "", errors.Wrapf(createErr, "failed to create mds deployment %s", mdsConfig.ResourceName) } - logger.Infof("deployment for mds %q already exists. updating if needed", mdsConfig.ResourceName) + log.NamedInfo(nsName, logger, "deployment for mds %q already exists. updating if needed", mdsConfig.ResourceName) _, err = c.context.Clientset.AppsV1().Deployments(c.fs.Namespace).Get(ctx, d.Name, metav1.GetOptions{}) if err != nil { return "", errors.Wrapf(err, "failed to get existing mds deployment %q for update", d.Name) @@ -241,6 +244,7 @@ func (c *Cluster) startDeployment(ctx context.Context, daemonLetterID string) (s // isCephUpgrade determine if mds version inferior than image func (c *Cluster) isCephUpgrade() (bool, error) { + nsName := controller.NsName(c.fs.Namespace, c.fs.Name) allVersions, err := cephclient.GetAllCephDaemonVersions(c.context, c.clusterInfo) if err != nil { return false, err @@ -251,7 +255,7 @@ func (c *Cluster) isCephUpgrade() (bool, error) { return false, err } if cephver.IsSuperior(c.clusterInfo.CephVersion, *currentVersion) { - logger.Debugf("ceph version for MDS %q is %q and target version is %q", key, currentVersion.String(), c.clusterInfo.CephVersion.String()) + log.NamedDebug(nsName, logger, "ceph version for MDS %q is %q and target version is %q", key, currentVersion.String(), c.clusterInfo.CephVersion.String()) return true, err } } @@ -260,7 +264,8 @@ func (c *Cluster) isCephUpgrade() (bool, error) { } func (c *Cluster) upgradeMDS() error { - logger.Infof("upgrading MDS cluster for filesystem %q", c.fs.Name) + nsName := controller.NsName(c.fs.Namespace, c.fs.Name) + log.NamedInfo(nsName, logger, "upgrading MDS cluster for filesystem %q", c.fs.Name) // 1. set allow_standby_replay to false if err := cephclient.AllowStandbyReplay(c.context, c.clusterInfo, c.fs.Name, false); err != nil { @@ -273,7 +278,7 @@ func (c *Cluster) upgradeMDS() error { } // 2. set max_mds to 1 - logger.Debug("start setting active mds count to 1") + log.NamedDebug(nsName, logger, "start setting active mds count to 1") if err := cephclient.SetNumMDSRanks(c.context, c.clusterInfo, c.fs.Name, 1); err != nil { return errors.Wrapf(err, "failed setting active mds count to %d", 1) } @@ -293,12 +298,12 @@ func (c *Cluster) upgradeMDS() error { desiredDeployments := map[string]bool{ fmt.Sprintf("%s-%s-%s", AppName, c.fs.Name, daemonLetterID): true, } - logger.Debugf("stop mds other than %s", daemonName) + log.NamedDebug(nsName, logger, "stop mds other than %s", daemonName) err = c.scaleDownDeployments(1, 1, desiredDeployments, false) if err != nil { return errors.Wrap(err, "failed to scale down deployments during upgrade") } - logger.Debugf("waiting for all standbys gone") + log.NamedDebug(nsName, logger, "waiting for all standbys gone") if err := cephclient.WaitForNoStandbys(c.context, c.clusterInfo, c.fs.Name, 3*time.Second, 120*time.Second); err != nil { return errors.Wrap(err, "failed to wait for stopping all standbys") } @@ -308,7 +313,7 @@ func (c *Cluster) upgradeMDS() error { if err != nil { return errors.Wrapf(err, "failed to upgrade mds %q", daemonName) } - logger.Debugf("successfully started daemon %q", daemonName) + log.NamedDebug(nsName, logger, "successfully started daemon %q", daemonName) // 6. all other MDS daemons will be updated and restarted by main MDS code path @@ -318,6 +323,7 @@ func (c *Cluster) upgradeMDS() error { } func (c *Cluster) scaleDownDeployments(replicas int32, activeCount int32, desiredDeployments map[string]bool, delete bool) error { + nsName := controller.NsName(c.fs.Namespace, c.fs.Name) // Remove extraneous mds deployments if they exist deps, err := getMdsDeployments(c.clusterInfo.Context, c.context, c.fs.Namespace, c.fs.Name) if err != nil { @@ -330,7 +336,7 @@ func (c *Cluster) scaleDownDeployments(replicas int32, activeCount int32, desire if !(len(deps.Items) > int(replicas)) { // It's possible to check if there are fewer deployments than desired here, but that's // checked above, and if that condition exists here, it's likely the user's manual actions. - logger.Debugf("The number of mds deployments (%d) is not greater than the number desired (%d). no extraneous deployments to delete", + log.NamedDebug(nsName, logger, "The number of mds deployments (%d) is not greater than the number desired (%d). no extraneous deployments to delete", len(deps.Items), replicas) return nil } @@ -341,7 +347,7 @@ func (c *Cluster) scaleDownDeployments(replicas int32, activeCount int32, desire // if deleting them too quickly; therefore, wait until number of active mdses is desired if err := cephclient.WaitForActiveRanks(c.context, c.clusterInfo, c.fs.Name, activeCount, true, fsWaitForActiveTimeout); err != nil { errCount++ - logger.Errorf( + log.NamedError(nsName, logger, "number of active mds ranks is not as desired. it is potentially unsafe to continue with extraneous mds deletion, so stopping. "+ "USER should delete undesired mds daemons once filesystem %s is healthy. "+ "desired mds deployments for this filesystem are %+v. %v", @@ -356,19 +362,19 @@ func (c *Cluster) scaleDownDeployments(replicas int32, activeCount int32, desire // stop mds daemon only by scaling deployment replicas to 0 if err := scaleMdsDeployment(c.clusterInfo.Context, c.context, c.fs.Namespace, &localdeployment, 0); err != nil { errCount++ - logger.Errorf("failed to scale mds deployment %q. %v", localdeployment.GetName(), err) + log.NamedError(nsName, logger, "failed to scale mds deployment %q. %v", localdeployment.GetName(), err) } continue } if err := deleteMdsDeployment(c.clusterInfo.Context, c.context, c.fs.Namespace, &localdeployment); err != nil { errCount++ - logger.Errorf("failed to delete mds deployment. %v", err) + log.NamedError(nsName, logger, "failed to delete mds deployment. %v", err) } daemonName := strings.ReplaceAll(d.GetName(), fmt.Sprintf("%s-", AppName), "") err := c.DeleteMdsCephObjects(daemonName) if err != nil { - logger.Errorf("%v", err) + log.NamedError(nsName, logger, "%v", err) } } } @@ -379,25 +385,26 @@ func (c *Cluster) scaleDownDeployments(replicas int32, activeCount int32, desire if !delete { deletedOrStopped = "stopped" } - logger.Infof("successfully %s unwanted MDS deployments", deletedOrStopped) + log.NamedInfo(nsName, logger, "successfully %s unwanted MDS deployments", deletedOrStopped) return nil } func (c *Cluster) DeleteMdsCephObjects(mdsID string) error { + nsName := controller.NsName(c.fs.Namespace, c.fs.Name) monStore := config.GetMonStore(c.context, c.clusterInfo) who := fmt.Sprintf("mds.%s", mdsID) err := monStore.DeleteDaemon(who) if err != nil { return errors.Wrapf(err, "failed to delete mds config for %q in mon configuration database", who) } - logger.Infof("successfully deleted mds config for %q in mon configuration database", who) + log.NamedInfo(nsName, logger, "successfully deleted mds config for %q in mon configuration database", who) err = cephclient.AuthDelete(c.context, c.clusterInfo, who) if err != nil { return err } - logger.Infof("successfully deleted mds CephX key for %q", who) + log.NamedInfo(nsName, logger, "successfully deleted mds CephX key for %q", who) return nil } @@ -406,8 +413,9 @@ func (c *Cluster) DeleteMdsCephObjects(mdsID string) error { func finishedWithDaemonUpgrade(context *clusterd.Context, clusterInfo *cephclient.ClusterInfo, fs cephv1.CephFilesystem) error { fsName := fs.Name activeMDSCount := fs.Spec.MetadataServer.ActiveCount - logger.Debugf("restoring filesystem %s from daemon upgrade", fsName) - logger.Debugf("bringing num active MDS daemons for fs %s back to %d", fsName, activeMDSCount) + nsName := controller.NsName(fs.Namespace, fs.Name) + log.NamedDebug(nsName, logger, "restoring filesystem from daemon upgrade") + log.NamedDebug(nsName, logger, "bringing num active MDS daemons back to %d", activeMDSCount) // upgrade guide for mds: https://docs.ceph.com/en/latest/cephfs/upgrading/ if err := cephclient.SetNumMDSRanks(context, clusterInfo, fsName, activeMDSCount); err != nil { return errors.Wrapf(err, "Failed to restore filesystem %s following daemon upgrade", fsName) diff --git a/pkg/operator/ceph/file/mds/spec.go b/pkg/operator/ceph/file/mds/spec.go index 3deb14a34..5924fb412 100644 --- a/pkg/operator/ceph/file/mds/spec.go +++ b/pkg/operator/ceph/file/mds/spec.go @@ -26,6 +26,7 @@ import ( "github.com/rook/rook/pkg/operator/ceph/config/keyring" "github.com/rook/rook/pkg/operator/ceph/controller" "github.com/rook/rook/pkg/operator/k8sutil" + "github.com/rook/rook/pkg/util/log" apps "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" kerrors "k8s.io/apimachinery/pkg/api/errors" @@ -179,7 +180,7 @@ func getMdsDeployments(ctx context.Context, context *clusterd.Context, namespace func deleteMdsDeployment(ctx context.Context, clusterdContext *clusterd.Context, namespace string, deployment *apps.Deployment) error { // Delete the mds deployment - logger.Infof("deleting mds deployment %s", deployment.Name) + log.NamedInfo(controller.NsName(namespace, deployment.Name), logger, "deleting mds deployment") var gracePeriod int64 propagation := metav1.DeletePropagationForeground options := &metav1.DeleteOptions{GracePeriodSeconds: &gracePeriod, PropagationPolicy: &propagation} @@ -191,7 +192,7 @@ func deleteMdsDeployment(ctx context.Context, clusterdContext *clusterd.Context, func scaleMdsDeployment(ctx context.Context, clusterdContext *clusterd.Context, namespace string, deployment *apps.Deployment, replicas int32) error { // scale mds deployment - logger.Infof("scaling mds deployment %q to %d replicas", deployment.Name, replicas) + log.NamedInfo(controller.NsName(namespace, deployment.Name), logger, "scaling mds deployment to %d replicas", replicas) d, err := clusterdContext.Clientset.AppsV1().Deployments(namespace).Get(ctx, deployment.GetName(), metav1.GetOptions{}) if err != nil { if replicas != 0 && kerrors.IsNotFound(err) { diff --git a/pkg/operator/ceph/file/mirror/config.go b/pkg/operator/ceph/file/mirror/config.go index dd8aa3501..29efb87af 100644 --- a/pkg/operator/ceph/file/mirror/config.go +++ b/pkg/operator/ceph/file/mirror/config.go @@ -22,7 +22,9 @@ import ( "github.com/pkg/errors" "github.com/rook/rook/pkg/operator/ceph/config" "github.com/rook/rook/pkg/operator/ceph/config/keyring" + opcontroller "github.com/rook/rook/pkg/operator/ceph/controller" "github.com/rook/rook/pkg/operator/k8sutil" + "github.com/rook/rook/pkg/util/log" ) const ( @@ -60,7 +62,7 @@ func (r *ReconcileFilesystemMirror) generateKeyring(daemonConfig *daemonConfig) } if r.shouldRotateCephxKeys { - logger.Infof("rotating CephX key for CephFileSystemMirror %q in the namespace %q", daemonConfig.ResourceName, r.clusterInfo.Namespace) + log.NamedInfo(opcontroller.NsName(r.clusterInfo.Namespace, daemonConfig.ResourceName), logger, "rotating CephX key for CephFileSystemMirror") newKey, err := s.RotateKey(user) if err != nil { return "", errors.Wrapf(err, "failed to rotate CephX key for CephFileSystemMirror %q in the namespace %q", daemonConfig.ResourceName, r.clusterInfo.Namespace) diff --git a/pkg/operator/ceph/file/mirror/controller.go b/pkg/operator/ceph/file/mirror/controller.go index 004aa49bf..eb052dc4a 100644 --- a/pkg/operator/ceph/file/mirror/controller.go +++ b/pkg/operator/ceph/file/mirror/controller.go @@ -31,6 +31,7 @@ import ( opcontroller "github.com/rook/rook/pkg/operator/ceph/controller" "github.com/rook/rook/pkg/operator/ceph/reporting" "github.com/rook/rook/pkg/operator/k8sutil" + "github.com/rook/rook/pkg/util/log" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" kerrors "k8s.io/apimachinery/pkg/api/errors" @@ -159,7 +160,7 @@ func (r *ReconcileFilesystemMirror) Reconcile(context context.Context, request r if err != nil { return opcontroller.ImmediateRetryResult, errors.Wrapf(err, "failed set ready failure status to the cephFileSystemMirror %q", request.NamespacedName) } - logger.Errorf("failed to reconcile %v", err) + log.NamedError(request.NamespacedName, logger, "failed to reconcile %v", err) } return reporting.ReportReconcileResult(logger, r.recorder, request, &cephFilesystemMirror, reconcileResponse, err) @@ -171,7 +172,7 @@ func (r *ReconcileFilesystemMirror) reconcile(request reconcile.Request) (reconc err := r.client.Get(r.opManagerContext, request.NamespacedName, filesystemMirror) if err != nil { if kerrors.IsNotFound(err) { - logger.Debug("CephFilesystemMirror resource not found. Ignoring since object must be deleted.") + log.NamedDebug(request.NamespacedName, logger, "CephFilesystemMirror resource not found. Ignoring since object must be deleted.") return reconcile.Result{}, *filesystemMirror, nil } // Error reading the object - requeue the request. @@ -200,7 +201,7 @@ func (r *ReconcileFilesystemMirror) reconcile(request reconcile.Request) (reconc // Make sure a CephCluster is present otherwise do nothing cephCluster, isReadyToReconcile, _, reconcileResponse := opcontroller.IsReadyToReconcile(r.opManagerContext, r.client, request.NamespacedName, controllerName) if !isReadyToReconcile { - logger.Debugf("CephCluster resource not ready in namespace %q, retrying in %q.", request.NamespacedName.Namespace, reconcileResponse.RequeueAfter.String()) + log.NamedDebug(request.NamespacedName, logger, "CephCluster resource not ready in namespace %q, retrying in %q.", request.NamespacedName.Namespace, reconcileResponse.RequeueAfter.String()) r.recorder.Event(filesystemMirror, v1.EventTypeNormal, string(cephv1.ReconcileSucceeded), "successfully removed finalizer") return reconcileResponse, *filesystemMirror, nil @@ -251,11 +252,11 @@ func (r *ReconcileFilesystemMirror) reconcile(request reconcile.Request) (reconc return reconcile.Result{}, *filesystemMirror, errors.Wrapf(err, "failed to determine if cephx keys should be rotated for the cephFileSystemMirror %q", request.NamespacedName) } if r.shouldRotateCephxKeys { - logger.Infof("cephx keys for CephFilesystemMirror %q will be rotated", request.NamespacedName) + log.NamedInfo(request.NamespacedName, logger, "cephx keys for CephFilesystemMirror will be rotated") } // CREATE/UPDATE - logger.Debug("reconciling ceph filesystem mirror deployments") + log.NamedDebug(request.NamespacedName, logger, "reconciling ceph filesystem mirror deployments") reconcileResponse, err = r.reconcileFilesystemMirror(filesystemMirror) if err != nil { return opcontroller.ImmediateRetryResult, *filesystemMirror, errors.Wrap(err, "failed to create ceph filesystem mirror deployments") @@ -271,7 +272,7 @@ func (r *ReconcileFilesystemMirror) reconcile(request reconcile.Request) (reconc } // Return and do not requeue - logger.Debug("done reconciling ceph filesystem mirror") + log.NamedDebug(request.NamespacedName, logger, "done reconciling ceph filesystem mirror") return reconcile.Result{}, *filesystemMirror, nil } @@ -301,7 +302,7 @@ func (r *ReconcileFilesystemMirror) updateStatus(observedGeneration int64, names err := r.client.Get(r.opManagerContext, namespacedName, fsMirror) if err != nil { if kerrors.IsNotFound(err) { - logger.Debugf("CephFilesystemMirror resource %q not found. Ignoring since object must be deleted.", namespacedName) + log.NamedDebug(namespacedName, logger, "CephFilesystemMirror resource not found. Ignoring since object must be deleted.") return nil } return errors.Wrapf(err, "failed to retrieve filesystem mirror %q to update status to %v", namespacedName, status) @@ -329,6 +330,6 @@ func (r *ReconcileFilesystemMirror) updateStatus(observedGeneration int64, names return err } - logger.Debugf("filesystem mirror %q status updated to %q", namespacedName, status) + log.NamedDebug(namespacedName, logger, "filesystem mirror status updated to %q", status) return nil } diff --git a/pkg/operator/ceph/file/mirror/mirror.go b/pkg/operator/ceph/file/mirror/mirror.go index 4733d0bad..f242fd97f 100644 --- a/pkg/operator/ceph/file/mirror/mirror.go +++ b/pkg/operator/ceph/file/mirror/mirror.go @@ -26,6 +26,7 @@ import ( "github.com/rook/rook/pkg/operator/ceph/config/keyring" "github.com/rook/rook/pkg/operator/ceph/controller" "github.com/rook/rook/pkg/operator/k8sutil" + "github.com/rook/rook/pkg/util/log" kerrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" @@ -42,6 +43,7 @@ var updateDeploymentAndWait = mon.UpdateCephDeploymentAndWait // Start begins the process of running filesystem mirroring daemons. func (r *ReconcileFilesystemMirror) start(filesystemMirror *cephv1.CephFilesystemMirror) error { + nsName := controller.NsName(filesystemMirror.Namespace, filesystemMirror.Name) // Validate pod's memory if specified err := controller.CheckPodMemory(cephv1.ResourcesKeyFilesystemMirror, filesystemMirror.Spec.Resources, cephFilesystemMirrorPodMinimumMemory) if err != nil { @@ -85,11 +87,11 @@ func (r *ReconcileFilesystemMirror) start(filesystemMirror *cephv1.CephFilesyste if !kerrors.IsAlreadyExists(err) { return errors.Wrapf(err, "failed to create %q deployment", d.Name) } - logger.Infof("deployment for filesystem-mirror %q already exists. updating if needed", d.Name) + log.NamedInfo(nsName, logger, "deployment for filesystem-mirror already exists. updating if needed") if err := updateDeploymentAndWait(r.context, r.clusterInfo, d, config.FilesystemMirrorType, AppName, r.cephClusterSpec.SkipUpgradeChecks, false); err != nil { // fail could be an issue updating label selector (immutable), so try del and recreate - logger.Debugf("updateDeploymentAndWait failed for filesystem-mirror %q. Attempting del-and-recreate. %v", d.Name, err) + log.NamedDebug(nsName, logger, "updateDeploymentAndWait failed for filesystem-mirror %q. Attempting del-and-recreate. %v", d.Name, err) err = r.context.Clientset.AppsV1().Deployments(filesystemMirror.Namespace).Delete(r.opManagerContext, d.Name, metav1.DeleteOptions{}) if err != nil && !kerrors.IsNotFound(err) { return errors.Wrapf(err, "failed to delete filesystem-mirror deployment %q during del-and-recreate update attempt", d.Name) @@ -100,7 +102,7 @@ func (r *ReconcileFilesystemMirror) start(filesystemMirror *cephv1.CephFilesyste } } - logger.Infof("%q deployment started", AppName) + log.NamedInfo(nsName, logger, "%q deployment started", AppName) return nil } diff --git a/pkg/operator/ceph/file/status.go b/pkg/operator/ceph/file/status.go index 452162c54..f9353742e 100644 --- a/pkg/operator/ceph/file/status.go +++ b/pkg/operator/ceph/file/status.go @@ -24,6 +24,7 @@ import ( cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1" "github.com/rook/rook/pkg/operator/ceph/reporting" "github.com/rook/rook/pkg/operator/k8sutil" + "github.com/rook/rook/pkg/util/log" kerrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/util/retry" @@ -36,7 +37,7 @@ func (r *ReconcileCephFilesystem) updateStatus(observedGeneration int64, namespa err := r.client.Get(r.opManagerContext, namespacedName, fs) if err != nil { if kerrors.IsNotFound(err) { - logger.Debugf("CephFilesystem resource %q not found. Ignoring since object must be deleted.", namespacedName.String()) + log.NamedDebug(namespacedName, logger, "CephFilesystem resource %q not found. Ignoring since object must be deleted.", namespacedName.String()) return nil } return errors.Wrapf(err, "failed to retrieve filesystem %q to update status to %q.", namespacedName.String(), status) @@ -66,7 +67,7 @@ func (r *ReconcileCephFilesystem) updateStatus(observedGeneration int64, namespa return nil, err } - logger.Debugf("filesystem %q status updated to %q", namespacedName.String(), status) + log.NamedDebug(namespacedName, logger, "filesystem %q status updated to %q", namespacedName.String(), status) return fs, nil } @@ -75,10 +76,10 @@ func (c *mirrorChecker) updateStatusMirroring(mirrorStatus []cephv1.FilesystemMi fs := &cephv1.CephFilesystem{} if err := c.client.Get(c.clusterInfo.Context, c.namespacedName, fs); err != nil { if kerrors.IsNotFound(err) { - logger.Debug("CephFilesystem resource not found. Ignoring since object must be deleted.") + log.NamedDebug(c.namespacedName, logger, "CephFilesystem resource not found. Ignoring since object must be deleted.") return } - logger.Warningf("failed to retrieve ceph filesystem %q to update mirroring status. %v", c.namespacedName.Name, err) + log.NamedWarning(c.namespacedName, logger, "failed to retrieve ceph filesystem to update mirroring status. %v", err) return } if fs.Status == nil { @@ -88,11 +89,11 @@ func (c *mirrorChecker) updateStatusMirroring(mirrorStatus []cephv1.FilesystemMi // Update the CephFilesystem CR status field fs.Status = toCustomResourceStatus(fs.Status, mirrorStatus, snapSchedStatus, details) if err := reporting.UpdateStatus(c.client, fs); err != nil { - logger.Errorf("failed to set ceph filesystem %q mirroring status. %v", c.namespacedName.Name, err) + log.NamedError(c.namespacedName, logger, "failed to set ceph filesystem mirroring status. %v", err) return } - logger.Debugf("ceph filesystem %q mirroring status updated", c.namespacedName.Name) + log.NamedDebug(c.namespacedName, logger, "ceph filesystem %q mirroring status updated", c.namespacedName.Name) } func toCustomResourceStatus(currentStatus *cephv1.CephFilesystemStatus, mirrorStatus []cephv1.FilesystemMirroringInfo, snapSchedStatus []cephv1.FilesystemSnapshotSchedulesSpec, details string) *cephv1.CephFilesystemStatus { diff --git a/pkg/operator/ceph/file/subvolumegroup/controller.go b/pkg/operator/ceph/file/subvolumegroup/controller.go index 433931f97..0731fc9d8 100644 --- a/pkg/operator/ceph/file/subvolumegroup/controller.go +++ b/pkg/operator/ceph/file/subvolumegroup/controller.go @@ -29,6 +29,7 @@ import ( "github.com/pkg/errors" cephclient "github.com/rook/rook/pkg/daemon/ceph/client" "github.com/rook/rook/pkg/util/exec" + "github.com/rook/rook/pkg/util/log" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/handler" @@ -141,7 +142,7 @@ func (r *ReconcileCephFilesystemSubVolumeGroup) Reconcile(context context.Contex // workaround because the rook logging mechanism is not compatible with the controller-runtime logging interface reconcileResponse, err := r.reconcile(request) if err != nil { - logger.Errorf("failed to reconcile %q. %v", request.NamespacedName, err) + log.NamedError(request.NamespacedName, logger, "failed to reconcile %q. %v", request.NamespacedName, err) } return reconcileResponse, err @@ -154,7 +155,7 @@ func (r *ReconcileCephFilesystemSubVolumeGroup) reconcile(request reconcile.Requ err := r.client.Get(r.opManagerContext, request.NamespacedName, cephFilesystemSubVolumeGroup) if err != nil { if kerrors.IsNotFound(err) { - logger.Debugf("cephFilesystemSubVolumeGroup resource %q not found. Ignoring since object must be deleted.", namespacedName) + log.NamedDebug(request.NamespacedName, logger, "cephFilesystemSubVolumeGroup resource %q not found. Ignoring since object must be deleted.", namespacedName) return reconcile.Result{}, nil } // Error reading the object - requeue the request. @@ -171,7 +172,7 @@ func (r *ReconcileCephFilesystemSubVolumeGroup) reconcile(request reconcile.Requ return reconcile.Result{}, errors.Wrap(err, "failed to add finalizer") } if generationUpdated { - logger.Infof("reconciling the subvolume group %q after adding finalizer", cephFilesystemSubVolumeGroup.Name) + log.NamedInfo(request.NamespacedName, logger, "reconciling the subvolume group %q after adding finalizer", cephFilesystemSubVolumeGroup.Name) return reconcile.Result{}, nil } @@ -211,7 +212,7 @@ func (r *ReconcileCephFilesystemSubVolumeGroup) reconcile(request reconcile.Requ // DELETE: the CR was deleted if !cephFilesystemSubVolumeGroup.GetDeletionTimestamp().IsZero() { - logger.Debugf("deleting subvolume group %q", namespacedName) + log.NamedDebug(request.NamespacedName, logger, "deleting subvolume group %q", namespacedName) cephFsSvgList := &cephv1.CephFilesystemSubVolumeGroupList{} namespaceListOpts := client.InNamespace(cephCluster.Namespace) @@ -224,7 +225,7 @@ func (r *ReconcileCephFilesystemSubVolumeGroup) reconcile(request reconcile.Requ // On external cluster, we don't delete the subvolume group, it has to be deleted manually if cephCluster.Spec.External.Enable { - logger.Warningf("external subvolume group %q deletion is not supported, delete it manually", namespacedName) + log.NamedWarning(namespacedName, logger, "external subvolume group deletion is not supported, delete it manually") } else if len(cephFsSvgList.Items) <= 1 { // If we have more than one cephFilesystemSubvolumeGroup CR with same spec.filesystem and same spec.name, // skip the call to deleteSubVolumeGroup(). This allows the finalizer to be removed without @@ -240,7 +241,7 @@ func (r *ReconcileCephFilesystemSubVolumeGroup) reconcile(request reconcile.Requ return reconcile.Result{}, errors.Wrapf(err, "failed to delete ceph filesystem subvolume group %q", cephFilesystemSubVolumeGroup.Name) } } else { - logger.Infof("Removing finalizer from SVG CR %s without checking if the subvolume group contains any data as more than one SVG(count %d) contains the same filesystem and same SVG.", cephFilesystemSubVolumeGroup.Name, len(cephFsSvgList.Items)) + log.NamedInfo(request.NamespacedName, logger, "Removing finalizer from SVG CR %s without checking if the subvolume group contains any data as more than one SVG(count %d) contains the same filesystem and same SVG.", cephFilesystemSubVolumeGroup.Name, len(cephFsSvgList.Items)) } if len(cephFsSvgList.Items) <= 1 { @@ -265,7 +266,7 @@ func (r *ReconcileCephFilesystemSubVolumeGroup) reconcile(request reconcile.Requ cephFilesystemSubVolumeGroupName = cephFilesystemSubVolumeGroup.Spec.Name } if cephCluster.Spec.External.Enable { - logger.Debug("skip creating external subvolume in external mode, create it manually, the controller will assume it's there") + log.NamedDebug(request.NamespacedName, logger, "skip creating external subvolume in external mode, create it manually, the controller will assume it's there") err = r.updateClusterConfig(cephFilesystemSubVolumeGroup, cephCluster) if err != nil { return reconcile.Result{}, errors.Wrap(err, "failed to save cluster config") @@ -332,7 +333,7 @@ func (r *ReconcileCephFilesystemSubVolumeGroup) reconcile(request reconcile.Requ } // Return and do not requeue - logger.Debugf("done reconciling cephFilesystemSubVolumeGroup %q", namespacedName) + log.NamedDebug(request.NamespacedName, logger, "done reconciling cephFilesystemSubVolumeGroup %q", namespacedName) return reconcile.Result{}, nil } @@ -374,7 +375,8 @@ func (r *ReconcileCephFilesystemSubVolumeGroup) updateClusterConfig(cephFilesyst // Create the ceph filesystem subvolume group func (r *ReconcileCephFilesystemSubVolumeGroup) createOrUpdateSubVolumeGroup(cephFilesystemSubVolumeGroup *cephv1.CephFilesystemSubVolumeGroup) error { - logger.Infof("creating ceph filesystem subvolume group %s in namespace %s", cephFilesystemSubVolumeGroup.Name, cephFilesystemSubVolumeGroup.Namespace) + nsName := opcontroller.NsName(cephFilesystemSubVolumeGroup.Namespace, cephFilesystemSubVolumeGroup.Name) + log.NamedInfo(nsName, logger, "creating ceph filesystem subvolume group") err := cephclient.CreateCephFSSubVolumeGroup(r.context, r.clusterInfo, cephFilesystemSubVolumeGroup.Spec.FilesystemName, getSubvolumeGroupName(cephFilesystemSubVolumeGroup), &cephFilesystemSubVolumeGroup.Spec) if err != nil { @@ -388,13 +390,13 @@ func (r *ReconcileCephFilesystemSubVolumeGroup) createOrUpdateSubVolumeGroup(cep func (r *ReconcileCephFilesystemSubVolumeGroup) deleteSubVolumeGroup(cephFilesystemSubVolumeGroup *cephv1.CephFilesystemSubVolumeGroup, cephCluster *cephv1.CephCluster, ) error { - namespacedName := fmt.Sprintf("%s/%s", cephFilesystemSubVolumeGroup.Namespace, cephFilesystemSubVolumeGroup.Name) - logger.Infof("deleting ceph filesystem subvolume group object %q", namespacedName) + nsName := opcontroller.NsName(cephFilesystemSubVolumeGroup.Namespace, cephFilesystemSubVolumeGroup.Name) + log.NamedInfo(nsName, logger, "deleting ceph filesystem subvolume group object") if err := cephclient.DeleteCephFSSubVolumeGroup(r.context, r.clusterInfo, cephFilesystemSubVolumeGroup.Spec.FilesystemName, getSubvolumeGroupName(cephFilesystemSubVolumeGroup)); err != nil { code, ok := exec.ExitStatus(err) // If the subvolume group does not exit, we should not return an error if ok && code == int(syscall.ENOENT) { - logger.Debugf("ceph filesystem subvolume group %q do not exist", namespacedName) + log.NamedDebug(nsName, logger, "ceph filesystem subvolume group does not exist") return nil } // If the subvolume group has subvolumes the command will fail with: @@ -405,7 +407,7 @@ func (r *ReconcileCephFilesystemSubVolumeGroup) deleteSubVolumeGroup(cephFilesys // cleanup cephFS subvolumes cleanupErr := r.cleanup(cephFilesystemSubVolumeGroup, cephCluster) if cleanupErr != nil { - return errors.Wrapf(cleanupErr, "failed to clean up all the ceph resources created by subVolumeGroup %q", namespacedName) + return errors.Wrapf(cleanupErr, "failed to clean up all the ceph resources created by subVolumeGroup %q", nsName) } msg = fmt.Sprintf("failed to delete ceph filesystem subvolume group %q, started clean up job to delete the subvolumes", cephFilesystemSubVolumeGroup.Name) } @@ -416,7 +418,7 @@ func (r *ReconcileCephFilesystemSubVolumeGroup) deleteSubVolumeGroup(cephFilesys return errors.Wrapf(err, "failed to delete ceph filesystem subvolume group %q", cephFilesystemSubVolumeGroup.Name) } - logger.Infof("deleted ceph filesystem subvolume group %q", namespacedName) + log.NamedInfo(nsName, logger, "deleted ceph filesystem subvolume group") return nil } @@ -426,7 +428,7 @@ func (r *ReconcileCephFilesystemSubVolumeGroup) updateStatus(observedGeneration cephFilesystemSubVolumeGroup := &cephv1.CephFilesystemSubVolumeGroup{} if err := r.client.Get(r.opManagerContext, name, cephFilesystemSubVolumeGroup); err != nil { if kerrors.IsNotFound(err) { - logger.Debugf("CephFilesystemSubVolumeGroup %q not found. Ignoring since object must be deleted.", name) + log.NamedDebug(name, logger, "CephFilesystemSubVolumeGroup not found. Ignoring since object must be deleted.") return nil } return errors.Wrapf(err, "failed to retrieve ceph filesystem subvolume group %q to update status to %q", name, status) @@ -450,10 +452,10 @@ func (r *ReconcileCephFilesystemSubVolumeGroup) updateStatus(observedGeneration return nil }) if err != nil { - logger.Errorf("failed to update ceph filesystem subvolume group %q status to %q after retries. %v", name, status, err) + log.NamedError(name, logger, "failed to update ceph filesystem subvolume group status to %q after retries. %v", status, err) return } - logger.Debugf("ceph filesystem subvolume group %q status updated to %q", name, status) + log.NamedDebug(name, logger, "ceph filesystem subvolume group status updated to %q", status) } func buildClusterID(cephFilesystemSubVolumeGroup *cephv1.CephFilesystemSubVolumeGroup) string { @@ -465,7 +467,8 @@ func buildClusterID(cephFilesystemSubVolumeGroup *cephv1.CephFilesystemSubVolume } func (r *ReconcileCephFilesystemSubVolumeGroup) cleanup(svg *cephv1.CephFilesystemSubVolumeGroup, cephCluster *cephv1.CephCluster) error { - logger.Infof("starting cleanup of the ceph resources for subVolumeGroup %q in namespace %q", svg.Name, svg.Namespace) + nsName := opcontroller.NsName(svg.Namespace, svg.Name) + log.NamedInfo(nsName, logger, "starting cleanup of the ceph resources for subVolumeGroup") svgName := svg.Spec.Name // use resource name if `spec.Name` is empty in the subvolumeGroup CR. if svgName == "" { diff --git a/pkg/operator/ceph/nfs/config.go b/pkg/operator/ceph/nfs/config.go index 69d49a3b1..af7bd8da0 100644 --- a/pkg/operator/ceph/nfs/config.go +++ b/pkg/operator/ceph/nfs/config.go @@ -28,9 +28,11 @@ import ( "github.com/rook/rook/pkg/clusterd" cephclient "github.com/rook/rook/pkg/daemon/ceph/client" "github.com/rook/rook/pkg/operator/ceph/config/keyring" + opcontroller "github.com/rook/rook/pkg/operator/ceph/controller" cephver "github.com/rook/rook/pkg/operator/ceph/version" "github.com/rook/rook/pkg/operator/k8sutil" "github.com/rook/rook/pkg/util/exec" + "github.com/rook/rook/pkg/util/log" ) const kerberosRadosObjectName = "kerberos" @@ -72,6 +74,7 @@ func getRadosURL(n *cephv1.CephNFS) string { } func (r *ReconcileCephNFS) generateKeyring(n *cephv1.CephNFS, name string) error { + nsName := opcontroller.NsName(n.Namespace, n.Name) osdCaps := fmt.Sprintf("allow rw pool=%s", n.Spec.RADOS.Pool) if n.Spec.RADOS.Namespace != "" { osdCaps = fmt.Sprintf("%s namespace=%s", osdCaps, n.Spec.RADOS.Namespace) @@ -89,7 +92,7 @@ func (r *ReconcileCephNFS) generateKeyring(n *cephv1.CephNFS, name string) error } if r.shouldRotateCephxKeys { - logger.Infof("rotating cephx key for nfs daemon %q in the namespace %q", instanceName(n, name), n.Namespace) + log.NamedInfo(nsName, logger, "rotating cephx key for nfs daemon %q", instanceName(n, name)) newKey, err := s.RotateKey(user) if err != nil { return errors.Wrapf(err, "failed to rotate cephx key for nfs daemon %q", instanceName(n, name)) @@ -176,7 +179,8 @@ func setKerberosRadosConfig(context *clusterd.Context, clusterInfo *cephclient.C radosNs := nfs.Spec.RADOS.Namespace radosInfoStr := fmt.Sprintf("rados://%s/%s/", radosPool, radosNs) - logger.Infof("ensuring kerberos configuration exists in rados namespace %s", radosInfoStr) + nsName := opcontroller.NsName(nfs.Namespace, nfs.Name) + log.NamedInfo(nsName, logger, "ensuring kerberos configuration exists in rados namespace %s", radosInfoStr) // write ganesha kerberos configuration block into a temp file krbBlockFile, err := os.CreateTemp("", "krb-block-file") @@ -219,7 +223,8 @@ func removeKerberosRadosConfig(context *clusterd.Context, clusterInfo *cephclien radosNs := nfs.Spec.RADOS.Namespace radosInfoStr := fmt.Sprintf("rados://%s/%s/", radosPool, radosNs) - logger.Infof("ensuring kerberos configuration is removed from rados namespace %s", radosInfoStr) + nsName := opcontroller.NsName(nfs.Namespace, nfs.Name) + log.NamedInfo(nsName, logger, "ensuring kerberos configuration is removed from rados namespace %s", radosInfoStr) // remove config block that includes the kerberos config object from the ganesha config object ganeshaConfigObjName := getGaneshaConfigObject(nfs) @@ -247,6 +252,7 @@ func atomicPrependToConfigObject( ) error { tmpFilePattern := fmt.Sprintf("%s_%s_%s_prepend", radosPool, radosNamespace, objectName) objInfoString := fmt.Sprintf("rados://%s/%s/%s", radosPool, radosNamespace, objectName) + nsName := opcontroller.NsName(clusterInfo.Namespace, radosPool) // read object into temp file tempFile, err := os.CreateTemp("", tmpFilePattern) @@ -266,21 +272,21 @@ func atomicPrependToConfigObject( // planning to perform 2 commands after the lock: get object, and optionally write object, so // use lock timeout of 2x the normal ceph command timeout - logger.Infof("locking rados object %q", objInfoString) + log.NamedInfo(nsName, logger, "locking rados object %q", objInfoString) cookie, err := cephclient.RadosLockObject(context, clusterInfo, radosPool, radosNamespace, objectName, lockName, exec.CephCommandsTimeout*2) if err != nil { return err // already a good err message } - logger.Infof("successfully locked rados object %q", objInfoString) + log.NamedInfo(nsName, logger, "successfully locked rados object %q", objInfoString) defer func() { - logger.Infof("unlocking rados object %q", objInfoString) + log.NamedInfo(nsName, logger, "unlocking rados object %q", objInfoString) err := cephclient.RadosUnlockObject(context, clusterInfo, radosPool, radosNamespace, objectName, lockName, cookie) if err != nil { - logger.Infof("failed to unlock rados object %q, but since the lock has a timeout, we will continue. %v", objInfoString, err) + log.NamedInfo(nsName, logger, "failed to unlock rados object %q, but since the lock has a timeout, we will continue. %v", objInfoString, err) } - logger.Infof("successfully unlocked rados object %q", objInfoString) + log.NamedInfo(nsName, logger, "successfully unlocked rados object %q", objInfoString) }() cmd := cephclient.NewRadosCommand(context, clusterInfo, @@ -295,10 +301,10 @@ func atomicPrependToConfigObject( } if strings.Contains(string(rawObj), configBlock) { - logger.Debugf("rados object %s already has config block: %s", objInfoString, configBlock) + log.NamedDebug(nsName, logger, "rados object %s already has config block: %s", objInfoString, configBlock) return nil } - logger.Debugf("rados object %s will have config block prepended: %s", objInfoString, configBlock) + log.NamedDebug(nsName, logger, "rados object %s will have config block prepended: %s", objInfoString, configBlock) newConfig := fmt.Sprintf("%s%s", configBlock, string(rawObj)) if err := os.WriteFile(tempFile.Name(), []byte(newConfig), fs.FileMode(0o644)); err != nil { @@ -322,6 +328,7 @@ func atomicRemoveFromConfigObject(context *clusterd.Context, clusterInfo *cephcl ) error { tmpFilePattern := fmt.Sprintf("%s_%s_%s_remove", radosPool, radosNamespace, objectName) objInfoString := fmt.Sprintf("rados://%s/%s/%s", radosPool, radosNamespace, objectName) + nsName := opcontroller.NsName(clusterInfo.Namespace, radosPool) // read object into temp file tempFile, err := os.CreateTemp("", tmpFilePattern) @@ -341,21 +348,21 @@ func atomicRemoveFromConfigObject(context *clusterd.Context, clusterInfo *cephcl // planning to perform 2 commands after the lock: get object, and optionally write object, so // use lock timeout of 2x the normal ceph command timeout - logger.Infof("locking rados object %q", objInfoString) + log.NamedInfo(nsName, logger, "locking rados object %q", objInfoString) cookie, err := cephclient.RadosLockObject(context, clusterInfo, radosPool, radosNamespace, objectName, lockName, exec.CephCommandsTimeout*2) if err != nil { return err // already a good err message } - logger.Infof("successfully locked rados object %q", objInfoString) + log.NamedInfo(nsName, logger, "successfully locked rados object %q", objInfoString) defer func() { - logger.Infof("unlocking rados object %q", objInfoString) + log.NamedInfo(nsName, logger, "unlocking rados object %q", objInfoString) err := cephclient.RadosUnlockObject(context, clusterInfo, radosPool, radosNamespace, objectName, lockName, cookie) if err != nil { - logger.Infof("failed to unlock rados object %q, but since the lock has a timeout, we will continue. %v", objInfoString, err) + log.NamedInfo(nsName, logger, "failed to unlock rados object %q, but since the lock has a timeout, we will continue. %v", objInfoString, err) } - logger.Infof("successfully unlocked rados object %q", objInfoString) + log.NamedInfo(nsName, logger, "successfully unlocked rados object %q", objInfoString) }() cmd := cephclient.NewRadosCommand(context, clusterInfo, @@ -370,10 +377,10 @@ func atomicRemoveFromConfigObject(context *clusterd.Context, clusterInfo *cephcl } if !strings.Contains(string(rawObj), configBlock) { - logger.Debugf("rados object %q already does not have config block: %s", objInfoString, configBlock) + log.NamedDebug(nsName, logger, "rados object %q already does not have config block: %s", objInfoString, configBlock) return nil } - logger.Debugf("rados object %s will have config block removed: %s", objInfoString, configBlock) + log.NamedDebug(nsName, logger, "rados object %s will have config block removed: %s", objInfoString, configBlock) newConfig := strings.ReplaceAll(string(rawObj), configBlock, "") if err := os.WriteFile(tempFile.Name(), []byte(newConfig), fs.FileMode(0o644)); err != nil { diff --git a/pkg/operator/ceph/nfs/controller.go b/pkg/operator/ceph/nfs/controller.go index b6ee4fff1..fcec074b0 100644 --- a/pkg/operator/ceph/nfs/controller.go +++ b/pkg/operator/ceph/nfs/controller.go @@ -33,6 +33,7 @@ import ( opcontroller "github.com/rook/rook/pkg/operator/ceph/controller" "github.com/rook/rook/pkg/operator/ceph/reporting" "github.com/rook/rook/pkg/operator/k8sutil" + "github.com/rook/rook/pkg/util/log" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" kerrors "k8s.io/apimachinery/pkg/api/errors" @@ -166,7 +167,7 @@ func (r *ReconcileCephNFS) reconcile(request reconcile.Request) (reconcile.Resul err := r.client.Get(r.opManagerContext, request.NamespacedName, cephNFS) if err != nil { if kerrors.IsNotFound(err) { - logger.Debug("cephNFS resource not found. Ignoring since object must be deleted.") + log.NamedDebug(request.NamespacedName, logger, "cephNFS resource not found. Ignoring since object must be deleted.") return reconcile.Result{}, *cephNFS, nil } // Error reading the object - requeue the request. @@ -183,7 +184,7 @@ func (r *ReconcileCephNFS) reconcile(request reconcile.Request) (reconcile.Resul return reconcile.Result{}, *cephNFS, errors.Wrap(err, "failed to add finalizer") } if generationUpdated { - logger.Infof("reconciling the nfs %q after adding finalizer", cephNFS.Name) + log.NamedInfo(request.NamespacedName, logger, "reconciling the nfs after adding finalizer") return reconcile.Result{}, *cephNFS, nil } @@ -242,7 +243,7 @@ func (r *ReconcileCephNFS) reconcile(request reconcile.Request) (reconcile.Resul // DELETE: the CR was deleted if !cephNFS.GetDeletionTimestamp().IsZero() { - logger.Infof("deleting ceph nfs %q", cephNFS.Name) + log.NamedInfo(request.NamespacedName, logger, "deleting ceph nfs") r.recorder.Eventf(cephNFS, v1.EventTypeNormal, string(cephv1.ReconcileStarted), "deleting CephNFS %q", cephNFS.Name) // Detect running Ceph version @@ -313,7 +314,7 @@ func (r *ReconcileCephNFS) reconcile(request reconcile.Request) (reconcile.Resul return reconcile.Result{}, *cephNFS, errors.Wrap(err, "failed to determine if cephx keys should be rotated") } if r.shouldRotateCephxKeys { - logger.Infof("cephx keys for CephNFS %q will be rotated", request.NamespacedName) + log.NamedInfo(request.NamespacedName, logger, "cephx keys for CephNFS will be rotated") } // Check for the existence of the .nfs pool @@ -323,7 +324,7 @@ func (r *ReconcileCephNFS) reconcile(request reconcile.Request) (reconcile.Resul } // CREATE/UPDATE - logger.Debug("reconciling ceph nfs deployments") + log.NamedDebug(request.NamespacedName, logger, "reconciling ceph nfs deployments") _, err = r.reconcileCreateCephNFS(cephNFS) if err != nil { return reconcile.Result{}, *cephNFS, errors.Wrap(err, "failed to create ceph nfs deployments") @@ -340,11 +341,12 @@ func (r *ReconcileCephNFS) reconcile(request reconcile.Request) (reconcile.Resul } // Return and do not requeue - logger.Debug("done reconciling ceph nfs") + log.NamedDebug(request.NamespacedName, logger, "done reconciling ceph nfs") return reconcile.Result{}, *cephNFS, nil } func (r *ReconcileCephNFS) reconcileCreateCephNFS(cephNFS *cephv1.CephNFS) (reconcile.Result, error) { + nsName := opcontroller.NsName(cephNFS.Namespace, cephNFS.Name) if r.cephClusterSpec.External.Enable { _, err := opcontroller.ValidateCephVersionsBetweenLocalAndExternalClusters(r.context, r.clusterInfo) if err != nil { @@ -369,7 +371,7 @@ func (r *ReconcileCephNFS) reconcileCreateCephNFS(cephNFS *cephv1.CephNFS) (reco // Scale down case (CR value cephNFS.Spec.Server.Active changed) if currentNFSServerCount > cephNFS.Spec.Server.Active { - logger.Infof("scaling down ceph nfs %q from %d to %d", cephNFS.Name, currentNFSServerCount, cephNFS.Spec.Server.Active) + log.NamedInfo(nsName, logger, "scaling down ceph nfs from %d to %d", currentNFSServerCount, cephNFS.Spec.Server.Active) err := r.downCephNFS(cephNFS, currentNFSServerCount) if err != nil { return reconcile.Result{}, errors.Wrapf(err, "failed to scale down ceph nfs %q", cephNFS.Name) @@ -377,7 +379,7 @@ func (r *ReconcileCephNFS) reconcileCreateCephNFS(cephNFS *cephv1.CephNFS) (reco } // Update existing deployments and create new ones in the scale up case - logger.Infof("updating ceph nfs %q", cephNFS.Name) + log.NamedInfo(nsName, logger, "updating ceph nfs") err = r.upCephNFS(cephNFS) if err != nil { return reconcile.Result{}, errors.Wrapf(err, "failed to update ceph nfs %q", cephNFS.Name) @@ -393,7 +395,7 @@ func (r *ReconcileCephNFS) updateStatus(observedGeneration int64, namespacedName err := r.client.Get(r.opManagerContext, namespacedName, nfs) if err != nil { if kerrors.IsNotFound(err) { - logger.Debugf("CephNFS resource %q not found for updating status. Ignoring since object must be deleted.", namespacedName) + log.NamedDebug(namespacedName, logger, "CephNFS resource not found for updating status. Ignoring since object must be deleted.") return nil } return errors.Wrapf(err, "failed to get CephNFS %q for updating status to %+v", namespacedName, status) @@ -419,6 +421,6 @@ func (r *ReconcileCephNFS) updateStatus(observedGeneration int64, namespacedName if err != nil { return err } - logger.Debugf("CephNFS %q status updated to %q", namespacedName, status) + log.NamedDebug(namespacedName, logger, "CephNFS status updated to %q", status) return nil } diff --git a/pkg/operator/ceph/nfs/nfs.go b/pkg/operator/ceph/nfs/nfs.go index d2840aa14..ed1899e32 100644 --- a/pkg/operator/ceph/nfs/nfs.go +++ b/pkg/operator/ceph/nfs/nfs.go @@ -30,6 +30,7 @@ import ( "github.com/rook/rook/pkg/operator/ceph/controller" "github.com/rook/rook/pkg/operator/k8sutil" "github.com/rook/rook/pkg/util/exec" + "github.com/rook/rook/pkg/util/log" v1 "k8s.io/api/core/v1" kerrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -55,6 +56,7 @@ type daemonConfig struct { // Create the ganesha server func (r *ReconcileCephNFS) upCephNFS(n *cephv1.CephNFS) error { + nsName := controller.NsName(n.Namespace, n.Name) nfsToSkipReconcile, err := controller.GetDaemonsToSkipReconcile(r.clusterInfo.Context, r.context, n.Namespace, config.NfsType, AppName) if err != nil { return errors.Wrap(err, "failed to check for NFS daemons to skip reconcile") @@ -64,7 +66,7 @@ func (r *ReconcileCephNFS) upCephNFS(n *cephv1.CephNFS) error { id := k8sutil.IndexToName(i) if nfsToSkipReconcile.Has(fmt.Sprintf("%s-%s", n.Name, id)) { - logger.Warningf("skipping reconcile of nfs daemon %q with label %q", id, cephv1.SkipReconcileLabelKey) + log.NamedWarning(nsName, logger, "skipping reconcile of nfs daemon %q with label %q", id, cephv1.SkipReconcileLabelKey) continue } @@ -121,12 +123,12 @@ func (r *ReconcileCephNFS) upCephNFS(n *cephv1.CephNFS) error { if !kerrors.IsAlreadyExists(err) { return errors.Wrap(err, "failed to create ceph nfs deployment") } - logger.Infof("ceph nfs deployment %q already exists. updating if needed", deployment.Name) + log.NamedInfo(nsName, logger, "ceph nfs deployment %q already exists. updating if needed", deployment.Name) if err := updateDeploymentAndWait(r.context, r.clusterInfo, deployment, "nfs", id, r.cephClusterSpec.SkipUpgradeChecks, false); err != nil { return errors.Wrapf(err, "failed to update ceph nfs deployment %q", deployment.Name) } } else { - logger.Infof("ceph nfs deployment %q started", deployment.Name) + log.NamedInfo(nsName, logger, "ceph nfs deployment %q started", deployment.Name) } // create a service @@ -171,7 +173,8 @@ func (r *ReconcileCephNFS) addRADOSConfigFile(n *cephv1.CephNFS) error { } func (r *ReconcileCephNFS) addServerToDatabase(nfs *cephv1.CephNFS, name string) error { - logger.Infof("adding ganesha %q to grace db", name) + nsName := controller.NsName(nfs.Namespace, nfs.Name) + log.NamedInfo(nsName, logger, "adding ganesha %q to grace db", name) if err := r.runGaneshaRadosGrace(nfs, name, "add"); err != nil { return errors.Wrapf(err, "failed to add %q to grace db", name) @@ -181,10 +184,11 @@ func (r *ReconcileCephNFS) addServerToDatabase(nfs *cephv1.CephNFS, name string) } func (r *ReconcileCephNFS) removeServerFromDatabase(nfs *cephv1.CephNFS, name string) { - logger.Infof("removing ganesha %q from grace db", name) + nsName := controller.NsName(nfs.Namespace, nfs.Name) + log.NamedInfo(nsName, logger, "removing ganesha %q from grace db", name) if err := r.runGaneshaRadosGrace(nfs, name, "remove"); err != nil { - logger.Errorf("failed to remove %q from grace db. %v", name, err) + log.NamedError(nsName, logger, "failed to remove %q from grace db. %v", name, err) } } @@ -216,6 +220,7 @@ func (r *ReconcileCephNFS) generateConfigMap(n *cephv1.CephNFS, name string) *v1 func (r *ReconcileCephNFS) createConfigMap(n *cephv1.CephNFS, name string) (string, string, error) { // Generate configMap configMap := r.generateConfigMap(n, name) + nsName := controller.NsName(n.Namespace, n.Name) // Set owner reference err := controllerutil.SetControllerReference(n, configMap, r.scheme) @@ -228,7 +233,7 @@ func (r *ReconcileCephNFS) createConfigMap(n *cephv1.CephNFS, name string) (stri return "", "", errors.Wrap(err, "failed to create ganesha config map") } - logger.Debugf("updating config map %q that already exists", configMap.Name) + log.NamedDebug(nsName, logger, "updating config map %q that already exists", configMap.Name) if _, err = r.context.Clientset.CoreV1().ConfigMaps(n.Namespace).Update(r.opManagerContext, configMap, metav1.UpdateOptions{}); err != nil { return "", "", errors.Wrap(err, "failed to update ganesha config map") } @@ -319,7 +324,8 @@ func validateGanesha(context *clusterd.Context, clusterInfo *cephclient.ClusterI // create and enable default RADOS pool func (r *ReconcileCephNFS) configureNFSPool(n *cephv1.CephNFS) error { poolName := n.Spec.RADOS.Pool - logger.Infof("configuring pool %q for nfs", poolName) + nsName := controller.NsName(n.Namespace, n.Name) + log.NamedInfo(nsName, logger, "configuring pool %q for nfs", poolName) args := []string{"osd", "pool", "create", poolName, "--yes-i-really-mean-it"} @@ -334,6 +340,6 @@ func (r *ReconcileCephNFS) configureNFSPool(n *cephv1.CephNFS) error { return errors.Wrapf(err, "failed to enable application 'nfs' on pool %q", poolName) } - logger.Infof("set pool %q for the application nfs", poolName) + log.NamedInfo(nsName, logger, "set pool %q for the application nfs", poolName) return nil } diff --git a/pkg/operator/ceph/nfs/security.go b/pkg/operator/ceph/nfs/security.go index 96a1e3dc2..97138b4ae 100644 --- a/pkg/operator/ceph/nfs/security.go +++ b/pkg/operator/ceph/nfs/security.go @@ -20,12 +20,13 @@ import ( "fmt" cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1" + "github.com/rook/rook/pkg/operator/ceph/controller" + "github.com/rook/rook/pkg/util/log" v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/types" ) func (r *ReconcileCephNFS) addSecurityConfigsToPod(nfs *cephv1.CephNFS, pod *v1.PodSpec) error { - nsName := types.NamespacedName{Namespace: nfs.Namespace, Name: nfs.Name} + nsName := controller.NsName(nfs.Namespace, nfs.Name) sec := nfs.Spec.Security if sec == nil { @@ -33,12 +34,12 @@ func (r *ReconcileCephNFS) addSecurityConfigsToPod(nfs *cephv1.CephNFS, pod *v1. } if sec.SSSD != nil { - logger.Debugf("configuring system security services daemon (SSSD) for CephNFS %q", nsName) + log.NamedDebug(nsName, logger, "configuring system security services daemon (SSSD) for CephNFS") addSSSDConfigsToPod(r, nfs, pod) } if sec.Kerberos != nil { - logger.Debugf("configuring Kerberos for CephNFS %q", nsName) + log.NamedDebug(nsName, logger, "configuring Kerberos for CephNFS") addKerberosConfigsToPod(r, nfs, pod) } @@ -46,7 +47,7 @@ func (r *ReconcileCephNFS) addSecurityConfigsToPod(nfs *cephv1.CephNFS, pod *v1. } func addSSSDConfigsToPod(r *ReconcileCephNFS, nfs *cephv1.CephNFS, pod *v1.PodSpec) { - nsName := types.NamespacedName{Namespace: nfs.Namespace, Name: nfs.Name} + nsName := controller.NsName(nfs.Namespace, nfs.Name) // generate /etc/nsswitch.conf file for the nfs-ganesha pod nssCfgInitContainer, nssCfgVol, nssCfgMount := generateSssdNsswitchConfResources(r, nfs) @@ -58,7 +59,7 @@ func addSSSDConfigsToPod(r *ReconcileCephNFS, nfs *cephv1.CephNFS, pod *v1.PodSp sidecarCfg := nfs.Spec.Security.SSSD.Sidecar if sidecarCfg != nil { - logger.Debugf("configuring SSSD sidecar for CephNFS %q", nsName) + log.NamedDebug(nsName, logger, "configuring SSSD sidecar for CephNFS") init, sidecar, vols, mounts := generateSssdSidecarResources(nfs, sidecarCfg) pod.InitContainers = append(pod.InitContainers, *init) diff --git a/pkg/operator/ceph/nfs/spec.go b/pkg/operator/ceph/nfs/spec.go index b761e9eea..d99277a06 100644 --- a/pkg/operator/ceph/nfs/spec.go +++ b/pkg/operator/ceph/nfs/spec.go @@ -27,6 +27,7 @@ import ( "github.com/rook/rook/pkg/operator/ceph/controller" "github.com/rook/rook/pkg/operator/ceph/version" "github.com/rook/rook/pkg/operator/k8sutil" + "github.com/rook/rook/pkg/util/log" apps "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" kerrors "k8s.io/apimachinery/pkg/api/errors" @@ -82,6 +83,7 @@ func (r *ReconcileCephNFS) generateCephNFSService(nfs *cephv1.CephNFS, cfg daemo func (r *ReconcileCephNFS) createCephNFSService(nfs *cephv1.CephNFS, cfg daemonConfig) error { s := r.generateCephNFSService(nfs, cfg) + nsName := controller.NsName(nfs.Namespace, nfs.Name) // Set owner ref to the parent object err := controllerutil.SetControllerReference(nfs, s, r.scheme) @@ -94,11 +96,11 @@ func (r *ReconcileCephNFS) createCephNFSService(nfs *cephv1.CephNFS, cfg daemonC if !kerrors.IsAlreadyExists(err) { return errors.Wrap(err, "failed to create ganesha service") } - logger.Infof("ceph nfs service already created") + log.NamedInfo(nsName, logger, "ceph nfs service already created") return nil } - logger.Infof("ceph nfs service running at %s:%d", svc.Spec.ClusterIP, nfsPort) + log.NamedInfo(nsName, logger, "ceph nfs service running at %s:%d", svc.Spec.ClusterIP, nfsPort) return nil } diff --git a/pkg/operator/ceph/object/admin.go b/pkg/operator/ceph/object/admin.go index 4b3b3f7e6..e180e7e86 100644 --- a/pkg/operator/ceph/object/admin.go +++ b/pkg/operator/ceph/object/admin.go @@ -33,7 +33,9 @@ import ( cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1" "github.com/rook/rook/pkg/clusterd" cephclient "github.com/rook/rook/pkg/daemon/ceph/client" + "github.com/rook/rook/pkg/operator/ceph/controller" "github.com/rook/rook/pkg/util/exec" + "github.com/rook/rook/pkg/util/log" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" ) @@ -50,12 +52,16 @@ type Context struct { Zone string } -func (c *Context) nsName() string { - if c.clusterInfo == nil { - logger.Infof("unable to get namespaced name for rgw %s", c.Name) - return c.Name +func (c *Context) NsName() types.NamespacedName { + if c == nil || c.clusterInfo == nil { + name := "" + if c != nil { + name = c.Name + } + logger.Infof("unable to get namespaced name for rgw %s", name) + return types.NamespacedName{Name: name} } - return fmt.Sprintf("%s/%s", c.clusterInfo.Namespace, c.Name) + return types.NamespacedName{Namespace: c.clusterInfo.Namespace, Name: c.Name} } // AdminOpsContext holds the object store context as well as information for connecting to the admin @@ -119,7 +125,7 @@ func NewContext(context *clusterd.Context, clusterInfo *cephclient.ClusterInfo, } func NewMultisiteContext(context *clusterd.Context, clusterInfo *cephclient.ClusterInfo, store *cephv1.CephObjectStore) (*Context, error) { - nsName := fmt.Sprintf("%s/%s", store.Namespace, store.Name) + nsName := controller.NsName(store.Namespace, store.Name) objContext := NewContext(context, clusterInfo, store.Name) objContext.UID = string(store.UID) @@ -141,7 +147,7 @@ func NewMultisiteContext(context *clusterd.Context, clusterInfo *cephclient.Clus // GetAdminOpsEndpoint returns an endpoint that can be used to perform RGW admin ops func GetAdminOpsEndpoint(s *cephv1.CephObjectStore) (string, error) { - nsName := fmt.Sprintf("%s/%s", s.Namespace, s.Name) + nsName := controller.NsName(s.Namespace, s.Name) // advertise endpoint should be most likely to have a valid cert, so use it for admin ops endpoint, err := s.GetAdvertiseEndpointUrl() @@ -233,6 +239,7 @@ func RunAdminCommandNoMultisite(c *Context, expectJSON bool, args ...string) (st func RunAdminCommandNoMultisiteWithTimeout(c *Context, expectJSON bool, timeout time.Duration, args ...string) (string, error) { var output, stderr string var err error + nsName := controller.NsName(c.clusterInfo.Namespace, c.Name) // If Multus is enabled we proxy all the command to the mgr sidecar if c.clusterInfo.NetworkSpec.IsMultus() { @@ -257,7 +264,7 @@ func RunAdminCommandNoMultisiteWithTimeout(c *Context, expectJSON bool, timeout // cleanup copied file in remote container _, stdErr, cleanupErr := c.Context.RemoteExecutor.ExecCommandInContainerWithFullOutput(c.clusterInfo.Context, cephclient.ProxyAppLabel, cephclient.CommandProxyInitContainerName, c.clusterInfo.Namespace, []string{"rm", dstFile}...) if cleanupErr != nil { - logger.Errorf("failed to cleanup remote file %q: %s - %s", dstFile, cleanupErr, stdErr) + log.NamedError(nsName, logger, "failed to cleanup remote file %q: %s - %s", dstFile, cleanupErr, stdErr) } }() } @@ -307,7 +314,7 @@ func runAdminCommandWithTimeout(c *Context, expectJSON bool, timeout time.Durati // installed in Rook operator and RGW version in Ceph cluster (#7573) result, err := RunAdminCommandNoMultisiteWithTimeout(c, expectJSON, timeout, args...) if err != nil && isFifoFileIOError(err) { - logger.Debugf("retrying 'radosgw-admin' command with OMAP backend to work around FIFO file I/O issue. %v", result) + log.NamedDebug(c.NsName(), logger, "retrying 'radosgw-admin' command with OMAP backend to work around FIFO file I/O issue. %v", result) // We can either run 'ceph --version' to determine the Ceph version running in the operator // and then pick a flag to use, or we can just try to use both flags and return the one that @@ -366,14 +373,14 @@ func CommitConfigChanges(c *Context) error { } // DO NOT MODIFY nsName here. It is part of the integration test checks noted below. - nsName := fmt.Sprintf("%s/%s", c.clusterInfo.Namespace, c.Name) + nsName := controller.NsName(c.clusterInfo.Namespace, c.Name) if !shouldCommit { // DO NOT MODIFY THE MESSAGE BELOW. It is checked in integration tests. - logger.Infof("there are no changes to commit for RGW configuration period for CephObjectStore %q", nsName) + log.NamedInfo(nsName, logger, "there are no changes to commit for RGW configuration period for CephObjectStore %q", nsName) return nil } // DO NOT MODIFY THE MESSAGE BELOW. It is checked in integration tests. - logger.Infof("committing changes to RGW configuration period for CephObjectStore %q", nsName) + log.NamedInfo(nsName, logger, "committing changes to RGW configuration period for CephObjectStore %q", nsName) // don't expect json output since we don't intend to use the output from the command _, err = runAdminCommand(c, false, "period", "update", "--commit") if err != nil { @@ -504,7 +511,7 @@ func GetAdminOPSUserCredentials(objContext *Context, spec *cephv1.ObjectStoreSpe DisplayName: &rgwAdminOpsUserDisplayName, AdminOpsUser: true, } - logger.Debugf("creating s3 user object %q for object store %q", userConfig.UserID, objContext.Name) + log.NamedDebug(objContext.NsName(), logger, "creating s3 user object %q for object store %q", userConfig.UserID, objContext.Name) forceUserCreation := false // If the cluster where we are running the rgw user create for the admin ops user is configured diff --git a/pkg/operator/ceph/object/bucket/controller.go b/pkg/operator/ceph/object/bucket/controller.go index 1daaadbb3..23e8668e8 100644 --- a/pkg/operator/ceph/object/bucket/controller.go +++ b/pkg/operator/ceph/object/bucket/controller.go @@ -21,6 +21,7 @@ import ( "os" cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1" + "github.com/rook/rook/pkg/util/log" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/handler" @@ -77,7 +78,7 @@ func add(ctx context.Context, mgr manager.Manager, r reconcile.Reconciler) error if err != nil { return err } - logger.Infof("%s successfully started", controllerName) + logger.Info("successfully started") // Watch for ConfigMap (operator config) err = c.Watch( @@ -116,7 +117,7 @@ func (r *ReconcileBucket) Reconcile(context context.Context, request reconcile.R // workaround because the rook logging mechanism is not compatible with the controller-runtime logging interface reconcileResponse, err := r.reconcile(request) if err != nil { - logger.Errorf("failed to reconcile %v", err) + log.NamedError(request.NamespacedName, logger, "failed to reconcile %v", err) } return reconcileResponse, err @@ -128,7 +129,7 @@ func (r *ReconcileBucket) reconcile(request reconcile.Request) (reconcile.Result err := r.client.Get(r.opManagerContext, request.NamespacedName, cephCluster) if err != nil { if kerrors.IsNotFound(err) { - logger.Infof("no ceph cluster found in %+v. not deploying the bucket provisioner", request.NamespacedName) + log.NamedInfo(request.NamespacedName, logger, "no ceph cluster found. not deploying the bucket provisioner") return reconcile.Result{}, nil } // Error reading the object - requeue the request. @@ -136,12 +137,12 @@ func (r *ReconcileBucket) reconcile(request reconcile.Request) (reconcile.Result } if !cephCluster.DeletionTimestamp.IsZero() { - logger.Debug("ceph cluster is being deleted, no need to reconcile the bucket provisioner") + log.NamedDebug(request.NamespacedName, logger, "ceph cluster is being deleted, no need to reconcile the bucket provisioner") return reconcile.Result{}, nil } if !cephCluster.Spec.External.Enable && cephCluster.Spec.CleanupPolicy.HasDataDirCleanPolicy() { - logger.Debug("ceph cluster has cleanup policy, the cluster will soon go away, no need to reconcile the bucket provisioner") + log.NamedDebug(request.NamespacedName, logger, "ceph cluster has cleanup policy, the cluster will soon go away, no need to reconcile the bucket provisioner") return reconcile.Result{}, nil } @@ -171,7 +172,7 @@ func (r *ReconcileBucket) reconcile(request reconcile.Request) (reconcile.Result go func() { err = bucketController.RunWithContext(r.opManagerContext) if err != nil { - logger.Errorf("failed to run bucket controller. %v", err) + log.NamedError(request.NamespacedName, logger, "failed to run bucket controller. %v", err) errChan <- err } }() @@ -181,7 +182,7 @@ func (r *ReconcileBucket) reconcile(request reconcile.Request) (reconcile.Result case <-errChan: return opcontroller.ImmediateRetryResult, errors.Wrap(err, "failed to run bucket controller") default: - logger.Info("successfully reconciled bucket provisioner") + log.NamedInfo(request.NamespacedName, logger, "successfully reconciled bucket provisioner") return reconcile.Result{}, nil } } diff --git a/pkg/operator/ceph/object/bucket/provisioner.go b/pkg/operator/ceph/object/bucket/provisioner.go index 2af38c05c..7ac81e1a3 100644 --- a/pkg/operator/ceph/object/bucket/provisioner.go +++ b/pkg/operator/ceph/object/bucket/provisioner.go @@ -31,6 +31,7 @@ import ( apibkt "github.com/kube-object-storage/lib-bucket-provisioner/pkg/provisioner/api" opcontroller "github.com/rook/rook/pkg/operator/ceph/controller" "github.com/rook/rook/pkg/operator/ceph/object" + "github.com/rook/rook/pkg/util/log" storagev1 "k8s.io/api/storage/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -89,7 +90,8 @@ func (p Provisioner) GenerateUserID(obc *bktv1alpha1.ObjectBucketClaim, ob *bktv // Provision creates an s3 bucket and returns a connection info // representing the bucket's endpoint and user access credentials. func (p Provisioner) Provision(options *apibkt.BucketOptions) (*bktv1alpha1.ObjectBucket, error) { - logger.Debugf("Provision event for OB options: %+v", options) + nsName := p.objectContext.NsName() + log.NamedDebug(nsName, logger, "Provision event for OB options: %+v", options) additionalConfig, err := additionalConfigSpecFromMap(options.ObjectBucketClaim.Spec.AdditionalConfig) if err != nil { @@ -102,7 +104,7 @@ func (p Provisioner) Provision(options *apibkt.BucketOptions) (*bktv1alpha1.Obje if err != nil { return nil, err } - logger.Infof("Provision: creating bucket %q for OBC %q", p.bucketName, options.ObjectBucketClaim.Name) + log.NamedInfo(nsName, logger, "Provision: creating bucket %q for OBC %q", p.bucketName, options.ObjectBucketClaim.Name) p.accessKeyID, p.secretAccessKey, err = bucket.getUserCreds() if err != nil { @@ -124,20 +126,20 @@ func (p Provisioner) Provision(options *apibkt.BucketOptions) (*bktv1alpha1.Obje if !bucketExists { // if bucket already exists, this returns error: TooManyBuckets because we set the quota // below. If it already exists, assume we are good to go - logger.Debugf("creating bucket %q owned by user %q", p.bucketName, p.cephUserName) + log.NamedDebug(nsName, logger, "creating bucket %q owned by user %q", p.bucketName, p.cephUserName) err = p.s3Agent.CreateBucket(p.bucketName) if err != nil { return nil, errors.Wrapf(err, "error creating bucket %q", p.bucketName) } } else if owner != p.cephUserName { - logger.Debugf("bucket %q already exists and is owned by user %q instead of user %q, relinking...", p.bucketName, owner, p.cephUserName) + log.NamedDebug(nsName, logger, "bucket %q already exists and is owned by user %q instead of user %q, relinking...", p.bucketName, owner, p.cephUserName) err = p.adminOpsClient.LinkBucket(p.clusterInfo.Context, admin.BucketLinkInput{Bucket: p.bucketName, UID: p.cephUserName}) if err != nil { return nil, errors.Wrapf(err, "failed to link bucket %q to user %q", p.bucketName, p.cephUserName) } } else { - logger.Debugf("bucket %q already exists", p.bucketName) + log.NamedDebug(nsName, logger, "bucket %q already exists", p.bucketName) } // is the bucket owner a provisioner generated user? @@ -148,7 +150,7 @@ func (p Provisioner) Provision(options *apibkt.BucketOptions) (*bktv1alpha1.Obje if err != nil { return nil, errors.Wrapf(err, "failed to set user %q bucket quota to %d", p.cephUserName, singleBucketQuota) } - logger.Infof("set user %q bucket max to %d", p.cephUserName, singleBucketQuota) + log.NamedInfo(nsName, logger, "set user %q bucket max to %d", p.cephUserName, singleBucketQuota) } err = p.setAdditionalSettings(bucket) @@ -162,7 +164,8 @@ func (p Provisioner) Provision(options *apibkt.BucketOptions) (*bktv1alpha1.Obje // Grant attaches to an existing rgw bucket and returns a connection info // representing the bucket's endpoint and user access credentials. func (p Provisioner) Grant(options *apibkt.BucketOptions) (*bktv1alpha1.ObjectBucket, error) { - logger.Debugf("Grant event for OB options: %+v", options) + nsName := p.objectContext.NsName() + log.NamedDebug(nsName, logger, "Grant event for OB options: %+v", options) additionalConfig, err := additionalConfigSpecFromMap(options.ObjectBucketClaim.Spec.AdditionalConfig) if err != nil { @@ -176,10 +179,10 @@ func (p Provisioner) Grant(options *apibkt.BucketOptions) (*bktv1alpha1.ObjectBu if err != nil { return nil, err } - logger.Infof("Grant: allowing access to bucket %q for OBC %q", p.bucketName, options.ObjectBucketClaim.Name) + log.NamedInfo(nsName, logger, "Grant: allowing access to bucket %q for OBC %q", p.bucketName, options.ObjectBucketClaim.Name) // check and make sure the bucket exists - logger.Infof("Checking for existing bucket %q", p.bucketName) + log.NamedInfo(nsName, logger, "Checking for existing bucket %q", p.bucketName) if exists, _, err := p.bucketExists(p.bucketName); !exists { return nil, errors.Wrapf(err, "bucket %s does not exist", p.bucketName) } @@ -241,7 +244,7 @@ func (p Provisioner) Grant(options *apibkt.BucketOptions) (*bktv1alpha1.ObjectBu } out, err := p.s3Agent.PutBucketPolicy(p.bucketName, *policy) - logger.Infof("PutBucketPolicy output: %v", out) + log.NamedInfo(nsName, logger, "PutBucketPolicy output: %v", out) if err != nil { return nil, err } @@ -254,19 +257,20 @@ func (p Provisioner) Grant(options *apibkt.BucketOptions) (*bktv1alpha1.ObjectBu // storage class' reclaimPolicy is "Delete". Or, if a Provision() error occurs and // the bucket controller needs to clean up before retrying. func (p Provisioner) Delete(ob *bktv1alpha1.ObjectBucket) error { - logger.Debugf("Delete event for OB: %+v", ob) + nsName := p.objectContext.NsName() + log.NamedDebug(nsName, logger, "Delete event for OB: %+v", ob) err := p.initializeDeleteOrRevoke(ob) if err != nil { return err } - logger.Infof("Delete: deleting bucket %q for OB %q", p.bucketName, ob.Name) + log.NamedInfo(nsName, logger, "Delete: deleting bucket %q for OB %q", p.bucketName, ob.Name) if err := p.deleteBucket(p.bucketName); err != nil { return errors.Wrapf(err, "failed to delete bucket %q", p.bucketName) } - logger.Infof("Delete: deleting user %q for OB %q", p.bucketName, ob.Name) + log.NamedInfo(nsName, logger, "Delete: deleting user %q for OB %q", p.bucketName, ob.Name) if err := p.deleteOBUser(ob); err != nil { return errors.Wrapf(err, "failed to delete user %q", p.cephUserName) } @@ -276,17 +280,18 @@ func (p Provisioner) Delete(ob *bktv1alpha1.ObjectBucket) error { // Revoke removes a user and creds from an existing bucket. // Note: cleanup order below matters. func (p Provisioner) Revoke(ob *bktv1alpha1.ObjectBucket) error { - logger.Debugf("Revoke event for OB: %+v", ob) + nsName := p.objectContext.NsName() + log.NamedDebug(nsName, logger, "Revoke event for OB: %+v", ob) err := p.initializeDeleteOrRevoke(ob) if err != nil { return err } - logger.Infof("Revoke: denying access to bucket %q for OB %q", p.bucketName, ob.Name) + log.NamedInfo(nsName, logger, "Revoke: denying access to bucket %q for OB %q", p.bucketName, ob.Name) bucket, err := p.adminOpsClient.GetBucketInfo(p.clusterInfo.Context, admin.Bucket{Bucket: p.bucketName}) if err != nil { - logger.Errorf("%v", err) + log.NamedError(nsName, logger, "%v", err) } else { if bucket.Owner == "" { return errors.Errorf("failed to find bucket %q owner", p.bucketName) @@ -317,10 +322,10 @@ func (p Provisioner) Revoke(ob *bktv1alpha1.ObjectBucket) error { if err != nil { if aerr, ok := err.(awserr.Error); ok && aerr.Code() == "NoSuchBucketPolicy" { policy = nil - logger.Errorf("no bucket policy for bucket %q, so no need to drop policy", p.bucketName) + log.NamedError(nsName, logger, "no bucket policy for bucket %q, so no need to drop policy", p.bucketName) } else { - logger.Errorf("error getting policy for bucket %q. %v", p.bucketName, err) + log.NamedError(nsName, logger, "error getting policy for bucket %q. %v", p.bucketName, err) return err } } @@ -339,7 +344,7 @@ func (p Provisioner) Revoke(ob *bktv1alpha1.ObjectBucket) error { policy = policy.ModifyBucketPolicy(*statement) } out, err := p.s3Agent.PutBucketPolicy(p.bucketName, *policy) - logger.Infof("PutBucketPolicy output: %v", out) + log.NamedInfo(nsName, logger, "PutBucketPolicy output: %v", out) if err != nil { return errors.Wrap(err, "failed to update policy") } else { @@ -354,7 +359,7 @@ func (p Provisioner) Revoke(ob *bktv1alpha1.ObjectBucket) error { if err != nil { return err } - logger.Infof("principal %q ejected from bucket %q policy", p.cephUserName, p.bucketName) + log.NamedInfo(nsName, logger, "principal %q ejected from bucket %q policy", p.cephUserName, p.bucketName) } } @@ -371,14 +376,15 @@ func (p Provisioner) Revoke(ob *bktv1alpha1.ObjectBucket) error { // initializeCreateOrGrant sets common provisioner receiver fields and // the services and sessions needed to provision. func (p *Provisioner) initializeCreateOrGrant(bucket *bucket) error { - logger.Info("initializing and setting CreateOrGrant services") + nsName := p.objectContext.NsName() + log.NamedInfo(nsName, logger, "initializing and setting CreateOrGrant services") // set the bucket name obc := bucket.options.ObjectBucketClaim scName := bucket.options.ObjectBucketClaim.Spec.StorageClassName sc, err := p.context.Clientset.StorageV1().StorageClasses().Get(p.clusterInfo.Context, scName, metav1.GetOptions{}) if err != nil { - logger.Errorf("failed to get storage class for OBC %q in namespace %q. %v", obc.Name, obc.Namespace, err) + log.NamedError(nsName, logger, "failed to get storage class for OBC %q in namespace %q. %v", obc.Name, obc.Namespace, err) return err } @@ -430,7 +436,7 @@ func (p *Provisioner) initializeCreateOrGrant(bucket *bucket) error { } else { p.cephUserName = bucket.options.UserID } - logger.Debugf("Using user %q for OBC %q", p.cephUserName, obc.Name) + log.NamedDebug(nsName, logger, "Using user %q for OBC %q", p.cephUserName, obc.Name) return nil } @@ -634,11 +640,12 @@ func (p *Provisioner) setAdditionalSettings(bucket *bucket) error { } func (p *Provisioner) setUserQuota(bucket *bucket) error { + nsName := p.objectContext.NsName() additionalConfig := bucket.additionalConfig if additionalConfig.bucketOwner != nil { // when an explicit bucket owner is set, we do not manage user quotas - logger.Debugf("Skipping user level quotas for OBC %q as bucketOwner is set", bucket.options.ObjectBucketClaim.Name) + log.NamedDebug(nsName, logger, "Skipping user level quotas for OBC %q as bucketOwner is set", bucket.options.ObjectBucketClaim.Name) return nil } @@ -680,7 +687,7 @@ func (p *Provisioner) setUserQuota(bucket *bucket) error { diff := cmp.Diff(currentQuota, targetQuota) if diff != "" { - logger.Debugf("Quota for user %q has changed. diff:%s", p.cephUserName, diff) + log.NamedDebug(nsName, logger, "Quota for user %q has changed. diff:%s", p.cephUserName, diff) // UID is not set in the QuotaSpec returned by GetUser()/GetUserQuota() targetQuota.UID = p.cephUserName err = p.adminOpsClient.SetUserQuota(p.clusterInfo.Context, targetQuota) @@ -694,6 +701,7 @@ func (p *Provisioner) setUserQuota(bucket *bucket) error { func (p *Provisioner) setBucketQuota(bucket *bucket) error { additionalConfig := bucket.additionalConfig + nsName := p.objectContext.NsName() bkt, err := p.adminOpsClient.GetBucketInfo(p.clusterInfo.Context, admin.Bucket{Bucket: p.bucketName}) if err != nil { @@ -734,7 +742,7 @@ func (p *Provisioner) setBucketQuota(bucket *bucket) error { diff := cmp.Diff(currentQuota, targetQuota) if diff != "" { - logger.Debugf("Quota for bucket %q has changed. diff:%s", p.bucketName, diff) + log.NamedDebug(nsName, logger, "Quota for bucket %q has changed. diff:%s", p.bucketName, diff) // UID & Bucket are not set in the QuotaSpec returned by GetBucketInfo() targetQuota.UID = p.cephUserName targetQuota.Bucket = p.bucketName @@ -748,6 +756,7 @@ func (p *Provisioner) setBucketQuota(bucket *bucket) error { } func (p *Provisioner) setBucketPolicy(bucket *bucket) error { + nsName := p.objectContext.NsName() additionalConfig := bucket.additionalConfig svc := p.s3Agent.Client @@ -773,7 +782,7 @@ func (p *Provisioner) setBucketPolicy(bucket *bucket) error { return nil } - logger.Debugf("Policy for bucket %q has changed. diff:%s", p.bucketName, diff) + log.NamedDebug(nsName, logger, "Policy for bucket %q has changed. diff:%s", p.bucketName, diff) if additionalConfig.bucketPolicy == nil { // if policy is out of sync and the new policy is nil, we should delete the live policy _, err = svc.DeleteBucketPolicy(&s3.DeleteBucketPolicyInput{ @@ -797,6 +806,7 @@ func (p *Provisioner) setBucketPolicy(bucket *bucket) error { } func (p *Provisioner) setBucketLifecycle(bucket *bucket) error { + nsName := p.objectContext.NsName() additionalConfig := bucket.additionalConfig svc := p.s3Agent.Client @@ -809,7 +819,7 @@ func (p *Provisioner) setBucketLifecycle(bucket *bucket) error { // when no lifecycle configuration is set, an err with a "code" of // NoSuchLifecycleConfiguration is returned if aerr, ok := err.(awserr.Error); ok && aerr.Code() == "NoSuchLifecycleConfiguration" { - logger.Debugf("no lifecycle configuration set for bucket %q", p.bucketName) + log.NamedDebug(nsName, logger, "no lifecycle configuration set for bucket %q", p.bucketName) } else { return errors.Wrapf(err, "failed to fetch lifecycle configuration for bucket %q", p.bucketName) } @@ -846,7 +856,7 @@ func (p *Provisioner) setBucketLifecycle(bucket *bucket) error { return nil } - logger.Debugf("Lifecycle configuration for bucket %q has changed. diff:%s", p.bucketName, diff) + log.NamedDebug(nsName, logger, "Lifecycle configuration for bucket %q has changed. diff:%s", p.bucketName, diff) if additionalConfig.bucketLifecycle == nil { // if policy is out of sync and the new policy is nil, delete the live policy _, err = svc.DeleteBucketLifecycle(&s3.DeleteBucketLifecycleInput{ diff --git a/pkg/operator/ceph/object/bucket/provisioner_test.go b/pkg/operator/ceph/object/bucket/provisioner_test.go index fa5388620..1a8d7d3af 100644 --- a/pkg/operator/ceph/object/bucket/provisioner_test.go +++ b/pkg/operator/ceph/object/bucket/provisioner_test.go @@ -187,12 +187,14 @@ func TestProvisioner_setUserQuota(t *testing.T) { adminClient, err := admin.New("rgw.test", "accesskey", "secretkey", mockClient) assert.NoError(t, err) + clusterInfo := &client.ClusterInfo{ + Context: context.Background(), + } p := &Provisioner{ - clusterInfo: &client.ClusterInfo{ - Context: context.Background(), - }, + clusterInfo: clusterInfo, cephUserName: "bob", adminOpsClient: adminClient, + objectContext: object.NewContext(&clusterd.Context{}, clusterInfo, "store"), } return p @@ -379,12 +381,14 @@ func TestProvisioner_setBucketQuota(t *testing.T) { adminClient, err := admin.New("rgw.test", "accesskey", "secretkey", mockClient) assert.NoError(t, err) + clusterInfo := &client.ClusterInfo{ + Context: context.Background(), + } p := &Provisioner{ - clusterInfo: &client.ClusterInfo{ - Context: context.Background(), - }, + clusterInfo: clusterInfo, cephUserName: "bob", adminOpsClient: adminClient, + objectContext: object.NewContext(&clusterd.Context{}, clusterInfo, "store"), } return p diff --git a/pkg/operator/ceph/object/bucket/rgw-handlers.go b/pkg/operator/ceph/object/bucket/rgw-handlers.go index 62fd9d2db..0e566f4f6 100644 --- a/pkg/operator/ceph/object/bucket/rgw-handlers.go +++ b/pkg/operator/ceph/object/bucket/rgw-handlers.go @@ -8,6 +8,7 @@ import ( bktv1alpha1 "github.com/kube-object-storage/lib-bucket-provisioner/pkg/apis/objectbucket.io/v1alpha1" apibkt "github.com/kube-object-storage/lib-bucket-provisioner/pkg/provisioner/api" "github.com/pkg/errors" + "github.com/rook/rook/pkg/util/log" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -66,8 +67,8 @@ func (p *Provisioner) createCephUser(username string) (accKey string, secKey str if len(username) == 0 { return "", "", errors.Wrap(err, "no user name provided") } - - logger.Infof("creating Ceph object user %q", username) + nsName := p.objectContext.NsName() + log.NamedInfo(nsName, logger, "creating Ceph object user %q", username) userConfig := admin.User{ ID: username, @@ -86,10 +87,10 @@ func (p *Provisioner) createCephUser(username string) (accKey string, secKey str return "", "", errors.Wrapf(err, "failed to get Ceph object user %q", username) } } else { - logger.Infof("Ceph object user %q already exists", username) + log.NamedInfo(nsName, logger, "Ceph object user %q already exists", username) } - logger.Infof("successfully created Ceph object user %q with access keys", username) + log.NamedInfo(nsName, logger, "successfully created Ceph object user %q with access keys", username) return u.Keys[0].AccessKey, u.Keys[0].SecretKey, nil } @@ -108,22 +109,23 @@ func (p *Provisioner) genUserName(obc *bktv1alpha1.ObjectBucketClaim) string { // already revoked and hence user is no longer able to access the bucket // Empty string is passed for bucketName only if user needs to be removed, ex Revoke() func (p *Provisioner) deleteBucket(bucketName string) error { - logger.Infof("deleting Ceph bucket %q", bucketName) + nsName := p.objectContext.NsName() + log.NamedInfo(nsName, logger, "deleting Ceph bucket %q", bucketName) // delete bucket with purge option to remove all objects thePurge := true err := p.adminOpsClient.RemoveBucket(p.clusterInfo.Context, admin.Bucket{Bucket: bucketName, PurgeObject: &thePurge}) if err == nil { - logger.Infof("bucket %q successfully deleted", bucketName) + log.NamedInfo(nsName, logger, "bucket %q successfully deleted", bucketName) } else if errors.Is(err, admin.ErrNoSuchBucket) { // opinion: "not found" is not an error - logger.Infof("bucket %q does not exist", bucketName) + log.NamedInfo(nsName, logger, "bucket %q does not exist", bucketName) } else if errors.Is(err, admin.ErrNoSuchKey) { // ceph might return NoSuchKey than NoSuchBucket when the target bucket does not exist. // then we can use GetBucketInfo() to judge the existence of the bucket. // see: https://github.com/ceph/ceph/pull/44413 _, err2 := p.adminOpsClient.GetBucketInfo(p.clusterInfo.Context, admin.Bucket{Bucket: bucketName, PurgeObject: &thePurge}) if errors.Is(err2, admin.ErrNoSuchBucket) { - logger.Infof("bucket info %q does not exist", bucketName) + log.NamedInfo(nsName, logger, "bucket info %q does not exist", bucketName) } else { return errors.Wrapf(err, "failed to delete bucket %q (could not get bucket info)", bucketName) } @@ -137,6 +139,8 @@ func (p *Provisioner) deleteBucket(bucketName string) error { // Delete the user *if it was created by OBC*. Will not delete externally // managed users / users not created by obc. func (p *Provisioner) deleteOBUser(ob *bktv1alpha1.ObjectBucket) error { + nsName := p.objectContext.NsName() + // construct a partial obc object with only the fields set needed by // isObcGeneratedUser() & genUserName() obc := &bktv1alpha1.ObjectBucketClaim{ @@ -156,20 +160,20 @@ func (p *Provisioner) deleteOBUser(ob *bktv1alpha1.ObjectBucket) error { // is the bucket owner a provisioner generated user? if p.isObcGeneratedUser(p.cephUserName, obc) { // delete the user - logger.Infof("deleting Ceph user %q", p.cephUserName) + log.NamedInfo(nsName, logger, "deleting Ceph user %q", p.cephUserName) err := p.adminOpsClient.RemoveUser(p.clusterInfo.Context, admin.User{ID: p.cephUserName}) if err != nil { if errors.Is(err, admin.ErrNoSuchUser) { - logger.Warningf("user %q does not exist, nothing to delete. %v", p.cephUserName, err) + log.NamedWarning(nsName, logger, "user %q does not exist, nothing to delete. %v", p.cephUserName, err) } - logger.Warningf("failed to delete user %q. %v", p.cephUserName, err) + log.NamedWarning(nsName, logger, "failed to delete user %q. %v", p.cephUserName, err) } else { - logger.Infof("user %q successfully deleted", p.cephUserName) + log.NamedInfo(nsName, logger, "user %q successfully deleted", p.cephUserName) } } else { // do not remove externally managed users - logger.Infof("Ceph user %q does not look like an obc generated user and will not be removed", p.cephUserName) + log.NamedInfo(nsName, logger, "Ceph user %q does not look like an obc generated user and will not be removed", p.cephUserName) } return nil @@ -177,6 +181,8 @@ func (p *Provisioner) deleteOBUser(ob *bktv1alpha1.ObjectBucket) error { // test a string to determine if is likely to be a user name generated by the provisioner func (p *Provisioner) isObcGeneratedUser(userName string, obc *bktv1alpha1.ObjectBucketClaim) bool { + nsName := p.objectContext.NsName() + // If the user name string is the same as the explicitly set bucketOwner we will // assume it is not a machine generated user name. if obc.Spec.AdditionalConfig != nil && @@ -196,7 +202,7 @@ func (p *Provisioner) isObcGeneratedUser(userName string, obc *bktv1alpha1.Objec matched, err := regexp.MatchString("^ceph-user-[0-9A-Za-z]{8}", userName) if err != nil { - logger.Errorf("regex match failed. %v", err) + log.NamedError(nsName, logger, "regex match failed. %v", err) } return matched } diff --git a/pkg/operator/ceph/object/bucket/util.go b/pkg/operator/ceph/object/bucket/util.go index 7e8df47ea..786da0c0e 100644 --- a/pkg/operator/ceph/object/bucket/util.go +++ b/pkg/operator/ceph/object/bucket/util.go @@ -26,6 +26,7 @@ import ( cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1" opcontroller "github.com/rook/rook/pkg/operator/ceph/controller" cephObject "github.com/rook/rook/pkg/operator/ceph/object" + "github.com/rook/rook/pkg/util/log" storagev1 "k8s.io/api/storage/v1" kerrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/resource" @@ -172,7 +173,7 @@ func GetObjectStoreNameFromBucket(ob *bktv1alpha1.ObjectBucket) (types.Namespace // TODO: remove after Rook v1.12 // Older OBCs don't have the additional state labels, but they will always be configured to use // the legacy CephObjectStore Service which has a deterministic domain structure. - logger.Debugf("falling back to legacy method for determining OBC \"%s/%s\"'s CephObjectStore from endpoint %q", + log.NamedDebug(nsName, logger, "falling back to legacy method for determining OBC \"%s/%s\"'s CephObjectStore from endpoint %q", ob.Namespace, ob.Name, ob.Spec.Connection.Endpoint.BucketHost) nsName, err = cephObject.ParseDomainName(ob.Spec.Connection.Endpoint.BucketHost) if err != nil { diff --git a/pkg/operator/ceph/object/config.go b/pkg/operator/ceph/object/config.go index e7ca6099d..d66aa04ab 100644 --- a/pkg/operator/ceph/object/config.go +++ b/pkg/operator/ceph/object/config.go @@ -26,6 +26,8 @@ import ( "github.com/pkg/errors" cephconfig "github.com/rook/rook/pkg/operator/ceph/config" "github.com/rook/rook/pkg/operator/ceph/config/keyring" + "github.com/rook/rook/pkg/operator/ceph/controller" + "github.com/rook/rook/pkg/util/log" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -95,6 +97,7 @@ func generateCephXUser(name string) string { } func (c *clusterConfig) generateKeyring(rgwConfig *rgwConfig) (string, error) { + nsName := controller.NsName(c.clusterInfo.Namespace, c.store.Name) user := generateCephXUser(rgwConfig.ResourceName) /* TODO: this says `osd allow rwx` while template says `osd allow *`; which is correct? */ access := []string{"osd", "allow rwx", "mon", "allow rw"} @@ -106,7 +109,7 @@ func (c *clusterConfig) generateKeyring(rgwConfig *rgwConfig) (string, error) { } if c.shouldRotateCephxKeys { - logger.Infof("rotating cephx key for CephObjectStore %q", c.store.Name) + log.NamedInfo(nsName, logger, "rotating cephx key for CephObjectStore %q", c.store.Name) newKey, err := s.RotateKey(user) if err != nil { return "", errors.Wrapf(err, "failed to rotate cephx key for CephObjectStore %q", c.store.Name) @@ -179,6 +182,7 @@ func (c *clusterConfig) setFlagsMonConfigStore(rgwConfig *rgwConfig) error { } func (c *clusterConfig) generateMonConfigOptions(rgwConfig *rgwConfig) (map[string]string, error) { + nsName := controller.NsName(c.clusterInfo.Namespace, c.store.Name) configOptions := make(map[string]string) configOptions["rgw_run_sync_thread"] = "true" @@ -192,7 +196,7 @@ func (c *clusterConfig) generateMonConfigOptions(rgwConfig *rgwConfig) (map[stri configOptions["rgw_zone"] = rgwConfig.Zone configOptions["rgw_zonegroup"] = rgwConfig.ZoneGroup - configOptions, err := configureKeystoneAuthentication(rgwConfig, configOptions) + configOptions, err := c.configureKeystoneAuthentication(rgwConfig, configOptions) if err != nil { return configOptions, err } @@ -218,10 +222,8 @@ func (c *clusterConfig) generateMonConfigOptions(rgwConfig *rgwConfig) (map[stri for flag, val := range c.store.Spec.Gateway.RgwConfig { if currVal, ok := configOptions[flag]; ok { // RGW might break with some user-specified config overrides; log clearly to help triage - logger.Infof("overriding object store %q RGW config option %q with user-specified rgwConfig", - fmt.Sprintf("%s/%s", c.store.Namespace, c.store.Name), flag) - logger.Tracef("overriding object store %q RGW config option %q (current value %q) with user-specified rgwConfig %q", - fmt.Sprintf("%s/%s", c.store.Namespace, c.store.Name), flag, currVal, val) + log.NamedInfo(nsName, logger, "overriding RGW config option %q with user-specified rgwConfig", flag) + log.NamedTrace(nsName, logger, "overriding RGW config option %q (current value %q) with user-specified rgwConfig %q", flag, currVal, val) } configOptions[flag] = val } @@ -242,10 +244,8 @@ func (c *clusterConfig) generateMonConfigOptions(rgwConfig *rgwConfig) (map[stri if currVal, ok := configOptions[flag]; ok { // RGW might break with some user-specified config overrides; log clearly to help triage - logger.Infof("overriding object store %q RGW config option %q with user-specified rgwConfigFromSecret", - fmt.Sprintf("%s/%s", c.store.Namespace, c.store.Name), flag) - logger.Tracef("overriding object store %q RGW config option %q (current value %q) with user-specified rgwConfigFromSecret %q", - fmt.Sprintf("%s/%s", c.store.Namespace, c.store.Name), flag, currVal, secretVal) + log.NamedInfo(nsName, logger, "overriding RGW config option %q with user-specified rgwConfigFromSecret", flag) + log.NamedTrace(nsName, logger, "overriding RGW config option %q (current value %q) with user-specified rgwConfigFromSecret %q", flag, currVal, secretVal) } configOptions[flag] = string(secretVal) } @@ -253,14 +253,15 @@ func (c *clusterConfig) generateMonConfigOptions(rgwConfig *rgwConfig) (map[stri return configOptions, nil } -func configureKeystoneAuthentication(rgwConfig *rgwConfig, configOptions map[string]string) (map[string]string, error) { +func (c *clusterConfig) configureKeystoneAuthentication(rgwConfig *rgwConfig, configOptions map[string]string) (map[string]string, error) { + nsName := controller.NsName(c.clusterInfo.Namespace, c.store.Name) keystone := rgwConfig.Auth.Keystone if keystone == nil { - logger.Debug("Authentication with keystone is disabled") + log.NamedDebug(nsName, logger, "Authentication with keystone is disabled") return configOptions, nil } - logger.Info("Configuring authentication with keystone") + log.NamedInfo(nsName, logger, "Configuring authentication with keystone") configOptions["rgw_keystone_url"] = keystone.Url configOptions["rgw_keystone_accepted_roles"] = strings.Join(keystone.AcceptedRoles, ",") @@ -300,6 +301,7 @@ func configureKeystoneAuthentication(rgwConfig *rgwConfig, configOptions map[str } func (c *clusterConfig) deleteFlagsMonConfigStore(rgwName string) error { + nsName := controller.NsName(c.clusterInfo.Namespace, c.store.Name) monStore := cephconfig.GetMonStore(c.context, c.clusterInfo) who := generateCephXUser(rgwName) err := monStore.DeleteDaemon(who) @@ -307,6 +309,6 @@ func (c *clusterConfig) deleteFlagsMonConfigStore(rgwName string) error { return errors.Wrapf(err, "failed to delete rgw config for %q in mon configuration database", who) } - logger.Infof("successfully deleted rgw config for %q in mon configuration database", who) + log.NamedInfo(nsName, logger, "successfully deleted rgw config for %q in mon configuration database", who) return nil } diff --git a/pkg/operator/ceph/object/config_test.go b/pkg/operator/ceph/object/config_test.go index 7036b66ca..de1bc3a38 100644 --- a/pkg/operator/ceph/object/config_test.go +++ b/pkg/operator/ceph/object/config_test.go @@ -176,7 +176,8 @@ func Test_clusterConfig_generateMonConfigOptions(t *testing.T) { } c := &clusterConfig{ - store: cos, + store: cos, + clusterInfo: &cephclient.ClusterInfo{Namespace: "ns"}, } got, err := c.generateMonConfigOptions(rgwConfig) diff --git a/pkg/operator/ceph/object/controller.go b/pkg/operator/ceph/object/controller.go index 89f72423f..79b545264 100644 --- a/pkg/operator/ceph/object/controller.go +++ b/pkg/operator/ceph/object/controller.go @@ -36,6 +36,7 @@ import ( "github.com/rook/rook/pkg/operator/ceph/reporting" "github.com/rook/rook/pkg/operator/k8sutil" "github.com/rook/rook/pkg/util/exec" + "github.com/rook/rook/pkg/util/log" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" kerrors "k8s.io/apimachinery/pkg/api/errors" @@ -281,7 +282,7 @@ func (r *ReconcileCephObjectStore) reconcile(request reconcile.Request) (reconci err := r.client.Get(r.opManagerContext, request.NamespacedName, cephObjectStore) if err != nil { if kerrors.IsNotFound(err) { - logger.Debug("cephObjectStore resource not found. Ignoring since object must be deleted.") + log.NamedDebug(request.NamespacedName, logger, "cephObjectStore resource not found. Ignoring since object must be deleted.") return reconcile.Result{}, *cephObjectStore, nil } // Error reading the object - requeue the request. @@ -298,7 +299,7 @@ func (r *ReconcileCephObjectStore) reconcile(request reconcile.Request) (reconci return reconcile.Result{}, *cephObjectStore, errors.Wrap(err, "failed to add finalizer") } if generationUpdated { - logger.Infof("reconciling the object store %q after adding finalizer", cephObjectStore.Name) + log.NamedInfo(request.NamespacedName, logger, "reconciling the object store after adding finalizer") return reconcile.Result{}, *cephObjectStore, nil } @@ -431,7 +432,7 @@ func (r *ReconcileCephObjectStore) reconcile(request reconcile.Request) (reconci ) if err != nil { if strings.Contains(err.Error(), opcontroller.UninitializedCephConfigError) { - logger.Info(opcontroller.OperatorNotInitializedMessage) + log.NamedInfo(request.NamespacedName, logger, opcontroller.OperatorNotInitializedMessage) return opcontroller.WaitForRequeueIfOperatorNotInitialized, *cephObjectStore, nil } return reconcile.Result{}, *cephObjectStore, errors.Wrap(err, "failed to detect running and desired ceph version") @@ -455,7 +456,7 @@ func (r *ReconcileCephObjectStore) reconcile(request reconcile.Request) (reconci return reconcile.Result{}, *cephObjectStore, errors.Wrap(err, "failed to determine if cephx keys should be rotated") } if shouldRotateCephxKeys { - logger.Infof("cephx keys for CephObjectStore %q will be rotated", request.NamespacedName) + log.NamedInfo(request.NamespacedName, logger, "cephx keys for CephObjectStore %q will be rotated", request.NamespacedName) } } @@ -482,7 +483,7 @@ func (r *ReconcileCephObjectStore) reconcile(request reconcile.Request) (reconci if err != nil && kerrors.IsNotFound(err) { // A not found error may mean ceph is still initializing, but there might be some other error // so we log the error and requeue - logger.Warningf("object store %q reconcile failed, ceph may still be initializing. %v", request.NamespacedName.String(), err) + log.NamedWarning(request.NamespacedName, logger, "object store %q reconcile failed, ceph may still be initializing. %v", request.NamespacedName.String(), err) return opcontroller.WaitForRequeueIfOperatorNotInitialized, *cephObjectStore, nil } else if err != nil { result, err := r.setFailedStatus(k8sutil.ObservedGenerationNotAvailable, request.NamespacedName, "failed to create object store deployments", err) @@ -498,7 +499,7 @@ func (r *ReconcileCephObjectStore) reconcile(request reconcile.Request) (reconci } // Return and do not requeue - logger.Debug("done reconciling") + log.NamedDebug(request.NamespacedName, logger, "done reconciling") return reconcile.Result{}, *cephObjectStore, nil } @@ -509,7 +510,7 @@ func (r *ReconcileCephObjectStore) reconcileCreateObjectStore(cephObjectStore *c } if cephObjectStore.Spec.IsExternal() { - logger.Info("reconciling external object store") + log.NamedInfo(namespacedName, logger, "reconciling external object store") // Before v1.11, Rook created a Service and custom Endpoints that routed to external RGW // endpoints. This causes problems if the external endpoint has TLS certificates that block @@ -537,7 +538,7 @@ func (r *ReconcileCephObjectStore) reconcileCreateObjectStore(cephObjectStore *c // externalRgwEndpoint -- perhaps their RGW node changed IPs. // RECONCILE SERVICE - logger.Info("reconciling legacy external object store service") + log.NamedInfo(namespacedName, logger, "reconciling legacy external object store service") err = cfg.reconcileService(cephObjectStore) if err != nil { return r.setFailedStatus(k8sutil.ObservedGenerationNotAvailable, namespacedName, "failed to reconcile service", err) @@ -545,7 +546,7 @@ func (r *ReconcileCephObjectStore) reconcileCreateObjectStore(cephObjectStore *c // RECONCILE ENDPOINTS // Always add the endpoint AFTER the service otherwise it will get overridden - logger.Info("reconciling legacy external object store endpoint") + log.NamedInfo(namespacedName, logger, "reconciling legacy external object store endpoint") err = cfg.reconcileExternalEndpoint(cephObjectStore) if err != nil { return r.setFailedStatus(k8sutil.ObservedGenerationNotAvailable, namespacedName, "failed to reconcile external endpoint", err) @@ -556,7 +557,7 @@ func (r *ReconcileCephObjectStore) reconcileCreateObjectStore(cephObjectStore *c return r.setFailedStatus(k8sutil.ObservedGenerationNotAvailable, namespacedName, "failed to set endpoint", err) } } else { - logger.Info("reconciling object store deployments") + log.NamedInfo(namespacedName, logger, "reconciling object store deployments") // Reconcile realm/zonegroup/zone CRs & update their names realmName, zoneGroupName, zoneName, zone, reconcileResponse, err := r.getMultisiteResourceNames(cephObjectStore) @@ -575,10 +576,10 @@ func (r *ReconcileCephObjectStore) reconcileCreateObjectStore(cephObjectStore *c objContext.Realm = realmName objContext.ZoneGroup = zoneGroupName objContext.Zone = zoneName - logger.Debugf("realm is %q, zone group is %q, zone is %q, for object store %q", objContext.Realm, objContext.ZoneGroup, objContext.Zone, cephObjectStore.Name) + log.NamedDebug(namespacedName, logger, "realm is %q, zone group is %q, zone is %q", objContext.Realm, objContext.ZoneGroup, objContext.Zone) // RECONCILE SERVICE - logger.Debug("reconciling object store service") + log.NamedDebug(namespacedName, logger, "reconciling object store service") err = cfg.reconcileService(cephObjectStore) if err != nil { return r.setFailedStatus(k8sutil.ObservedGenerationNotAvailable, namespacedName, "failed to reconcile service", err) @@ -594,7 +595,7 @@ func (r *ReconcileCephObjectStore) reconcileCreateObjectStore(cephObjectStore *c } // Reconcile Pool Creation if !cephObjectStore.Spec.IsMultisite() { - logger.Info("reconciling object store pools") + log.NamedInfo(namespacedName, logger, "reconciling object store pools") if IsNeedToCreateObjectStorePools(cephObjectStore.Spec.SharedPools) { err = CreateObjectStorePools(objContext, r.clusterSpec, cephObjectStore.Spec.MetadataPool, cephObjectStore.Spec.DataPool) @@ -605,7 +606,7 @@ func (r *ReconcileCephObjectStore) reconcileCreateObjectStore(cephObjectStore *c } // Reconcile the object store - logger.Infof("configuring object store %q", cephObjectStore.Name) + log.NamedInfo(namespacedName, logger, "configuring object store") err = configureObjectStore(objContext, cephObjectStore, zone) if err != nil && kerrors.IsNotFound(err) { return reconcile.Result{}, err @@ -628,7 +629,7 @@ func (r *ReconcileCephObjectStore) reconcileCreateObjectStore(cephObjectStore *c return reconcile.Result{}, errors.Wrapf(err, "failed to create object store %q", cephObjectStore.Name) } if cephObjectStore.Spec.DefaultRealm { - logger.Debugf("marking realm %q as default for object store %q", realmName, cephObjectStore.Name) + log.NamedDebug(namespacedName, logger, "marking realm %q as default for object store", realmName) if err := SetDefaultRealm(objContext, realmName); err != nil { return reconcile.Result{}, errors.Wrapf(err, "failed to set realm %q as default", realmName) } @@ -639,6 +640,7 @@ func (r *ReconcileCephObjectStore) reconcileCreateObjectStore(cephObjectStore *c } func (r *ReconcileCephObjectStore) retrieveMultisiteZone(store *cephv1.CephObjectStore, zoneGroupName string, realmName string) (reconcile.Result, error) { + nsName := opcontroller.NsName(store.Namespace, store.Name) realmArg := fmt.Sprintf("--rgw-realm=%s", realmName) zoneGroupArg := fmt.Sprintf("--rgw-zonegroup=%s", zoneGroupName) zoneArg := fmt.Sprintf("--rgw-zone=%s", store.Spec.Zone.Name) @@ -654,11 +656,12 @@ func (r *ReconcileCephObjectStore) retrieveMultisiteZone(store *cephv1.CephObjec } } - logger.Infof("Zone %q found in Ceph cluster will include object store %q", store.Spec.Zone.Name, store.Name) + log.NamedInfo(nsName, logger, "Zone %q found in Ceph cluster will include object store %q", store.Spec.Zone.Name, store.Name) return reconcile.Result{}, nil } func (r *ReconcileCephObjectStore) getMultisiteResourceNames(cephObjectStore *cephv1.CephObjectStore) (string, string, string, *cephv1.CephObjectZone, reconcile.Result, error) { + nsName := opcontroller.NsName(cephObjectStore.Namespace, cephObjectStore.Name) if !cephObjectStore.Spec.IsMultisite() { return cephObjectStore.Name, cephObjectStore.Name, cephObjectStore.Name, nil, reconcile.Result{}, nil } @@ -672,7 +675,7 @@ func (r *ReconcileCephObjectStore) getMultisiteResourceNames(cephObjectStore *ce } return "", "", "", nil, waitForRequeueIfObjectStoreNotReady, errors.Wrapf(err, "error getting CephObjectZone %q", cephObjectStore.Spec.Zone.Name) } - logger.Debugf("CephObjectZone resource %s found", zone.Name) + log.NamedDebug(nsName, logger, "CephObjectZone resource %s found", zone.Name) zonegroup := &cephv1.CephObjectZoneGroup{} err = r.client.Get(r.opManagerContext, types.NamespacedName{Name: zone.Spec.ZoneGroup, Namespace: cephObjectStore.Namespace}, zonegroup) @@ -682,7 +685,7 @@ func (r *ReconcileCephObjectStore) getMultisiteResourceNames(cephObjectStore *ce } return "", "", "", nil, waitForRequeueIfObjectStoreNotReady, errors.Wrapf(err, "error getting CephObjectZoneGroup %q", zone.Spec.ZoneGroup) } - logger.Debugf("CephObjectZoneGroup resource %s found", zonegroup.Name) + log.NamedDebug(nsName, logger, "CephObjectZoneGroup resource %s found", zonegroup.Name) realm := &cephv1.CephObjectRealm{} err = r.client.Get(r.opManagerContext, types.NamespacedName{Name: zonegroup.Spec.Realm, Namespace: cephObjectStore.Namespace}, realm) @@ -692,7 +695,7 @@ func (r *ReconcileCephObjectStore) getMultisiteResourceNames(cephObjectStore *ce } return "", "", "", nil, waitForRequeueIfObjectStoreNotReady, errors.Wrapf(err, "error getting CephObjectRealm %q", zonegroup.Spec.Realm) } - logger.Debugf("CephObjectRealm resource %s found", realm.Name) + log.NamedDebug(nsName, logger, "CephObjectRealm resource %s found", realm.Name) return realm.Name, zonegroup.Name, zone.Name, zone, reconcile.Result{}, nil } diff --git a/pkg/operator/ceph/object/cosi/controller.go b/pkg/operator/ceph/object/cosi/controller.go index d2aacec7b..00a9e3178 100644 --- a/pkg/operator/ceph/object/cosi/controller.go +++ b/pkg/operator/ceph/object/cosi/controller.go @@ -30,6 +30,7 @@ import ( opcontroller "github.com/rook/rook/pkg/operator/ceph/controller" "github.com/rook/rook/pkg/operator/ceph/reporting" "github.com/rook/rook/pkg/operator/k8sutil" + "github.com/rook/rook/pkg/util/log" appsv1 "k8s.io/api/apps/v1" kapiv1 "k8s.io/api/core/v1" kerrors "k8s.io/apimachinery/pkg/api/errors" @@ -144,7 +145,7 @@ func (r *ReconcileCephCOSIDriver) reconcile(request reconcile.Request) (reconcil return reconcile.Result{}, *cephCOSIDriver, errors.New("more than one instance of CephCOSIDriver found") } else if len(cephCOSIDriverList.Items) == 1 { cephCOSIDriver = &cephCOSIDriverList.Items[0] - logger.Debugf("CephCOSIDriver: %+v", cephCOSIDriver) + log.NamedDebug(request.NamespacedName, logger, "CephCOSIDriver: %+v", cephCOSIDriver) } // While in experimental mode, the COSI driver is not enabled by default @@ -156,7 +157,7 @@ func (r *ReconcileCephCOSIDriver) reconcile(request reconcile.Request) (reconcil } if cosiDeploymentStrategy == cephv1.COSIDeploymentStrategyNever { - logger.Debug("Ceph COSI Driver is disabled, delete if exists") + log.NamedDebug(request.NamespacedName, logger, "Ceph COSI Driver is disabled, delete if exists") cephCOSIDriverDeployment := &appsv1.Deployment{} err = r.client.Get(r.opManagerContext, request.NamespacedName, cephCOSIDriverDeployment) if kerrors.IsNotFound(err) { @@ -192,7 +193,7 @@ func (r *ReconcileCephCOSIDriver) reconcile(request reconcile.Request) (reconcil } if len(list.Items) == 0 && cosiDeploymentStrategy == cephv1.COSIDeploymentStrategyAuto { - logger.Info("no object stores found, skipping cosi driver config") + log.NamedInfo(request.NamespacedName, logger, "no object stores found, skipping cosi driver config") return waitForRequeueObjectStoreNotPresent, *cephCOSIDriver, nil } @@ -207,26 +208,28 @@ func (r *ReconcileCephCOSIDriver) reconcile(request reconcile.Request) (reconcil // Start the Ceph COSI Driver func (r *ReconcileCephCOSIDriver) startCephCOSIDriver(cephCOSIDriver *cephv1.CephCOSIDriver) error { + nsName := opcontroller.NsName(cephCOSIDriver.Namespace, cephCOSIDriver.Name) + // Create the Ceph COSI Driver Deployment cephcosidriverDeployment, err := createCephCOSIDriverDeployment(cephCOSIDriver) if err != nil { return errors.Wrap(err, "failed to create Ceph COSI Driver Deployment CRD") } - logger.Infof("starting Ceph COSI Driver deployment %q in namespace %q", cephcosidriverDeployment.Name, cephcosidriverDeployment.Namespace) + log.NamedInfo(nsName, logger, "starting Ceph COSI Driver deployment %q in namespace %q", cephcosidriverDeployment.Name, cephcosidriverDeployment.Namespace) err = r.client.Create(r.opManagerContext, cephcosidriverDeployment) if err != nil { if !kerrors.IsAlreadyExists(err) { return errors.Wrap(err, "failed to create Ceph COSI Driver deployment") } - logger.Info("Ceph COSI Driver deployment already exists, updating") + log.NamedInfo(nsName, logger, "Ceph COSI Driver deployment already exists, updating") err = r.client.Update(r.opManagerContext, cephcosidriverDeployment) if err != nil { return errors.Wrap(err, "failed to update Ceph COSI Driver deployment") } } else { - logger.Info("Ceph COSI Driver deployment started") + log.NamedInfo(nsName, logger, "Ceph COSI Driver deployment started") } return nil diff --git a/pkg/operator/ceph/object/dependents.go b/pkg/operator/ceph/object/dependents.go index 2a88c2384..cfac845b5 100644 --- a/pkg/operator/ceph/object/dependents.go +++ b/pkg/operator/ceph/object/dependents.go @@ -23,7 +23,9 @@ import ( v1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1" "github.com/rook/rook/pkg/clusterd" "github.com/rook/rook/pkg/daemon/ceph/client" + "github.com/rook/rook/pkg/operator/ceph/controller" "github.com/rook/rook/pkg/util/dependents" + "github.com/rook/rook/pkg/util/log" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -42,7 +44,7 @@ func CephObjectStoreDependents( objCtx *Context, opsCtx *AdminOpsContext, ) (*dependents.DependentList, error) { - nsName := fmt.Sprintf("%s/%s", store.Namespace, store.Name) + nsName := controller.NsName(store.Namespace, store.Name) baseErrMsg := fmt.Sprintf("failed to get dependents of CephObjectStore %q", nsName) deps := dependents.NewDependentList() @@ -67,7 +69,7 @@ func CephObjectStoreDependents( } if !deps.Empty() { // zone is master with peers; require user intervention - logger.Errorf("%s. Either change the master or remove its peers before the deletion", zoneIsMasterWithPeersDependentType) + log.NamedError(nsName, logger, "%s. Either change the master or remove its peers before the deletion", zoneIsMasterWithPeersDependentType) return deps, errors.Errorf("%s: %q\nall peer zones must be deleted, or a peer zone must be manually set as the master zone after that peer has all necessary data synched to it", zoneIsMasterWithPeersDependentType, deps.OfKind(zoneIsMasterWithPeersDependentType)) } @@ -91,7 +93,7 @@ func CephObjectStoreDependents( if user.Spec.Store == store.Name { deps.Add("CephObjectStoreUsers", user.Name) } - logger.Debugf("found CephObjectStoreUser %q that does not depend on CephObjectStore %q", user.Name, nsName) + log.NamedDebug(nsName, logger, "found CephObjectStoreUser %q that does not depend on CephObjectStore %q", user.Name, nsName) } return deps, nil @@ -106,7 +108,7 @@ func getBucketDependents( objCtx *Context, opsCtx *AdminOpsContext, ) error { - nsName := fmt.Sprintf("%s/%s", store.Namespace, store.Name) + nsName := controller.NsName(store.Namespace, store.Name) missingPools, err := missingPools(objCtx) if err != nil { @@ -118,7 +120,7 @@ func getBucketDependents( // Rook operator restarted. // in either case, we cannot get a successful connection to RGW(s) to check for buckets, and // we can assume it is safe for deletion to proceed - logger.Infof("skipping check for bucket dependents of CephObjectStore %q. some pools are missing: %v", nsName, missingPools) + log.NamedInfo(nsName, logger, "skipping check for bucket dependents of CephObjectStore %q. some pools are missing: %v", nsName, missingPools) return nil } diff --git a/pkg/operator/ceph/object/mime.go b/pkg/operator/ceph/object/mime.go index 82eb8c070..650d27ee3 100644 --- a/pkg/operator/ceph/object/mime.go +++ b/pkg/operator/ceph/object/mime.go @@ -21,7 +21,9 @@ import ( "path" "github.com/pkg/errors" + opcontroller "github.com/rook/rook/pkg/operator/ceph/controller" "github.com/rook/rook/pkg/operator/k8sutil" + "github.com/rook/rook/pkg/util/log" v1 "k8s.io/api/core/v1" kerrors "k8s.io/apimachinery/pkg/api/errors" ) @@ -45,9 +47,10 @@ func mimeTypesMountPath() string { // store mime.types file in a config map func (c *clusterConfig) generateMimeTypes() error { + nsName := opcontroller.NsName(c.store.Namespace, c.store.Name) k := k8sutil.NewConfigMapKVStore(c.store.Namespace, c.context.Clientset, c.ownerInfo) if _, err := k.GetValue(c.clusterInfo.Context, c.mimeTypesConfigMapName(), mimeTypesFileName); err == nil || !kerrors.IsNotFound(err) { - logger.Infof("config map %q for object store %q already exists, not overwriting", c.mimeTypesConfigMapName(), c.store.Name) + log.NamedInfo(nsName, logger, "config map %q for object store %q already exists, not overwriting", c.mimeTypesConfigMapName(), c.store.Name) return nil } // is not found diff --git a/pkg/operator/ceph/object/notification/controller.go b/pkg/operator/ceph/object/notification/controller.go index 7acafdc50..f88569555 100644 --- a/pkg/operator/ceph/object/notification/controller.go +++ b/pkg/operator/ceph/object/notification/controller.go @@ -34,6 +34,7 @@ import ( "github.com/rook/rook/pkg/operator/ceph/object/topic" "github.com/rook/rook/pkg/operator/ceph/reporting" "github.com/rook/rook/pkg/operator/k8sutil" + "github.com/rook/rook/pkg/util/log" kapiv1 "k8s.io/api/core/v1" kerrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -126,7 +127,7 @@ func (r *ReconcileNotifications) Reconcile(context context.Context, request reco reconcileResponse, notification, err := r.reconcile(request) if err != nil { r.updateStatus(k8sutil.ObservedGenerationNotAvailable, request.NamespacedName, k8sutil.ReconcileFailedStatus) - logger.Errorf("failed to reconcile %v", err) + log.NamedError(request.NamespacedName, logger, "failed to reconcile %v", err) } else { // Successful reconciliation r.updateStatus(notification.Generation, request.NamespacedName, k8sutil.ReadyStatus) @@ -143,7 +144,7 @@ func (r *ReconcileNotifications) reconcile(request reconcile.Request) (reconcile err := r.client.Get(r.opManagerContext, request.NamespacedName, notification) if err != nil { if kerrors.IsNotFound(err) { - logger.Debugf("CephBucketNotification %q resource not found. Ignoring since resource must be deleted.", bnName) + log.NamedDebug(request.NamespacedName, logger, "CephBucketNotification resource not found. Ignoring since resource must be deleted.") return reconcile.Result{}, *notification, nil } // Error reading the object - requeue the request. @@ -152,7 +153,7 @@ func (r *ReconcileNotifications) reconcile(request reconcile.Request) (reconcile // DELETE: the CR was deleted if !notification.GetDeletionTimestamp().IsZero() { - logger.Debugf("CephBucketNotification %q was deleted", bnName) + log.NamedDebug(request.NamespacedName, logger, "CephBucketNotification was deleted") // Return and do not requeue. Successful deletion. return reconcile.Result{}, *notification, nil } @@ -187,7 +188,7 @@ func (r *ReconcileNotifications) reconcile(request reconcile.Request) (reconcile return reconcile.Result{}, *notification, errors.Wrapf(err, "failed to list ObjectBucketClaims for CephBucketNotification %q", bnName) } if len(obcList.Items) == 0 { - logger.Debugf("no ObjectbucketClaim associated with CephBucketNotification %q", bnName) + log.NamedDebug(request.NamespacedName, logger, "no ObjectbucketClaim associated with CephBucketNotification") return reconcile.Result{}, *notification, nil } @@ -226,7 +227,7 @@ func (r *ReconcileNotifications) reconcile(request reconcile.Request) (reconcile if err != nil { return reconcile.Result{}, *notification, errors.Wrapf(err, "failed to provision notification for ObjectBucketClaims %q", bucketName) } - logger.Infof("provisioned CephBucketNotification %q for ObjectBucketClaims %q", bnName, bucketName) + log.NamedInfo(request.NamespacedName, logger, "provisioned CephBucketNotification for ObjectBucketClaims %q", bucketName) } return reconcile.Result{}, *notification, nil @@ -256,7 +257,7 @@ func getReadyCluster(client client.Client, opManagerContext context.Context, con controllerName, ) if !isReadyToReconcile || !cephClusterExists { - logger.Debug("Ceph cluster not yet present.") + log.NamespacedDebug(objectStoreNamespace, logger, "Ceph cluster not yet present.") return nil, nil, nil } clusterInfo, _, _, err := opcontroller.LoadClusterInfo(&context, opManagerContext, cephCluster.Namespace, &cephCluster.Spec) @@ -271,11 +272,11 @@ func (r *ReconcileNotifications) updateStatus(observedGeneration int64, nsName t notification := &cephv1.CephBucketNotification{} if err := r.client.Get(r.opManagerContext, nsName, notification); err != nil { if kerrors.IsNotFound(err) { - logger.Debug("CephBucketNotification resource not found. Ignoring since object must be deleted.") + log.NamedDebug(nsName, logger, "CephBucketNotification resource not found. Ignoring since object must be deleted.") return } - logger.Warningf("failed to retrieve CephBucketNotification %q to update status to %q. %v", nsName, status, err) + log.NamedWarning(nsName, logger, "failed to retrieve CephBucketNotification %q to update status to %q. %v", nsName, status, err) return } @@ -290,9 +291,9 @@ func (r *ReconcileNotifications) updateStatus(observedGeneration int64, nsName t } if err := reporting.UpdateStatus(r.client, notification); err != nil { - logger.Errorf("failed to set CephBucketNotification %q status to %q. error %v", nsName, status, err) + log.NamedError(nsName, logger, "failed to set CephBucketNotification %q status to %q. error %v", nsName, status, err) return } - logger.Debugf("CephBucketNotification %q status updated to %q", nsName, status) + log.NamedDebug(nsName, logger, "CephBucketNotification %q status updated to %q", nsName, status) } diff --git a/pkg/operator/ceph/object/notification/obc_label_controller.go b/pkg/operator/ceph/object/notification/obc_label_controller.go index 8c7340166..6f9deb5b3 100644 --- a/pkg/operator/ceph/object/notification/obc_label_controller.go +++ b/pkg/operator/ceph/object/notification/obc_label_controller.go @@ -30,6 +30,7 @@ import ( "github.com/rook/rook/pkg/operator/ceph/object/bucket" "github.com/rook/rook/pkg/operator/ceph/object/topic" "github.com/rook/rook/pkg/operator/ceph/reporting" + "github.com/rook/rook/pkg/util/log" kapiv1 "k8s.io/api/core/v1" kerrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -64,35 +65,36 @@ func obcPredicate[T *bktv1alpha1.ObjectBucketClaim]() predicate.TypedFuncs[T] { return predicate.TypedFuncs[T]{ CreateFunc: func(e event.TypedCreateEvent[T]) bool { obj := (*bktv1alpha1.ObjectBucketClaim)(e.Object) - - logger.Debugf("create event from a CR: %q", obj.GetName()) + nsName := opcontroller.NsName(obj.GetNamespace(), obj.GetName()) + log.NamedDebug(nsName, logger, "create event from a CR") return true }, DeleteFunc: func(e event.TypedDeleteEvent[T]) bool { obj := (*bktv1alpha1.ObjectBucketClaim)(e.Object) - - logger.Debugf("delete event from a CR: %q", obj.GetName()) + nsName := opcontroller.NsName(obj.GetNamespace(), obj.GetName()) + log.NamedDebug(nsName, logger, "delete event from a CR") return true }, UpdateFunc: func(e event.TypedUpdateEvent[T]) bool { // break generic-ness in order to access .Spec.ObjectBucketName objOld := (*bktv1alpha1.ObjectBucketClaim)(e.ObjectOld) objNew := (*bktv1alpha1.ObjectBucketClaim)(e.ObjectNew) + nsName := opcontroller.NsName(objNew.GetNamespace(), objNew.GetName()) - logger.Debug("update event on ObjectBucketClaim CR") + log.NamedDebug(nsName, logger, "update event on ObjectBucketClaim CR") // If the labels "do_not_reconcile" is set on the object, let's not reconcile that request if opcontroller.IsDoNotReconcile(objNew.GetLabels()) { - logger.Debugf("object %q matched on update but %q label is set, doing nothing", objNew.GetName(), opcontroller.DoNotReconcileLabelName) + log.NamedDebug(nsName, logger, "object %q matched on update but %q label is set, doing nothing", objNew.GetName(), opcontroller.DoNotReconcileLabelName) return false } if !reflect.DeepEqual(objOld.GetLabels(), objNew.GetLabels()) { - logger.Infof("CR labels has changed for %q", objNew.GetName()) + log.NamedInfo(nsName, logger, "CR labels has changed") return true } else if objOld.Spec.ObjectBucketName != objNew.Spec.ObjectBucketName { - logger.Infof("CR %q bucket name changed from %q to %q", objNew.GetName(), objOld.Spec.ObjectBucketName, objNew.Spec.ObjectBucketName) + log.NamedInfo(nsName, logger, "CR bucket name changed from %q to %q", objOld.Spec.ObjectBucketName, objNew.Spec.ObjectBucketName) return true } - logger.Debugf("no change in CR %q", objNew.GetName()) + log.NamedDebug(nsName, logger, "no change in CR %q", objNew.GetName()) return false }, GenericFunc: func(e event.TypedGenericEvent[T]) bool { @@ -134,20 +136,20 @@ func (r *ReconcileOBCLabels) Reconcile(context context.Context, request reconcil // workaround because the rook logging mechanism is not compatible with the controller-runtime logging interface reconcileResponse, err := r.reconcile(request) if err != nil { - logger.Errorf("failed to reconcile %v", err) + log.NamedError(request.NamespacedName, logger, "failed to reconcile %v", err) } return reconcileResponse, err } func (r *ReconcileOBCLabels) reconcile(request reconcile.Request) (reconcile.Result, error) { - logger.Debugf("reconciling ObjectBucketClaim %v labels for bucket notifications", request.NamespacedName.String()) + log.NamedDebug(request.NamespacedName, logger, "reconciling ObjectBucketClaim labels for bucket notifications") // Fetch the ObjectBucketClaim instance obc := bktv1alpha1.ObjectBucketClaim{} err := r.client.Get(r.opManagerContext, request.NamespacedName, &obc) if err != nil { if kerrors.IsNotFound(err) { - logger.Debugf("ObjectBucketClaim %q resource not found. Ignoring since resource must be deleted.", request.NamespacedName) + log.NamedDebug(request.NamespacedName, logger, "ObjectBucketClaim resource not found. Ignoring since resource must be deleted.") return reconcile.Result{}, nil } // Error reading the object - requeue the request. @@ -156,14 +158,14 @@ func (r *ReconcileOBCLabels) reconcile(request reconcile.Request) (reconcile.Res // DELETE: the CR was deleted if !obc.GetDeletionTimestamp().IsZero() { - logger.Debugf("ObjectBucketClaim %q was deleted", request.NamespacedName) + log.NamedDebug(request.NamespacedName, logger, "ObjectBucketClaim was deleted") // Return and do not requeue. Successful deletion. return reconcile.Result{}, nil } // reschedule if ObjectBucket was not created yet if obc.Spec.ObjectBucketName == "" { - logger.Debugf("ObjectBucketClaim %q resource did not create the bucket yet. will retry", request.NamespacedName) + log.NamedDebug(request.NamespacedName, logger, "ObjectBucketClaim resource did not create the bucket yet. will retry") return waitForRequeueIfObjectBucketNotReady, nil } @@ -176,7 +178,7 @@ func (r *ReconcileOBCLabels) reconcile(request reconcile.Request) (reconcile.Res // validate if the bucket is provisioned by the ceph provisioner if !strings.Contains(ob.Labels[bucketProvisionerLabelKey], bucketProvisionerLabelVal) { - logger.Debugf("ObjectBucket %q was not provisioned by the ceph object store provisioner and tagged with provisioner %q. ignoring", + log.NamedDebug(request.NamespacedName, logger, "ObjectBucket %q was not provisioned by the ceph object store provisioner and tagged with provisioner %q. ignoring", bucketName, ob.Labels[bucketProvisionerLabelKey]) return reconcile.Result{}, nil } @@ -215,11 +217,11 @@ func (r *ReconcileOBCLabels) reconcile(request reconcile.Request) (reconcile.Res notifyLabels := strings.SplitAfterN(labelKey, notificationLabelPrefix, 2) if len(notifyLabels) > 1 && notifyLabels[1] != "" { if labelValue != notifyLabels[1] { - logger.Warningf("bucket notification label mismatch. ignoring key %q value %q", labelKey, labelValue) + log.NamedWarning(request.NamespacedName, logger, "bucket notification label mismatch. ignoring key %q value %q", labelKey, labelValue) continue } labelList = append(labelList, labelValue) - logger.Debugf("bucket notification label %q found on ObjectbucketClaim %q", labelValue, bucketName) + log.NamedDebug(request.NamespacedName, logger, "bucket notification label %q found on ObjectbucketClaim %q", labelValue, bucketName) } } @@ -233,7 +235,7 @@ func (r *ReconcileOBCLabels) reconcile(request reconcile.Request) (reconcile.Res for _, notificationId := range deleteList { err = deleteNotificationFunc(p, &ob, notificationId) if err != nil { - logger.Errorf("notification %q failed remove from %q, returned error %v", notificationId, ob.Spec.Endpoint.BucketName, err) + log.NamedError(request.NamespacedName, logger, "notification %q failed remove from %q, returned error %v", notificationId, ob.Spec.Endpoint.BucketName, err) retry = true } } diff --git a/pkg/operator/ceph/object/notification/provisioner.go b/pkg/operator/ceph/object/notification/provisioner.go index 046cf2cf8..78c57172c 100644 --- a/pkg/operator/ceph/object/notification/provisioner.go +++ b/pkg/operator/ceph/object/notification/provisioner.go @@ -30,6 +30,7 @@ import ( cephclient "github.com/rook/rook/pkg/daemon/ceph/client" "github.com/rook/rook/pkg/operator/ceph/object" "github.com/rook/rook/pkg/operator/ceph/object/bucket" + "github.com/rook/rook/pkg/util/log" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" ) @@ -158,7 +159,7 @@ var createNotification = func(p provisioner, bucket *bktv1alpha1.ObjectBucket, t return errors.Wrapf(err, "failed to provisioning CephBucketNotification %q for bucket %q", bnName, bucketName) } - logger.Infof("CephBucketNotification %q was created for bucket %q", bnName, bucketName) + log.NamedInfo(bnName, logger, "CephBucketNotification was created for bucket %q", bucketName) return nil } diff --git a/pkg/operator/ceph/object/objectstore.go b/pkg/operator/ceph/object/objectstore.go index b64eadbd2..61b73dac3 100644 --- a/pkg/operator/ceph/object/objectstore.go +++ b/pkg/operator/ceph/object/objectstore.go @@ -35,6 +35,7 @@ import ( "github.com/rook/rook/pkg/operator/k8sutil" "github.com/rook/rook/pkg/util" "github.com/rook/rook/pkg/util/exec" + "github.com/rook/rook/pkg/util/log" "golang.org/x/sync/errgroup" v1 "k8s.io/api/core/v1" kerrors "k8s.io/apimachinery/pkg/api/errors" @@ -138,7 +139,7 @@ func removeObjectStoreFromMultisite(objContext *Context, spec cephv1.ObjectStore } return errors.Wrapf(err, "failed to remove object store %q endpoint from rgw zone group %q", objContext.Name, objContext.ZoneGroup) } - logger.Debugf("endpoint %q was removed from zone group %q. the remaining endpoints in the zone group are %q", objContext.Endpoint, objContext.ZoneGroup, zoneEndpoints) + log.NamedDebug(objContext.NsName(), logger, "endpoint %q was removed from zone group %q. the remaining endpoints in the zone group are %q", objContext.Endpoint, objContext.ZoneGroup, zoneEndpoints) // check if zone group is master only if zone is master for creating the system user zoneGroupIsMaster, err = checkZoneGroupIsMaster(objContext) @@ -151,16 +152,15 @@ func removeObjectStoreFromMultisite(objContext *Context, spec cephv1.ObjectStore if err != nil { return errors.Wrapf(err, "failed to remove object store %q endpoint from rgw zone %q", objContext.Name, spec.Zone.Name) } - logger.Debugf("endpoint %q was removed from zone %q. the remaining endpoints in the zone are %q", objContext.Endpoint, objContext.Zone, zoneEndpoints) + log.NamedDebug(objContext.NsName(), logger, "endpoint %q was removed from zone %q. the remaining endpoints in the zone are %q", objContext.Endpoint, objContext.Zone, zoneEndpoints) if zoneIsMaster && zoneGroupIsMaster && zoneEndpoints == "" { - logger.Warningf("WARNING: No other zone in realm %q can commit to the period or pull the realm until you create another object-store in zone %q", objContext.Realm, objContext.Zone) + log.NamedWarning(objContext.NsName(), logger, "WARNING: No other zone in realm %q can commit to the period or pull the realm until you create another object-store in zone %q", objContext.Realm, objContext.Zone) } // this will notify other zones of changes if there are multi-zones if err := commitConfigChanges(objContext); err != nil { - nsName := fmt.Sprintf("%s/%s", objContext.clusterInfo.Namespace, objContext.Name) - return errors.Wrapf(err, "failed to commit config changes after removing CephObjectStore %q from multi-site", nsName) + return errors.Wrapf(err, "failed to commit config changes after removing CephObjectStore %q from multi-site", objContext.NsName()) } } return nil @@ -172,10 +172,10 @@ func deleteSingleSiteRealmAndPools(objContext *Context, spec cephv1.ObjectStoreS return errors.Wrap(err, "failed to detect object stores during deletion") } if len(stores) == 0 { - logger.Infof("did not find object store %q, nothing to delete", objContext.Name) + log.NamedInfo(objContext.NsName(), logger, "did not find object store %q, nothing to delete", objContext.Name) return nil } - logger.Infof("Found stores %v when deleting store %s", stores, objContext.Name) + log.NamedInfo(objContext.NsName(), logger, "Found stores %v when deleting store %s", stores, objContext.Name) err = deleteRealm(objContext) if err != nil { @@ -189,7 +189,7 @@ func deleteSingleSiteRealmAndPools(objContext *Context, spec cephv1.ObjectStoreS if !spec.PreservePoolsOnDelete { if EmptyPool(spec.DataPool) && EmptyPool(spec.MetadataPool) { - logger.Info("skipping removal of pools since not specified in the object store") + log.NamedInfo(objContext.NsName(), logger, "skipping removal of pools since not specified in the object store") return nil } err = DeletePools(objContext, lastStore, objContext.Name) @@ -197,7 +197,7 @@ func deleteSingleSiteRealmAndPools(objContext *Context, spec cephv1.ObjectStoreS return errors.Wrap(err, "failed to delete object store pools") } } else { - logger.Infof("PreservePoolsOnDelete is set in object store %s. Pools not deleted", objContext.Name) + log.NamedInfo(objContext.NsName(), logger, "PreservePoolsOnDelete is set in object store %s. Pools not deleted", objContext.Name) } return nil @@ -235,7 +235,7 @@ func getMultisiteForObjectStore(ctx context.Context, clusterdContext *clusterd.C } func CheckZoneIsMaster(objContext *Context) (bool, error) { - logger.Debugf("checking if zone %v is the master zone", objContext.Zone) + log.NamedDebug(objContext.NsName(), logger, "checking if zone %v is the master zone", objContext.Zone) realmArg := fmt.Sprintf("--rgw-realm=%s", objContext.Realm) zoneGroupArg := fmt.Sprintf("--rgw-zonegroup=%s", objContext.ZoneGroup) zoneArg := fmt.Sprintf("--rgw-zone=%s", objContext.Zone) @@ -253,7 +253,7 @@ func CheckZoneIsMaster(objContext *Context) (bool, error) { if err != nil { return false, errors.Wrap(err, "failed to parse zonegroup get json") } - logger.Debugf("got master zone ID for zone group %v", objContext.ZoneGroup) + log.NamedDebug(objContext.NsName(), logger, "got master zone ID for zone group %v", objContext.ZoneGroup) zoneOutput, err := RunAdminCommandNoMultisite(objContext, true, "zone", "get", realmArg, zoneGroupArg, zoneArg) if err != nil { @@ -268,19 +268,19 @@ func CheckZoneIsMaster(objContext *Context) (bool, error) { if err != nil { return false, errors.Wrap(err, "failed to parse zone id") } - logger.Debugf("got zone ID for zone %v", objContext.Zone) + log.NamedDebug(objContext.NsName(), logger, "got zone ID for zone %v", objContext.Zone) if zoneID == zoneGroupOutput.MasterZoneID { - logger.Debugf("zone is master") + log.NamedDebug(objContext.NsName(), logger, "zone is master") return true, nil } - logger.Debugf("zone is not master") + log.NamedDebug(objContext.NsName(), logger, "zone is not master") return false, nil } func checkZoneGroupIsMaster(objContext *Context) (bool, error) { - logger.Debugf("checking if zone group %v is the master zone group", objContext.ZoneGroup) + log.NamedDebug(objContext.NsName(), logger, "checking if zone group %v is the master zone group", objContext.ZoneGroup) realmArg := fmt.Sprintf("--rgw-realm=%s", objContext.Realm) zoneGroupArg := fmt.Sprintf("--rgw-zonegroup=%s", objContext.ZoneGroup) @@ -318,7 +318,7 @@ func GetRealmKeySecret(ctx context.Context, clusterdContext *clusterd.Context, r if err != nil { return nil, errors.Wrapf(err, "failed to get CephObjectRealm %q keys secret", realmName.String()) } - logger.Debugf("found keys secret for CephObjectRealm %q", realmName.String()) + log.NamedDebug(realmName, logger, "found keys secret for CephObjectRealm %q", realmName.String()) return realmSecret, nil } @@ -331,7 +331,7 @@ func GetRealmKeyArgsFromSecret(realmSecret *v1.Secret, realmName types.Namespace if err != nil { return "", "", errors.Wrapf(err, "failed to decode CephObjectRealm %q secret key from secret %q", realmName.String(), realmSecret.Name) } - logger.Debugf("decoded keys for realm %q", realmName.String()) + log.NamedDebug(realmName, logger, "decoded keys for realm %q", realmName.String()) accessKeyArg := fmt.Sprintf("--access-key=%s", accessKey) secretKeyArg := fmt.Sprintf("--secret-key=%s", secretKey) @@ -340,8 +340,9 @@ func GetRealmKeyArgsFromSecret(realmSecret *v1.Secret, realmName types.Namespace } func GetRealmKeyArgs(ctx context.Context, clusterdContext *clusterd.Context, realmName, namespace string) (string, string, error) { + nsName := types.NamespacedName{Namespace: namespace, Name: realmName} realmNsName := types.NamespacedName{Namespace: namespace, Name: realmName} - logger.Debugf("getting keys for realm %q", realmNsName.String()) + log.NamedDebug(nsName, logger, "getting keys for realm %q", realmNsName.String()) secret, err := GetRealmKeySecret(ctx, clusterdContext, realmNsName) if err != nil { @@ -352,7 +353,7 @@ func GetRealmKeyArgs(ctx context.Context, clusterdContext *clusterd.Context, rea } func getZoneEndpoints(objContext *Context, serviceEndpoint string) ([]string, bool, error) { - logger.Debugf("getting current endpoints for zone %v", objContext.Zone) + log.NamedDebug(objContext.NsName(), logger, "getting current endpoints for zone %v", objContext.Zone) realmArg := fmt.Sprintf("--rgw-realm=%s", objContext.Realm) zoneGroupArg := fmt.Sprintf("--rgw-zonegroup=%s", objContext.ZoneGroup) isEndpointAlreadyExists := false @@ -417,20 +418,20 @@ func createMultisiteConfigurations(objContext *Context, store *cephv1.CephObject // create the object if it doesn't exist yet if store.Spec.DefaultRealm && objContext.clusterInfo.CephVersion.IsAtLeast(cephver.Squid) { - logger.Infof("marking object store %q as default realm", store.Namespace+"/"+store.Name) + log.NamedInfo(objContext.NsName(), logger, "marking object store %q as default realm", store.Namespace+"/"+store.Name) args = append(args, "--default") } output, err = RunAdminCommandNoMultisite(objContext, false, args...) if err != nil { return errorOrIsNotFound(err, "failed to create ceph %q %q, for reason %q", configType, configTypeArg, output) } - logger.Debugf("created %q %q", configType, configTypeArg) + log.NamedDebug(objContext.NsName(), logger, "created %q %q", configType, configTypeArg) return nil } func createNonMultisiteStore(objContext *Context, endpointArg string, store *cephv1.CephObjectStore) error { - logger.Debugf("creating realm, zone group, zone for object-store %v", objContext.Name) + log.NamedDebug(objContext.NsName(), logger, "creating realm, zone group, zone for object-store %v", objContext.Name) realmArg := fmt.Sprintf("--rgw-realm=%s", objContext.Realm) zoneGroupArg := fmt.Sprintf("--rgw-zonegroup=%s", objContext.ZoneGroup) @@ -451,7 +452,7 @@ func createNonMultisiteStore(objContext *Context, endpointArg string, store *cep return err } - logger.Infof("Object store %q: realm=%s, zonegroup=%s, zone=%s", objContext.Name, objContext.Realm, objContext.ZoneGroup, objContext.Zone) + log.NamedInfo(objContext.NsName(), logger, "Object store %q: realm=%s, zonegroup=%s, zone=%s", objContext.Name, objContext.Realm, objContext.ZoneGroup, objContext.Zone) // Configure the zone for RADOS namespaces err = ConfigureSharedPoolsForZone(objContext, store.Spec.SharedPools) @@ -460,15 +461,14 @@ func createNonMultisiteStore(objContext *Context, endpointArg string, store *cep } if err := commitConfigChanges(objContext); err != nil { - nsName := fmt.Sprintf("%s/%s", objContext.clusterInfo.Namespace, objContext.Name) - return errors.Wrapf(err, "failed to commit config changes after creating multisite config for CephObjectStore %q", nsName) + return errors.Wrapf(err, "failed to commit config changes after creating multisite config for CephObjectStore %q", objContext.NsName()) } return nil } func JoinMultisite(objContext *Context, endpointArg, zoneEndpoints, namespace string) error { - logger.Debugf("joining zone %v", objContext.Zone) + log.NamedDebug(objContext.NsName(), logger, "joining zone %v", objContext.Zone) realmArg := fmt.Sprintf("--rgw-realm=%s", objContext.Realm) zoneGroupArg := fmt.Sprintf("--rgw-zonegroup=%s", objContext.ZoneGroup) zoneArg := fmt.Sprintf("--rgw-zone=%s", objContext.Zone) @@ -485,7 +485,7 @@ func JoinMultisite(objContext *Context, endpointArg, zoneEndpoints, namespace st if err != nil { return errorOrIsNotFound(err, "failed to add object store %q in rgw zone group %q", objContext.Name, objContext.ZoneGroup) } - logger.Debugf("endpoints for zonegroup %q are now %q", objContext.ZoneGroup, zoneEndpoints) + log.NamedDebug(objContext.NsName(), logger, "endpoints for zonegroup %q are now %q", objContext.ZoneGroup, zoneEndpoints) // check if zone group is master only if zone is master for creating the system user zoneGroupIsMaster, err = checkZoneGroupIsMaster(objContext) @@ -497,14 +497,13 @@ func JoinMultisite(objContext *Context, endpointArg, zoneEndpoints, namespace st if err != nil { return errorOrIsNotFound(err, "failed to add object store %q in rgw zone %q", objContext.Name, objContext.Zone) } - logger.Debugf("endpoints for zone %q are now %q", objContext.Zone, zoneEndpoints) + log.NamedDebug(objContext.NsName(), logger, "endpoints for zone %q are now %q", objContext.Zone, zoneEndpoints) if err := commitConfigChanges(objContext); err != nil { - nsName := fmt.Sprintf("%s/%s", objContext.clusterInfo.Namespace, objContext.Name) - return errors.Wrapf(err, "failed to commit config changes for CephObjectStore %q when joining multisite ", nsName) + return errors.Wrapf(err, "failed to commit config changes for CephObjectStore %q when joining multisite ", objContext.NsName()) } - logger.Infof("added object store %q to realm %q, zonegroup %q, zone %q", objContext.Name, objContext.Realm, objContext.ZoneGroup, objContext.Zone) + log.NamedInfo(objContext.NsName(), logger, "added object store %q to realm %q, zonegroup %q, zone %q", objContext.Name, objContext.Realm, objContext.ZoneGroup, objContext.Zone) // create system user for realm for master zone in master zonegroup for multisite scenario if zoneIsMaster && zoneGroupIsMaster { @@ -526,24 +525,24 @@ func createSystemUser(objContext *Context, namespace string) error { output, err := RunAdminCommandNoMultisite(objContext, false, "user", "info", uidArg, realmArg, zoneGroupArg, zoneArg) if err == nil { - logger.Debugf("realm system user %q has already been created", uid) + log.NamedDebug(objContext.NsName(), logger, "realm system user %q has already been created", uid) return nil } if code, ok := exec.ExitStatus(err); ok && code == int(syscall.EINVAL) { - logger.Debugf("realm system user %q not found, running `radosgw-admin user create`", uid) + log.NamedDebug(objContext.NsName(), logger, "realm system user %q not found, running `radosgw-admin user create`", uid) accessKeyArg, secretKeyArg, err := GetRealmKeyArgs(objContext.clusterInfo.Context, objContext.Context, objContext.Realm, namespace) if err != nil { return errors.Wrap(err, "failed to get keys for realm") } - logger.Debugf("found keys to create realm system user %v", uid) + log.NamedDebug(objContext.NsName(), logger, "found keys to create realm system user %v", uid) systemArg := "--system" displayNameArg := fmt.Sprintf("--display-name=%s.user", objContext.Realm) output, err = RunAdminCommandNoMultisite(objContext, false, "user", "create", realmArg, zoneGroupArg, zoneArg, uidArg, displayNameArg, accessKeyArg, secretKeyArg, systemArg) if err != nil { return errorOrIsNotFound(err, "failed to create realm system user %q for reason: %q", uid, output) } - logger.Debugf("created realm system user %v", uid) + log.NamedDebug(objContext.NsName(), logger, "created realm system user %v", uid) } else { return errorOrIsNotFound(err, "radosgw-admin user info for system user failed with code %d and output %q", strconv.Itoa(code), output) } @@ -552,7 +551,7 @@ func createSystemUser(objContext *Context, namespace string) error { } func configureObjectStore(objContext *Context, store *cephv1.CephObjectStore, zone *cephv1.CephObjectZone) error { - logger.Debugf("setting multisite configuration for object-store %v", store.Name) + log.NamedDebug(objContext.NsName(), logger, "setting multisite configuration for object-store %v", store.Name) if store.Spec.IsMultisite() { if zone != nil && len(zone.Spec.CustomEndpoints) == 0 { @@ -571,7 +570,7 @@ func configureObjectStore(objContext *Context, store *cephv1.CephObjectStore, zo } zoneEndpoints := strings.Join(zoneEndpointsList, ",") - logger.Debugf("Endpoints for zone %q are: %q", objContext.Zone, zoneEndpoints) + log.NamedDebug(objContext.NsName(), logger, "Endpoints for zone %q are: %q", objContext.Zone, zoneEndpoints) endpointArg := fmt.Sprintf("--endpoints=%s", zoneEndpoints) err = JoinMultisite(objContext, endpointArg, zoneEndpoints, store.Namespace) @@ -591,7 +590,7 @@ func configureObjectStore(objContext *Context, store *cephv1.CephObjectStore, zo } } - logger.Infof("configuration for object-store %v is complete", store.Name) + log.NamedInfo(objContext.NsName(), logger, "configuration for object-store %v is complete", store.Name) return nil } @@ -601,17 +600,17 @@ func deleteRealm(context *Context) error { zoneGroupArg := fmt.Sprintf("--rgw-zonegroup=%s", context.Name) _, err := RunAdminCommandNoMultisite(context, false, "realm", "delete", realmArg) if err != nil { - logger.Warningf("failed to delete rgw realm %q. %v", context.Name, err) + log.NamedWarning(context.NsName(), logger, "failed to delete rgw realm %q. %v", context.Name, err) } _, err = RunAdminCommandNoMultisite(context, false, "zonegroup", "delete", realmArg, zoneGroupArg) if err != nil { - logger.Warningf("failed to delete rgw zonegroup %q. %v", context.Name, err) + log.NamedWarning(context.NsName(), logger, "failed to delete rgw zonegroup %q. %v", context.Name, err) } _, err = runAdminCommand(context, false, "zone", "delete") if err != nil { - logger.Warningf("failed to delete rgw zone %q. %v", context.Name, err) + log.NamedWarning(context.NsName(), logger, "failed to delete rgw zone %q. %v", context.Name, err) } return nil @@ -682,14 +681,14 @@ func DeletePools(ctx *Context, lastStore bool, poolPrefix string) error { // Wait for all the pools to be deleted if err := waitGroup.Wait(); err != nil { - logger.Warning(err) + log.NamedWarning(ctx.NsName(), logger, "%s", err) } } else { for _, pool := range pools { name := poolName(poolPrefix, pool) if err := cephclient.DeletePool(ctx.Context, ctx.clusterInfo, name); err != nil { - logger.Warningf("failed to delete pool %q. %v", name, err) + log.NamedWarning(ctx.NsName(), logger, "failed to delete pool %q. %v", name, err) } } } @@ -750,7 +749,7 @@ func missingPools(context *Context) ([]string, error) { func CreateObjectStorePools(context *Context, cluster *cephv1.ClusterSpec, metadataPool, dataPool cephv1.PoolSpec) error { if EmptyPool(dataPool) || EmptyPool(metadataPool) { - logger.Info("no pools specified for the CR, checking for their existence...") + log.NamedInfo(context.NsName(), logger, "no pools specified for the CR, checking for their existence...") missingPools, err := missingPools(context) if err != nil { return err @@ -776,11 +775,11 @@ func CreateObjectStorePools(context *Context, cluster *cephv1.ClusterSpec, metad func ConfigureSharedPoolsForZone(objContext *Context, sharedPools cephv1.ObjectSharedPoolsSpec) error { if sharedPools.DataPoolName == "" && sharedPools.MetadataPoolName == "" && len(sharedPools.PoolPlacements) == 0 { - logger.Debugf("no shared pools to configure for store %q", objContext.nsName()) + log.NamedDebug(objContext.NsName(), logger, "no shared pools to configure for store") return nil } - logger.Infof("configuring shared pools for object store %q", objContext.nsName()) + log.NamedInfo(objContext.NsName(), logger, "configuring shared pools for object store") if err := sharedPoolsExist(objContext, sharedPools); err != nil { return errors.Wrapf(err, "object store cannot be configured until shared pools exist") } @@ -789,7 +788,7 @@ func ConfigureSharedPoolsForZone(objContext *Context, sharedPools cephv1.ObjectS if err != nil { return err } - zoneUpdated, err := adjustZoneDefaultPools(zoneConfig, sharedPools) + zoneUpdated, err := adjustZoneDefaultPools(objContext, zoneConfig, sharedPools) if err != nil { return err } @@ -812,14 +811,14 @@ func ConfigureSharedPoolsForZone(objContext *Context, sharedPools cephv1.ObjectS // persist configuration updates: if hasZoneChanged { - logger.Infof("zone config changed: performing zone config updates for %s", objContext.Zone) + log.NamedInfo(objContext.NsName(), logger, "zone config changed: performing zone config updates for %s", objContext.Zone) _, err := updateZoneJSON(objContext, zoneUpdated) if err != nil { return fmt.Errorf("unable to persist zone config update for %s: %w", objContext.Zone, err) } } if hasZoneGroupChanged { - logger.Infof("zonegroup config changed: performing zonegroup config updates for %s", objContext.ZoneGroup) + log.NamedInfo(objContext.NsName(), logger, "zonegroup config changed: performing zonegroup config updates for %s", objContext.ZoneGroup) _, err = updateZoneGroupJSON(objContext, zoneGroupUpdated) if err != nil { return fmt.Errorf("unable to persist zonegroup config update for %s: %w", objContext.ZoneGroup, err) @@ -869,7 +868,7 @@ func sharedPoolsExist(objContext *Context, sharedPools cephv1.ObjectSharedPoolsS return nil } -func adjustZoneDefaultPools(zone map[string]interface{}, spec cephv1.ObjectSharedPoolsSpec) (map[string]interface{}, error) { +func adjustZoneDefaultPools(objContext *Context, zone map[string]interface{}, spec cephv1.ObjectSharedPoolsSpec) (map[string]interface{}, error) { name, err := getObjProperty[string](zone, "name") if err != nil { return nil, fmt.Errorf("unable to get zone name: %w", err) @@ -913,10 +912,10 @@ func adjustZoneDefaultPools(zone map[string]interface{}, spec cephv1.ObjectShare namespacedPool := defaultMetaPool + nsSuffix prev, err := updateObjProperty(zone, namespacedPool, pool) if err != nil { - logger.Infof("unable to apply rados namespace to shared pool: %v", err) + log.NamedInfo(objContext.NsName(), logger, "unable to apply rados namespace to shared pool: %v", err) } if namespacedPool != prev { - logger.Debugf("update shared pool %s for zone %s: %s -> %s", pool, name, prev, namespacedPool) + log.NamedDebug(objContext.NsName(), logger, "update shared pool %s for zone %s: %s -> %s", pool, name, prev, namespacedPool) } } @@ -931,7 +930,7 @@ func adjustZoneDefaultPools(zone map[string]interface{}, spec cephv1.ObjectShare continue } if _, ok := zonePoolNSSuffix[field]; !ok { - logger.Warningf("zone config %q contains unknown pool %q", name, field) + log.NamedWarning(objContext.NsName(), logger, "zone config %q contains unknown pool %q", name, field) } } @@ -1083,21 +1082,21 @@ func getDashboardUser(context *Context) (ObjectUser, error) { } func enableRGWDashboard(context *Context) error { - logger.Info("enabling rgw dashboard") + log.NamedInfo(context.NsName(), logger, "enabling rgw dashboard") user, err := getDashboardUser(context) if err != nil { - logger.Debug("failed to get current dashboard user") + log.NamedDebug(context.NsName(), logger, "failed to get current dashboard user") return err } checkDashboard, err := checkDashboardUser(context, user) if err != nil { - logger.Debug("Unable to fetch dashboard user key for RGW, hence skipping") + log.NamedDebug(context.NsName(), logger, "Unable to fetch dashboard user key for RGW, hence skipping") return nil } if checkDashboard { - logger.Debug("RGW Dashboard is already enabled") + log.NamedDebug(context.NsName(), logger, "RGW Dashboard is already enabled") return nil } @@ -1123,7 +1122,7 @@ func enableRGWDashboard(context *Context) error { accessArgs = []string{"dashboard", "set-rgw-api-access-key", "-i", accessFile.Name()} defer func() { if err := os.Remove(accessFile.Name()); err != nil { - logger.Errorf("failed to clean up dashboard access-key file. %v", err) + log.NamedError(context.NsName(), logger, "failed to clean up dashboard access-key file. %v", err) } }() @@ -1145,32 +1144,32 @@ func enableRGWDashboard(context *Context) error { // Setting the dashboard api secret started hanging in some clusters // starting in ceph v15.2.8. We run it in a goroutine until the fix // is found. We expect the ceph command to timeout so at least the goroutine exits. - logger.Info("setting the dashboard api secret key") + log.NamedInfo(context.NsName(), logger, "setting the dashboard api secret key") _, err = cephCmd.RunWithTimeout(exec.CephCommandsTimeout) if err != nil { - logger.Errorf("failed to set user %q secretkey. %v", DashboardUser, err) + log.NamedError(context.NsName(), logger, "failed to set user %q secretkey. %v", DashboardUser, err) } if err := os.Remove(secretFile.Name()); err != nil { - logger.Errorf("failed to clean up dashboard secret-key file. %v", err) + log.NamedError(context.NsName(), logger, "failed to clean up dashboard secret-key file. %v", err) } - logger.Info("done setting the dashboard api secret key") + log.NamedInfo(context.NsName(), logger, "done setting the dashboard api secret key") }() return nil } func disableRGWDashboard(context *Context) { - logger.Info("disabling the dashboard api user and secret key") + log.NamedInfo(context.NsName(), logger, "disabling the dashboard api user and secret key") _, _, err := GetUser(context, DashboardUser) if err != nil { - logger.Infof("unable to fetch the user %q details from this objectstore %q", DashboardUser, context.Name) + log.NamedInfo(context.NsName(), logger, "unable to fetch the user %q details from this objectstore %q", DashboardUser, context.Name) } else { - logger.Info("deleting rgw dashboard user") + log.NamedInfo(context.NsName(), logger, "deleting rgw dashboard user") _, err = DeleteUser(context, DashboardUser) if err != nil { - logger.Warningf("failed to delete ceph user %q. %v", DashboardUser, err) + log.NamedWarning(context.NsName(), logger, "failed to delete ceph user %q. %v", DashboardUser, err) } } @@ -1178,16 +1177,16 @@ func disableRGWDashboard(context *Context) { cephCmd := cephclient.NewCephCommand(context.Context, context.clusterInfo, args) _, err = cephCmd.RunWithTimeout(exec.CephCommandsTimeout) if err != nil { - logger.Warningf("failed to reset user accesskey for user %q. %v", DashboardUser, err) + log.NamedWarning(context.NsName(), logger, "failed to reset user accesskey for user %q. %v", DashboardUser, err) } args = []string{"dashboard", "reset-rgw-api-secret-key"} cephCmd = cephclient.NewCephCommand(context.Context, context.clusterInfo, args) _, err = cephCmd.RunWithTimeout(exec.CephCommandsTimeout) if err != nil { - logger.Warningf("failed to reset user secretkey for user %q. %v", DashboardUser, err) + log.NamedWarning(context.NsName(), logger, "failed to reset user secretkey for user %q. %v", DashboardUser, err) } - logger.Info("done disabling the dashboard api secret key") + log.NamedInfo(context.NsName(), logger, "done disabling the dashboard api secret key") } func errorOrIsNotFound(err error, msg string, args ...string) error { @@ -1278,6 +1277,6 @@ func SetDefaultRealm(objContext *Context, realmName string) error { return errors.Wrapf(err, "failed to set realm %q as default, reason: %q", realmName, output) } - logger.Infof("successfully set realm %q as default", realmName+"/"+objContext.clusterInfo.Namespace) + log.NamedInfo(objContext.NsName(), logger, "successfully set realm %q as default", realmName+"/"+objContext.clusterInfo.Namespace) return nil } diff --git a/pkg/operator/ceph/object/realm/controller.go b/pkg/operator/ceph/object/realm/controller.go index e74447aa2..66da67152 100644 --- a/pkg/operator/ceph/object/realm/controller.go +++ b/pkg/operator/ceph/object/realm/controller.go @@ -45,6 +45,7 @@ import ( "github.com/rook/rook/pkg/operator/ceph/object" "github.com/rook/rook/pkg/operator/k8sutil" "github.com/rook/rook/pkg/util/exec" + "github.com/rook/rook/pkg/util/log" v1 "k8s.io/api/core/v1" kerrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -137,7 +138,7 @@ func (r *ReconcileObjectRealm) reconcile(request reconcile.Request) (reconcile.R err := r.client.Get(r.opManagerContext, request.NamespacedName, cephObjectRealm) if err != nil { if kerrors.IsNotFound(err) { - logger.Debugf("CephObjectRealm %q resource not found. Ignoring since object must be deleted", request.NamespacedName.String()) + log.NamedDebug(request.NamespacedName, logger, "CephObjectRealm resource not found. Ignoring since object must be deleted") return reconcile.Result{}, *cephObjectRealm, nil } // Error reading the object - requeue the request. @@ -166,7 +167,7 @@ func (r *ReconcileObjectRealm) reconcile(request reconcile.Request) (reconcile.R // DELETE: the CR was deleted if !cephObjectRealm.GetDeletionTimestamp().IsZero() { - logger.Debugf("deleting realm CR %q", cephObjectRealm.Name) + log.NamedDebug(request.NamespacedName, logger, "deleting realm CR") r.recorder.Eventf(cephObjectRealm, v1.EventTypeNormal, string(cephv1.ReconcileStarted), "deleting CephObjectRealm %q", cephObjectRealm.Name) // Return and do not requeue. Successful deletion. @@ -191,7 +192,7 @@ func (r *ReconcileObjectRealm) reconcile(request reconcile.Request) (reconcile.R // Create/Pull Ceph Realm if cephObjectRealm.Spec.IsPullRealm() { - logger.Debugf("pull section in realm %q spec found", request.NamespacedName) + log.NamedDebug(request.NamespacedName, logger, "pull section in realm spec found") _, err = r.pullCephRealm(cephObjectRealm) if err != nil { return reconcile.Result{}, *cephObjectRealm, err @@ -222,14 +223,15 @@ func (r *ReconcileObjectRealm) reconcile(request reconcile.Request) (reconcile.R r.updateStatus(observedGeneration, request.NamespacedName, k8sutil.ReadyStatus) // Return and do not requeue - logger.Debugf("realm %q done reconciling", request.NamespacedName) + log.NamedDebug(request.NamespacedName, logger, "realm done reconciling") return reconcile.Result{}, *cephObjectRealm, nil } func (r *ReconcileObjectRealm) pullCephRealm(realm *cephv1.CephObjectRealm) (reconcile.Result, error) { + nsName := opcontroller.NsName(realm.Namespace, realm.Name) realmArg := fmt.Sprintf("--rgw-realm=%s", realm.Name) urlArg := fmt.Sprintf("--url=%s", realm.Spec.Pull.Endpoint) - logger.Debugf("getting keys to pull realm for CephObjectRealm %q", realm.Name) + log.NamedDebug(nsName, logger, "getting keys to pull realm for CephObjectRealm %q", realm.Name) accessKeyArg, secretKeyArg, err := object.GetRealmKeyArgs(r.opManagerContext, r.context, realm.Name, realm.Namespace) if err != nil { if kerrors.IsNotFound(err) { @@ -237,31 +239,32 @@ func (r *ReconcileObjectRealm) pullCephRealm(realm *cephv1.CephObjectRealm) (rec } return waitForRequeueIfRealmNotReady, errors.Wrap(err, "failed to get keys for realm") } - logger.Debugf("keys found to pull realm for CephObjectRealm %q, getting ready to pull from endpoint %q", realm.Name, realm.Spec.Pull.Endpoint) + log.NamedDebug(nsName, logger, "keys found to pull realm for CephObjectRealm %q, getting ready to pull from endpoint %q", realm.Name, realm.Spec.Pull.Endpoint) objContext := object.NewContext(r.context, r.clusterInfo, realm.Name) output, err := object.RunAdminCommandNoMultisite(objContext, false, "realm", "pull", realmArg, urlArg, accessKeyArg, secretKeyArg) if err != nil { return waitForRequeueIfRealmNotReady, errors.Wrapf(err, "realm pull failed for reason: %v", output) } - logger.Debugf("realm pull for %q from endpoint %q succeeded", realm.Name, realm.Spec.Pull.Endpoint) + log.NamedDebug(nsName, logger, "realm pull for %q from endpoint %q succeeded", realm.Name, realm.Spec.Pull.Endpoint) return reconcile.Result{}, nil } func (r *ReconcileObjectRealm) createCephRealm(realm *cephv1.CephObjectRealm) (reconcile.Result, error) { + nsName := opcontroller.NsName(realm.Namespace, realm.Name) realmArg := fmt.Sprintf("--rgw-realm=%s", realm.Name) objContext := object.NewContext(r.context, r.clusterInfo, realm.Namespace) _, err := object.RunAdminCommandNoMultisite(objContext, true, "realm", "get", realmArg) if err != nil { if code, ok := exec.ExitStatus(err); ok && code == int(syscall.ENOENT) { - logger.Debugf("ceph realm %q not found, running `radosgw-admin realm create`", realm.Name) + log.NamedDebug(nsName, logger, "ceph realm not found, running `radosgw-admin realm create`") _, err := object.RunAdminCommandNoMultisite(objContext, false, "realm", "create", realmArg) if err != nil { return reconcile.Result{}, errors.Wrapf(err, "failed to create ceph realm %s", realm.Name) } - logger.Debugf("created ceph realm %q", realm.Name) + log.NamedDebug(nsName, logger, "created ceph realm %q", realm.Name) } else { return reconcile.Result{}, errors.Wrapf(err, "radosgw-admin realm get failed with code %d", code) } @@ -271,8 +274,9 @@ func (r *ReconcileObjectRealm) createCephRealm(realm *cephv1.CephObjectRealm) (r } func (r *ReconcileObjectRealm) createRealmKeys(realm *cephv1.CephObjectRealm) (reconcile.Result, error) { + nsName := opcontroller.NsName(realm.Namespace, realm.Name) realmName := types.NamespacedName{Namespace: realm.Namespace, Name: realm.Name} - logger.Debugf("generating access and secret keys for new realm %q", realmName.String()) + log.NamedDebug(nsName, logger, "generating access and secret keys for new realm") secretName := realm.Name + "-keys" // Check if the secret exists first, and check that it has the access information needed. @@ -300,7 +304,7 @@ func (r *ReconcileObjectRealm) createRealmKeys(realm *cephv1.CephObjectRealm) (r } secretKey = base64.StdEncoding.EncodeToString([]byte(secretKey)) - logger.Debugf("creating secrets for new realm %q", realm.Name) + log.NamedDebug(nsName, logger, "creating secrets for new realm %q", realm.Name) secrets := map[string][]byte{ object.AccessKeyName: []byte(accessKey), @@ -323,7 +327,7 @@ func (r *ReconcileObjectRealm) createRealmKeys(realm *cephv1.CephObjectRealm) (r if _, err = r.context.Clientset.CoreV1().Secrets(realm.Namespace).Create(r.opManagerContext, secret, metav1.CreateOptions{}); err != nil { return reconcile.Result{}, errors.Wrap(err, "failed to save rgw secrets") } - logger.Infof("secret keys have been created for realm %q in secret %q", realm.Name, secret.Name) + log.NamedInfo(nsName, logger, "secret keys have been created for realm %q in secret %q", realm.Name, secret.Name) return reconcile.Result{}, nil } @@ -349,10 +353,10 @@ func (r *ReconcileObjectRealm) updateStatus(observedGeneration int64, name types objectRealm := &cephv1.CephObjectRealm{} if err := r.client.Get(r.opManagerContext, name, objectRealm); err != nil { if kerrors.IsNotFound(err) { - logger.Debugf("CephObjectRealm %q resource not found. Ignoring since object must be deleted", name) + log.NamedDebug(name, logger, "CephObjectRealm resource not found. Ignoring since object must be deleted") return } - logger.Warningf("failed to retrieve object realm %q to update status to %q. %v", name, status, err) + log.NamedWarning(name, logger, "failed to retrieve object realm to update status to %q. %v", status, err) return } if objectRealm.Status == nil { @@ -364,8 +368,8 @@ func (r *ReconcileObjectRealm) updateStatus(observedGeneration int64, name types objectRealm.Status.ObservedGeneration = observedGeneration } if err := reporting.UpdateStatus(r.client, objectRealm); err != nil { - logger.Errorf("failed to set object realm %q status to %q. %v", name, status, err) + log.NamedError(name, logger, "failed to set object realm status to %q. %v", status, err) return } - logger.Debugf("object realm %q status updated to %q", name, status) + log.NamedDebug(name, logger, "object realm status updated to %q", status) } diff --git a/pkg/operator/ceph/object/rgw.go b/pkg/operator/ceph/object/rgw.go index a57f3ded1..25d005650 100644 --- a/pkg/operator/ceph/object/rgw.go +++ b/pkg/operator/ceph/object/rgw.go @@ -38,6 +38,7 @@ import ( "github.com/rook/rook/pkg/operator/ceph/pool" "github.com/rook/rook/pkg/operator/k8sutil" "github.com/rook/rook/pkg/util/exec" + "github.com/rook/rook/pkg/util/log" v1 "k8s.io/api/core/v1" kerrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -74,7 +75,8 @@ var updateDeploymentAndWait = mon.UpdateCephDeploymentAndWait var insecureSkipVerify = "insecureSkipVerify" func (c *clusterConfig) createOrUpdateStore(realmName, zoneGroupName, zoneName string, keystoneSecret *v1.Secret) error { - logger.Infof("creating object store %q in namespace %q", c.store.Name, c.store.Namespace) + nsName := controller.NsName(c.store.Namespace, c.store.Name) + log.NamedInfo(nsName, logger, "creating object store") if err := c.startRGWPods(realmName, zoneGroupName, zoneName, keystoneSecret); err != nil { return errors.Wrap(err, "failed to start rgw pods") @@ -82,7 +84,7 @@ func (c *clusterConfig) createOrUpdateStore(realmName, zoneGroupName, zoneName s objContext, err := NewMultisiteContext(c.context, c.clusterInfo, c.store) if err != nil { - logger.Warningf("failed to get object context for rgw %q. %v", c.store.Name, err) + log.NamedWarning(nsName, logger, "failed to get object context for rgw. %v", err) return nil } @@ -90,19 +92,21 @@ func (c *clusterConfig) createOrUpdateStore(realmName, zoneGroupName, zoneName s if !c.store.Spec.IsRGWDashboardEnabled() { disableRGWDashboard(objContext) } else if err = enableRGWDashboard(objContext); err != nil { - logger.Warningf("failed to enable dashboard for rgw. %v", err) + log.NamedWarning(nsName, logger, "failed to enable dashboard for rgw. %v", err) } } - logger.Infof("created object store %q in namespace %q", c.store.Name, c.store.Namespace) + log.NamedInfo(nsName, logger, "created object store") return nil } func (c *clusterConfig) startRGWPods(realmName, zoneGroupName, zoneName string, keystoneSecret *v1.Secret) error { + nsName := controller.NsName(c.store.Namespace, c.store.Name) + // backward compatibility, triggered during updates if c.store.Spec.Gateway.Instances < 1 { // Set the minimum of at least one instance - logger.Warning("spec.gateway.instances must be set to at least 1") + log.NamedWarning(nsName, logger, "spec.gateway.instances must be set to at least 1") c.store.Spec.Gateway.Instances = 1 } @@ -112,7 +116,7 @@ func (c *clusterConfig) startRGWPods(realmName, zoneGroupName, zoneName string, } if rgwsToSkipReconcile.Has(c.store.Name) { - logger.Warningf("skipping reconcile of rgw deployment %q with label %q", c.store.Name, cephv1.SkipReconcileLabelKey) + log.NamedWarning(nsName, logger, "skipping reconcile of rgw deployment with label %q", cephv1.SkipReconcileLabelKey) return nil } @@ -152,7 +156,7 @@ func (c *clusterConfig) startRGWPods(realmName, zoneGroupName, zoneName string, // Which means that we would only set the flag on newly created CephObjectStore CR // Unfortunately, on upgrade we would not set the flags which is not ideal for old clusters where we were no setting those flags // The KV supports setting those flags even if the RGW is running - logger.Info("setting rgw config flags") + log.NamedInfo(nsName, logger, "setting rgw config flags") err = c.setFlagsMonConfigStore(rgwConfig) if err != nil { // Getting EPERM typically happens when the flag may not be modified at runtime @@ -168,7 +172,7 @@ func (c *clusterConfig) startRGWPods(realmName, zoneGroupName, zoneName string, if err != nil { return errors.Wrap(err, "failed to create rgw deployment") } - logger.Infof("object store %q deployment %q created", c.store.Name, deployment.Name) + log.NamedInfo(nsName, logger, "object store %q deployment %q created", c.store.Name, deployment.Name) // Set owner ref to cephObjectStore object err = c.ownerInfo.SetControllerReference(deployment) @@ -190,7 +194,7 @@ func (c *clusterConfig) startRGWPods(realmName, zoneGroupName, zoneName string, if !kerrors.IsAlreadyExists(createErr) { return errors.Wrap(createErr, "failed to create rgw deployment") } - logger.Infof("object store %q deployment %q already exists. updating if needed", c.store.Name, deployment.Name) + log.NamedInfo(nsName, logger, "object store %q deployment %q already exists. updating if needed", c.store.Name, deployment.Name) if err := updateDeploymentAndWait(c.context, c.clusterInfo, deployment, config.RgwType, daemonLetterID, c.clusterSpec.SkipUpgradeChecks, c.clusterSpec.ContinueUpgradeAfterChecksEvenIfNotHealthy); err != nil { return errors.Wrapf(err, "failed to update object store %q deployment %q", c.store.Name, deployment.Name) } @@ -205,18 +209,18 @@ func (c *clusterConfig) startRGWPods(realmName, zoneGroupName, zoneName string, // scale down scenario deps, err := k8sutil.GetDeployments(c.clusterInfo.Context, c.context.Clientset, c.store.Namespace, c.storeLabelSelector()) if err != nil { - logger.Warningf("could not get deployments for object store %q (matching label selector %q). %v", c.store.Name, c.storeLabelSelector(), err) + log.NamedWarning(nsName, logger, "could not get deployments for object store %q (matching label selector %q). %v", c.store.Name, c.storeLabelSelector(), err) } currentRgwInstances := int(len(deps.Items)) if currentRgwInstances > desiredRgwInstances { - logger.Infof("found more rgw deployments %d than desired %d in object store %q, scaling down", currentRgwInstances, c.store.Spec.Gateway.Instances, c.store.Name) + log.NamedInfo(nsName, logger, "found more rgw deployments %d than desired %d in object store %q, scaling down", currentRgwInstances, c.store.Spec.Gateway.Instances, c.store.Name) diffCount := currentRgwInstances - desiredRgwInstances for i := 0; i < diffCount; { depIDToRemove := currentRgwInstances - 1 depNameToRemove := fmt.Sprintf("%s-%s-%s", AppName, c.store.Name, k8sutil.IndexToName(depIDToRemove)) if err := k8sutil.DeleteDeployment(c.clusterInfo.Context, c.context.Clientset, c.store.Namespace, depNameToRemove); err != nil { - logger.Warningf("error during deletion of deployment %q resource. %v", depNameToRemove, err) + log.NamedWarning(nsName, logger, "error during deletion of deployment %q resource. %v", depNameToRemove, err) } currentRgwInstances = currentRgwInstances - 1 i++ @@ -225,23 +229,23 @@ func (c *clusterConfig) startRGWPods(realmName, zoneGroupName, zoneName string, secretToRemove := c.generateSecretName(k8sutil.IndexToName(depIDToRemove)) err = c.context.Clientset.CoreV1().Secrets(c.store.Namespace).Delete(c.clusterInfo.Context, secretToRemove, metav1.DeleteOptions{}) if err != nil && !kerrors.IsNotFound(err) { - logger.Warningf("failed to delete rgw secret %q. %v", secretToRemove, err) + log.NamedWarning(nsName, logger, "failed to delete rgw secret %q. %v", secretToRemove, err) } err := c.deleteRgwCephObjects(depNameToRemove) if err != nil { - logger.Warningf("%v", err) + log.NamedWarning(nsName, logger, "%v", err) } } // verify scale down was successful deps, err = k8sutil.GetDeployments(c.clusterInfo.Context, c.context.Clientset, c.store.Namespace, c.storeLabelSelector()) if err != nil { - logger.Warningf("could not get deployments for object store %q (matching label selector %q). %v", c.store.Name, c.storeLabelSelector(), err) + log.NamedWarning(nsName, logger, "could not get deployments for object store %q (matching label selector %q). %v", c.store.Name, c.storeLabelSelector(), err) } currentRgwInstances = len(deps.Items) if currentRgwInstances == desiredRgwInstances { - logger.Infof("successfully scaled down rgw deployments to %d in object store %q", desiredRgwInstances, c.store.Name) + log.NamedInfo(nsName, logger, "successfully scaled down rgw deployments to %d in object store %q", desiredRgwInstances, c.store.Name) } } @@ -251,7 +255,8 @@ func (c *clusterConfig) startRGWPods(realmName, zoneGroupName, zoneName string, // Delete the object store. // WARNING: This is a very destructive action that deletes all metadata and data pools. func (c *clusterConfig) deleteStore() { - logger.Infof("deleting object store %q from namespace %q", c.store.Name, c.store.Namespace) + nsName := controller.NsName(c.store.Namespace, c.store.Name) + log.NamedInfo(nsName, logger, "deleting object store") if !c.store.Spec.IsExternal() { // Delete rgw CephX keys and configuration in centralized mon database @@ -261,14 +266,14 @@ func (c *clusterConfig) deleteStore() { err := c.deleteRgwCephObjects(depNameToRemove) if err != nil { - logger.Errorf("failed to delete rgw CephX keys and configuration. Error: %v", err) + log.NamedError(nsName, logger, "failed to delete rgw CephX keys and configuration. Error: %v", err) } } // Delete the realm and pools objContext, err := NewMultisiteContext(c.context, c.clusterInfo, c.store) if err != nil { - logger.Errorf("failed to set multisite on object store %q. Error: %v", c.store.Name, err) + log.NamedError(nsName, logger, "failed to set multisite on object store %q. Error: %v", c.store.Name, err) } objContext.Endpoint = c.store.Status.Info["endpoint"] @@ -277,15 +282,16 @@ func (c *clusterConfig) deleteStore() { err = deleteRealmAndPools(objContext, c.store.Spec) if err != nil { - logger.Errorf("failed to delete the realm and pools. Error: %v", err) + log.NamedError(nsName, logger, "failed to delete the realm and pools. Error: %v", err) } } - logger.Infof("done deleting object store %q from namespace %q", c.store.Name, c.store.Namespace) + log.NamedInfo(nsName, logger, "done deleting object store") } func (c *clusterConfig) deleteRgwCephObjects(depNameToRemove string) error { - logger.Infof("deleting rgw CephX key and configuration in centralized mon database for %q", depNameToRemove) + nsName := controller.NsName(c.store.Namespace, c.store.Name) + log.NamedInfo(nsName, logger, "deleting rgw CephX key and configuration in centralized mon database for %q", depNameToRemove) // Delete configuration in centralized mon database err := c.deleteFlagsMonConfigStore(depNameToRemove) @@ -298,7 +304,7 @@ func (c *clusterConfig) deleteRgwCephObjects(depNameToRemove string) error { return err } - logger.Infof("completed deleting rgw CephX key and configuration in centralized mon database for %q", depNameToRemove) + log.NamedInfo(nsName, logger, "completed deleting rgw CephX key and configuration in centralized mon database for %q", depNameToRemove) return nil } @@ -348,12 +354,13 @@ func GetStableDomainName(s *cephv1.CephObjectStore) string { } func getAllDomainNames(s *cephv1.CephObjectStore) []string { + nsName := controller.NsName(s.Namespace, s.Name) if s.Spec.IsExternal() { domains := []string{} for _, e := range s.Spec.Gateway.ExternalRgwEndpoints { domains = append(domains, e.String()) } - logger.Debugf("domains: +%v", domains) + log.NamedDebug(nsName, logger, "domains: +%v", domains) return domains } @@ -446,7 +453,7 @@ func GetTlsCaCert(objContext *Context, objectStoreSpec *cephv1.ObjectStoreSpec) var genObjectStoreHTTPClientFunc = genObjectStoreHTTPClient func genObjectStoreHTTPClient(objContext *Context, spec *cephv1.ObjectStoreSpec) (*http.Client, []byte, error) { - nsName := fmt.Sprintf("%s/%s", objContext.clusterInfo.Namespace, objContext.Name) + nsName := controller.NsName(objContext.clusterInfo.Namespace, objContext.Name) c := &http.Client{} tlsCert := []byte{} if spec.IsTLSEnabled() { diff --git a/pkg/operator/ceph/object/shared_pools.go b/pkg/operator/ceph/object/shared_pools.go index 8913c3c53..a191b9ebf 100644 --- a/pkg/operator/ceph/object/shared_pools.go +++ b/pkg/operator/ceph/object/shared_pools.go @@ -9,6 +9,7 @@ import ( "github.com/pkg/errors" cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1" + "github.com/rook/rook/pkg/util/log" kerrors "k8s.io/apimachinery/pkg/api/errors" ) @@ -413,7 +414,7 @@ func getZoneJSON(objContext *Context) (map[string]interface{}, error) { } zoneArg := fmt.Sprintf("--rgw-zone=%s", objContext.Zone) - logger.Debugf("get zone: rgw-realm=%s, rgw-zone=%s", objContext.Realm, objContext.Zone) + log.NamedDebug(objContext.NsName(), logger, "get zone: rgw-realm=%s, rgw-zone=%s", objContext.Realm, objContext.Zone) jsonStr, err := RunAdminCommandNoMultisite(objContext, true, "zone", "get", realmArg, zoneArg) if err != nil { @@ -424,7 +425,7 @@ func getZoneJSON(objContext *Context) (map[string]interface{}, error) { } return nil, errors.Wrap(err, "failed to get rgw zone group") } - logger.Debugf("get zone success: rgw-realm=%s, rgw-zone=%s, res=%s", objContext.Realm, objContext.Zone, jsonStr) + log.NamedDebug(objContext.NsName(), logger, "get zone success: rgw-realm=%s, rgw-zone=%s, res=%s", objContext.Realm, objContext.Zone, jsonStr) res := map[string]interface{}{} return res, json.Unmarshal([]byte(jsonStr), &res) } @@ -445,7 +446,7 @@ func getZoneGroupJSON(objContext *Context) (map[string]interface{}, error) { } zoneGroupArg := fmt.Sprintf("--rgw-zonegroup=%s", objContext.ZoneGroup) - logger.Debugf("get zonegroup: rgw-realm=%s, rgw-zone=%s, rgw-zonegroup=%s", objContext.Realm, objContext.Zone, objContext.ZoneGroup) + log.NamedDebug(objContext.NsName(), logger, "get zonegroup: rgw-realm=%s, rgw-zone=%s, rgw-zonegroup=%s", objContext.Realm, objContext.Zone, objContext.ZoneGroup) jsonStr, err := RunAdminCommandNoMultisite(objContext, true, "zonegroup", "get", realmArg, zoneGroupArg, zoneArg) if err != nil { // This handles the case where the pod we use to exec command (act as a proxy) is not found/ready yet @@ -455,7 +456,7 @@ func getZoneGroupJSON(objContext *Context) (map[string]interface{}, error) { } return nil, errors.Wrap(err, "failed to get rgw zone group") } - logger.Debugf("get zonegroup success: rgw-realm=%s, rgw-zone=%s, rgw-zonegroup=%s, res=%s", objContext.Realm, objContext.Zone, objContext.ZoneGroup, jsonStr) + log.NamedDebug(objContext.NsName(), logger, "get zonegroup success: rgw-realm=%s, rgw-zone=%s, rgw-zonegroup=%s, res=%s", objContext.Realm, objContext.Zone, objContext.ZoneGroup, jsonStr) res := map[string]interface{}{} return res, json.Unmarshal([]byte(jsonStr), &res) } @@ -486,7 +487,7 @@ func updateZoneJSON(objContext *Context, zone map[string]interface{}) (map[strin if err != nil { return nil, errors.Wrap(err, "failed to set zone config") } - logger.Debugf("update zone: %s json config updated value from %q to %q", objContext.Zone, string(configBytes), string(updatedBytes)) + log.NamedDebug(objContext.NsName(), logger, "update zone: %s json config updated value from %q to %q", objContext.Zone, string(configBytes), string(updatedBytes)) updated := map[string]interface{}{} err = json.Unmarshal([]byte(updatedBytes), &updated) return updated, err diff --git a/pkg/operator/ceph/object/shared_pools_test.go b/pkg/operator/ceph/object/shared_pools_test.go index 81f26b799..3d1fc8a0d 100644 --- a/pkg/operator/ceph/object/shared_pools_test.go +++ b/pkg/operator/ceph/object/shared_pools_test.go @@ -6,6 +6,7 @@ import ( "testing" cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1" + cephclient "github.com/rook/rook/pkg/daemon/ceph/client" "github.com/stretchr/testify/assert" ) @@ -1144,7 +1145,8 @@ func Test_adjustZoneDefaultPools(t *testing.T) { srcZone := map[string]interface{}{} err := json.Unmarshal([]byte(tt.args.beforeJSON), &srcZone) assert.NoError(t, err) - changedZone, err := adjustZoneDefaultPools(srcZone, tt.args.spec) + objContext := &Context{clusterInfo: &cephclient.ClusterInfo{Namespace: "test"}} + changedZone, err := adjustZoneDefaultPools(objContext, srcZone, tt.args.spec) // check that source was not modified orig := map[string]interface{}{} diff --git a/pkg/operator/ceph/object/spec.go b/pkg/operator/ceph/object/spec.go index df73e52ed..e681b55c9 100644 --- a/pkg/operator/ceph/object/spec.go +++ b/pkg/operator/ceph/object/spec.go @@ -35,6 +35,7 @@ import ( cephconfig "github.com/rook/rook/pkg/operator/ceph/config" "github.com/rook/rook/pkg/operator/ceph/controller" "github.com/rook/rook/pkg/operator/k8sutil" + "github.com/rook/rook/pkg/util/log" apps "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" discoveryv1 "k8s.io/api/discovery/v1" @@ -386,6 +387,8 @@ func (c *clusterConfig) makeChownInitContainer(rgwConfig *rgwConfig) v1.Containe } func (c *clusterConfig) makeDaemonContainer(rgwConfig *rgwConfig) (v1.Container, error) { + nsName := controller.NsName(c.store.Namespace, c.store.Name) + // start the rgw daemon in the foreground startupProbe, err := c.defaultStartupProbe() if err != nil { @@ -441,11 +444,11 @@ func (c *clusterConfig) makeDaemonContainer(rgwConfig *rgwConfig) (v1.Container, } kmsEnabled, err := c.CheckRGWKMS() if err != nil { - logger.Errorf("failed to enable SSE-KMS. %v", err) + log.NamedError(nsName, logger, "failed to enable SSE-KMS. %v", err) return v1.Container{}, err } if kmsEnabled { - logger.Debugf("enabliing SSE-KMS. %v", c.store.Spec.Security.KeyManagementService) + log.NamedDebug(nsName, logger, "enabliing SSE-KMS. %v", c.store.Spec.Security.KeyManagementService) container.Args = append(container.Args, c.sseKMSDefaultOptions(kmsEnabled)...) if c.store.Spec.Security.KeyManagementService.IsTokenAuthEnabled() { container.Args = append(container.Args, c.sseKMSVaultTokenOptions(kmsEnabled)...) @@ -488,7 +491,7 @@ func (c *clusterConfig) makeDaemonContainer(rgwConfig *rgwConfig) (v1.Container, return v1.Container{}, err } if s3EncryptionEnabled { - logger.Debugf("enabliing SSE-S3. %v", c.store.Spec.Security.ServerSideEncryptionS3) + log.NamedDebug(nsName, logger, "enabliing SSE-S3. %v", c.store.Spec.Security.ServerSideEncryptionS3) container.Args = append(container.Args, c.sseS3DefaultOptions(s3EncryptionEnabled)...) if c.store.Spec.Security.ServerSideEncryptionS3.IsTokenAuthEnabled() { @@ -523,7 +526,7 @@ func (c *clusterConfig) makeDaemonContainer(rgwConfig *rgwConfig) (v1.Container, isCrushLocationSet = true } } else { - logger.Warning("can't set RGW read affinity for ceph version below v20 (tentacle)") + log.NamedWarning(nsName, logger, "can't set RGW read affinity for ceph version below v20 (tentacle)") } } @@ -566,9 +569,10 @@ func noLivenessProbe() *v1.Probe { } func (c *clusterConfig) defaultReadinessProbe() (*v1.Probe, error) { + nsName := controller.NsName(c.store.Namespace, c.store.Name) probePath, disableProbe := getRGWProbePath(c.store.Spec.Protocols) if disableProbe { - logger.Infof("disabling startup probe for %q store", c.store.Name) + log.NamedInfo(nsName, logger, "disabling startup probe for %q store", c.store.Name) return nil, nil } proto, port := c.endpointInfo() @@ -635,9 +639,11 @@ func getRGWProbePath(protocolSpec cephv1.ProtocolSpec) (path string, disable boo } func (c *clusterConfig) defaultStartupProbe() (*v1.Probe, error) { + nsName := controller.NsName(c.store.Namespace, c.store.Name) + probePath, disableProbe := getRGWProbePath(c.store.Spec.Protocols) if disableProbe { - logger.Infof("disabling startup probe for %q store", c.store.Name) + log.NamedInfo(nsName, logger, "disabling startup probe for %q store", c.store.Name) return nil, nil } proto, port := c.endpointInfo() @@ -673,6 +679,8 @@ func (c *clusterConfig) defaultStartupProbe() (*v1.Probe, error) { } func (c *clusterConfig) endpointInfo() (ProtocolType, *intstr.IntOrString) { + nsName := controller.NsName(c.store.Namespace, c.store.Name) + // The port the liveness probe needs to probe // Assume we run on SDN by default proto := HTTPProtocol @@ -689,7 +697,7 @@ func (c *clusterConfig) endpointInfo() (ProtocolType, *intstr.IntOrString) { port = intstr.FromInt(int(c.store.Spec.Gateway.SecurePort)) } - logger.Debugf("rgw %q probe port is %v", c.store.Namespace+"/"+c.store.Name, port) + log.NamedDebug(nsName, logger, "rgw %q probe port is %v", c.store.Namespace+"/"+c.store.Name, port) return proto, &port } @@ -761,7 +769,8 @@ func (c *clusterConfig) generateEndpoint(cephObjectStore *cephv1.CephObjectStore } func (c *clusterConfig) reconcileExternalEndpoint(cephObjectStore *cephv1.CephObjectStore) error { - logger.Info("reconciling external object store service") + nsName := controller.NsName(c.store.Namespace, c.store.Name) + log.NamedInfo(nsName, logger, "reconciling external object store service") endpoint := c.generateEndpoint(cephObjectStore) // Set owner ref to the parent object @@ -779,6 +788,7 @@ func (c *clusterConfig) reconcileExternalEndpoint(cephObjectStore *cephv1.CephOb } func (c *clusterConfig) reconcileService(store *cephv1.CephObjectStore) error { + nsName := controller.NsName(c.store.Namespace, c.store.Name) service := c.generateService(store) // Set owner ref to the parent object err := c.ownerInfo.SetControllerReference(service) @@ -791,7 +801,7 @@ func (c *clusterConfig) reconcileService(store *cephv1.CephObjectStore) error { return errors.Wrapf(err, "failed to create or update object store %q service", store.Name) } - logger.Infof("ceph object store gateway service running at %s", svc.Spec.ClusterIP) + log.NamedInfo(nsName, logger, "ceph object store gateway service running at %s", svc.Spec.ClusterIP) return nil } @@ -811,6 +821,8 @@ func (c *clusterConfig) vaultPrefixRGW() string { } func (c *clusterConfig) CheckRGWKMS() (bool, error) { + nsName := controller.NsName(c.store.Namespace, c.store.Name) + if c.store.Spec.Security != nil && c.store.Spec.Security.KeyManagementService.IsEnabled() { err := kms.ValidateConnectionDetails(c.clusterInfo.Context, c.context, &c.store.Spec.Security.KeyManagementService, c.store.Namespace) if err != nil { @@ -828,7 +840,7 @@ func (c *clusterConfig) CheckRGWKMS() (bool, error) { } } else { // If VAUL_BACKEND is not specified let's assume it's v2 - logger.Warningf("%s is not set, assuming the only supported version 2", vault.VaultBackendKey) + log.NamedWarning(nsName, logger, "%s is not set, assuming the only supported version 2", vault.VaultBackendKey) c.store.Spec.Security.KeyManagementService.ConnectionDetails[vault.VaultBackendKey] = "v2" } return true, nil @@ -1066,11 +1078,13 @@ func (c *clusterConfig) sseS3VaultTLSOptions(setOptions bool) []string { // Otherwise set rgw config parameter to mon database in ./config.go -> setFlagsMonConfigStore() // CLI flags override values from mon db: see ceph config docs: https://docs.ceph.com/en/latest/rados/configuration/ceph-conf/#config-sources func buildRGWConfigFlags(objectStore *cephv1.CephObjectStore) []string { + nsName := controller.NsName(objectStore.Namespace, objectStore.Name) + var res []string // todo: move all flags here if enableAPIs := buildRGWEnableAPIsConfigVal(objectStore.Spec.Protocols); len(enableAPIs) != 0 { res = append(res, cephconfig.NewFlag("rgw_enable_apis", strings.Join(enableAPIs, ","))) - logger.Debugf("Enabling APIs for RGW instance %q: %s", objectStore.Name, enableAPIs) + log.NamedDebug(nsName, logger, "Enabling APIs for RGW instance %q: %s", objectStore.Name, enableAPIs) } return res } diff --git a/pkg/operator/ceph/object/status.go b/pkg/operator/ceph/object/status.go index 78236fa22..5736190f2 100644 --- a/pkg/operator/ceph/object/status.go +++ b/pkg/operator/ceph/object/status.go @@ -18,12 +18,13 @@ package object import ( "context" - "fmt" "github.com/pkg/errors" cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1" + "github.com/rook/rook/pkg/operator/ceph/controller" "github.com/rook/rook/pkg/operator/ceph/reporting" "github.com/rook/rook/pkg/operator/k8sutil" + "github.com/rook/rook/pkg/util/log" kerrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/types" @@ -52,7 +53,7 @@ func updateStatus(ctx context.Context, observedGeneration int64, replicaCount in objectStore := &cephv1.CephObjectStore{} if err := client.Get(ctx, namespacedName, objectStore); err != nil { if kerrors.IsNotFound(err) { - logger.Debug("CephObjectStore resource not found. Ignoring since object must be deleted.") + log.NamedDebug(namespacedName, logger, "CephObjectStore resource not found. Ignoring since object must be deleted.") return nil } return errors.Wrapf(err, "failed to retrieve object store %q to update status to %q", namespacedName.String(), status) @@ -67,7 +68,7 @@ func updateStatus(ctx context.Context, observedGeneration int64, replicaCount in } if objectStore.Status.Phase == cephv1.ConditionDeleting { - logger.Debugf("object store %q status not updated to %q because it is deleting", namespacedName.String(), status) + log.NamedDebug(namespacedName, logger, "object store status not updated to %q because it is deleting", status) return nil // do not transition to other statuses once deletion begins } @@ -104,19 +105,19 @@ func updateStatus(ctx context.Context, observedGeneration int64, replicaCount in return err } - logger.Debugf("object store %q status updated to %q", namespacedName.String(), status) + log.NamedDebug(namespacedName, logger, "object store status updated to %q", status) return nil } func buildStatusInfo(cephObjectStore *cephv1.CephObjectStore) map[string]string { - nsName := fmt.Sprintf("%s/%s", cephObjectStore.Namespace, cephObjectStore.Name) + nsName := controller.NsName(cephObjectStore.Namespace, cephObjectStore.Name) m := make(map[string]string) advertiseEndpoint, err := cephObjectStore.GetAdvertiseEndpointUrl() if err != nil { // lots of validation happens before this point, so this should be nearly impossible - logger.Errorf("failed to get advertise endpoint for CephObjectStore %q to record on status; continuing without this. %v", nsName, err) + log.NamedError(nsName, logger, "failed to get advertise endpoint for CephObjectStore %q to record on status; continuing without this. %v", nsName, err) } if cephObjectStore.AdvertiseEndpointIsSet() { diff --git a/pkg/operator/ceph/object/topic/controller.go b/pkg/operator/ceph/object/topic/controller.go index bba983c90..8a744dad7 100644 --- a/pkg/operator/ceph/object/topic/controller.go +++ b/pkg/operator/ceph/object/topic/controller.go @@ -30,6 +30,7 @@ import ( opcontroller "github.com/rook/rook/pkg/operator/ceph/controller" "github.com/rook/rook/pkg/operator/ceph/reporting" "github.com/rook/rook/pkg/operator/k8sutil" + "github.com/rook/rook/pkg/util/log" corev1 "k8s.io/api/core/v1" kerrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/fields" @@ -193,7 +194,7 @@ func (r *ReconcileBucketTopic) Reconcile(context context.Context, request reconc reconcileResponse, err := r.reconcile(request) if err != nil { r.updateStatus(k8sutil.ObservedGenerationNotAvailable, request.NamespacedName, k8sutil.ReconcileFailedStatus, nil, nil) - logger.Errorf("failed to reconcile %v", err) + log.NamedError(request.NamespacedName, logger, "failed to reconcile %v", err) } return reconcileResponse, err @@ -205,7 +206,7 @@ func (r *ReconcileBucketTopic) reconcile(request reconcile.Request) (reconcile.R err := r.client.Get(r.opManagerContext, request.NamespacedName, cephBucketTopic) if err != nil { if kerrors.IsNotFound(err) { - logger.Debugf("CephBucketTopic %q not found. Ignoring since resource must be deleted", request.NamespacedName) + log.NamedDebug(request.NamespacedName, logger, "CephBucketTopic not found. Ignoring since resource must be deleted") return reconcile.Result{}, nil } // Error reading the object - requeue the request. @@ -222,7 +223,7 @@ func (r *ReconcileBucketTopic) reconcile(request reconcile.Request) (reconcile.R return opcontroller.ImmediateRetryResult, errors.Wrapf(err, "failed to add finalizer to CephBucketTopic %q", request.NamespacedName) } if generationUpdated { - logger.Infof("reconciling the object bucket topic %q after adding finalizer", cephBucketTopic.Name) + log.NamedInfo(request.NamespacedName, logger, "reconciling the object bucket topic after adding finalizer") return reconcile.Result{}, nil } @@ -244,7 +245,7 @@ func (r *ReconcileBucketTopic) reconcile(request reconcile.Request) (reconcile.R // Return and do not requeue. Successful deletion. return reconcile.Result{}, nil } - logger.Debugf("Ceph cluster not yet present, cannot create CephBucketTopic %q", request.NamespacedName) + log.NamedDebug(request.NamespacedName, logger, "Ceph cluster not yet present, cannot create CephBucketTopic") return reconcileResponse, nil } r.clusterSpec = &cephCluster.Spec @@ -257,7 +258,7 @@ func (r *ReconcileBucketTopic) reconcile(request reconcile.Request) (reconcile.R // DELETE: the CR was deleted if !cephBucketTopic.GetDeletionTimestamp().IsZero() { - logger.Debugf("deleting CephBucketTopic: %q", request.NamespacedName) + log.NamedDebug(request.NamespacedName, logger, "deleting CephBucketTopic") err = r.deleteCephBucketTopic(cephBucketTopic) if err != nil { return reconcile.Result{}, errors.Wrapf(err, "failed to delete CephBucketTopic %q", request.NamespacedName) @@ -327,10 +328,10 @@ func (r *ReconcileBucketTopic) updateStatus(observedGeneration int64, nsName typ topic := &cephv1.CephBucketTopic{} if err := r.client.Get(r.opManagerContext, nsName, topic); err != nil { if kerrors.IsNotFound(err) { - logger.Debugf("CephBucketTopic %q not found. Ignoring since resource must be deleted", nsName) + log.NamedDebug(nsName, logger, "CephBucketTopic %q not found. Ignoring since resource must be deleted", nsName) return } - logger.Warningf("failed to retrieve CephBucketTopic %q to update status to %q. error %v", nsName, status, err) + log.NamedWarning(nsName, logger, "failed to retrieve CephBucketTopic %q to update status to %q. error %v", nsName, status, err) return } if topic.Status == nil { @@ -343,7 +344,7 @@ func (r *ReconcileBucketTopic) updateStatus(observedGeneration int64, nsName typ topic.Status.ObservedGeneration = observedGeneration } - logger.Debugf("updating CephBucketTopic %q .status.secrets to %+v.", nsName, referencedSecrets) + log.NamedDebug(nsName, logger, "updating CephBucketTopic %q .status.secrets to %+v.", nsName, referencedSecrets) if referencedSecrets != nil { secretsStatus := []cephv1.SecretReference{} @@ -369,8 +370,8 @@ func (r *ReconcileBucketTopic) updateStatus(observedGeneration int64, nsName typ } if err := reporting.UpdateStatus(r.client, topic); err != nil { - logger.Errorf("failed to set CephBucketTopic %q status to %q. error %v", nsName, status, err) + log.NamedError(nsName, logger, "failed to set CephBucketTopic %q status to %q. error %v", nsName, status, err) return } - logger.Debugf("CephbucketTopic %q status updated to %q", nsName, status) + log.NamedDebug(nsName, logger, "CephbucketTopic %q status updated to %q", nsName, status) } diff --git a/pkg/operator/ceph/object/topic/provisioner.go b/pkg/operator/ceph/object/topic/provisioner.go index 510ba489a..b4d7c8b4e 100644 --- a/pkg/operator/ceph/object/topic/provisioner.go +++ b/pkg/operator/ceph/object/topic/provisioner.go @@ -20,6 +20,7 @@ package topic import ( "context" "crypto/hmac" + //nolint:gosec // sha1 is needed for v2 signatures "crypto/sha1" "encoding/base64" @@ -42,7 +43,9 @@ import ( cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1" "github.com/rook/rook/pkg/clusterd" cephclient "github.com/rook/rook/pkg/daemon/ceph/client" + "github.com/rook/rook/pkg/operator/ceph/controller" "github.com/rook/rook/pkg/operator/ceph/object" + "github.com/rook/rook/pkg/util/log" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" @@ -109,7 +112,7 @@ func createSNSClient(p provisioner, objectStoreName types.NamespacedName) (*sns. return nil, errors.Wrapf(err, "failed to create a new session for CephBucketTopic provisioning with %q", objectStoreName) } - logger.Debugf("session created. endpoint %q secure %v", + log.NamedDebug(objectStoreName, logger, "session created. endpoint %q secure %v", *sess.Config.Endpoint, tlsEnabled, ) @@ -124,7 +127,7 @@ func createSNSClient(p provisioner, objectStoreName types.NamespacedName) (*sns. Fn: func(req *awsrequest.Request) { credentials, err := req.Config.Credentials.Get() if err != nil { - logger.Debugf("%s failed to get credentials: %v", customSignername, err) + log.NamedDebug(objectStoreName, logger, "%s failed to get credentials: %v", customSignername, err) return } date := req.Time.UTC().Format(time.RFC1123Z) @@ -146,7 +149,7 @@ func createSNSClient(p provisioner, objectStoreName types.NamespacedName) (*sns. func createTopicAttributes(p provisioner, topic *cephv1.CephBucketTopic) (map[string]*string, *map[types.UID]*corev1.Secret, error) { attr := make(map[string]*string) - nsName := types.NamespacedName{Name: topic.Name, Namespace: topic.Namespace} + nsName := controller.NsName(topic.Namespace, topic.Name) // Currently, referencedSecrets is only used by the kafka endpoint but it // could be used by other endpoints in the future. referencedSecrets := make(map[types.UID]*corev1.Secret) @@ -157,7 +160,7 @@ func createTopicAttributes(p provisioner, topic *cephv1.CephBucketTopic) (map[st var verifySSL string var useSSL string if topic.Spec.Endpoint.AMQP != nil { - logger.Infof("creating CephBucketTopic %q with endpoint %q", nsName, topic.Spec.Endpoint.AMQP.URI) + log.NamedInfo(nsName, logger, "creating CephBucketTopic %q with endpoint %q", nsName, topic.Spec.Endpoint.AMQP.URI) attr["push-endpoint"] = &topic.Spec.Endpoint.AMQP.URI attr["amqp-exchange"] = &topic.Spec.Endpoint.AMQP.Exchange attr["amqp-ack-level"] = &topic.Spec.Endpoint.AMQP.AckLevel @@ -165,7 +168,7 @@ func createTopicAttributes(p provisioner, topic *cephv1.CephBucketTopic) (map[st attr["verify-ssl"] = &verifySSL } if topic.Spec.Endpoint.HTTP != nil { - logger.Infof("creating CephBucketTopic %q with endpoint %q", nsName, topic.Spec.Endpoint.HTTP.URI) + log.NamedInfo(nsName, logger, "creating CephBucketTopic %q with endpoint %q", nsName, topic.Spec.Endpoint.HTTP.URI) attr["push-endpoint"] = &topic.Spec.Endpoint.HTTP.URI verifySSL = strconv.FormatBool(!topic.Spec.Endpoint.HTTP.DisableVerifySSL) attr["verify-ssl"] = &verifySSL @@ -194,7 +197,7 @@ func createTopicAttributes(p provisioner, topic *cephv1.CephBucketTopic) (map[st return nil, nil, errors.Wrapf(err, "failed to get secret value from CephBucketTopic %q .spec.endpoint.kafka.userSecretRef %q", nsName, kafka.UserSecretRef) } - logger.Debugf("CephBucketTopic %q references secret %q", nsName, client.ObjectKeyFromObject(secret)) + log.NamedDebug(nsName, logger, "CephBucketTopic %q references secret %q", nsName, client.ObjectKeyFromObject(secret)) referencedSecrets[secret.UID] = secret } if kafka.PasswordSecretRef != nil { @@ -203,7 +206,7 @@ func createTopicAttributes(p provisioner, topic *cephv1.CephBucketTopic) (map[st if err != nil { return nil, nil, errors.Wrapf(err, "failed to get secret value from CephBucketTopic %q .spec.endpoint.kafka.passwordSecretRef %q", nsName, kafka.PasswordSecretRef) } - logger.Debugf("CephBucketTopic %q references secret %q", nsName, client.ObjectKeyFromObject(secret)) + log.NamedDebug(nsName, logger, "CephBucketTopic %q references secret %q", nsName, client.ObjectKeyFromObject(secret)) referencedSecrets[secret.UID] = secret } @@ -211,7 +214,7 @@ func createTopicAttributes(p provisioner, topic *cephv1.CephBucketTopic) (map[st } // do not log passphrases, if set - logger.Infof("creating CephBucketTopic %q with endpoint %q", nsName, uri.Redacted()) + log.NamedInfo(nsName, logger, "creating CephBucketTopic %q with endpoint %q", nsName, uri.Redacted()) kafkaUri := uri.String() attr["push-endpoint"] = &kafkaUri @@ -230,7 +233,7 @@ func createTopicAttributes(p provisioner, topic *cephv1.CephBucketTopic) (map[st var createTopicFunc = createTopic func createTopic(p provisioner, topic *cephv1.CephBucketTopic) (*string, *map[types.UID]*corev1.Secret, error) { - nsName := types.NamespacedName{Name: topic.Name, Namespace: topic.Namespace} + nsName := controller.NsName(topic.Namespace, topic.Name) snsClient, err := createSNSClient(p, types.NamespacedName{Name: topic.Spec.ObjectStoreName, Namespace: topic.Spec.ObjectStoreNamespace}) if err != nil { @@ -248,7 +251,7 @@ func createTopic(p provisioner, topic *cephv1.CephBucketTopic) (*string, *map[ty return nil, nil, errors.Wrapf(err, "failed to provision CephBucketTopic %q", nsName) } - logger.Infof("CephBucketTopic %q created with ARN %q", nsName, *topicOutput.TopicArn) + log.NamedInfo(nsName, logger, "CephBucketTopic %q created with ARN %q", nsName, *topicOutput.TopicArn) return topicOutput.TopicArn, referencedSecrets, nil } @@ -257,11 +260,11 @@ func createTopic(p provisioner, topic *cephv1.CephBucketTopic) (*string, *map[ty var deleteTopicFunc = deleteTopic func deleteTopic(p provisioner, topic *cephv1.CephBucketTopic) error { - nsName := types.NamespacedName{Name: topic.Name, Namespace: topic.Namespace} - logger.Infof("deleting CephBucketTopic %q", nsName) + nsName := controller.NsName(topic.Namespace, topic.Name) + log.NamedInfo(nsName, logger, "deleting CephBucketTopic %q", nsName) if topic.Status.ARN == nil { - logger.Warningf("ignore CephBucketTopic deletion. topic %q was never successfully provisioned", nsName) + log.NamedWarning(nsName, logger, "ignore CephBucketTopic deletion. topic %q was never successfully provisioned", nsName) return nil } @@ -275,10 +278,10 @@ func deleteTopic(p provisioner, topic *cephv1.CephBucketTopic) error { if err.(awserr.Error).Code() != sns.ErrCodeNotFoundException { return errors.Wrapf(err, "failed to delete CephBucketTopic %q", nsName) } - logger.Warningf("ignore CephBucketTopic deletion. %q was already deleted", nsName) + log.NamedWarning(nsName, logger, "ignore CephBucketTopic deletion. %q was already deleted", nsName) } - logger.Infof("CephBucketTopic %q deleted", nsName) + log.NamedInfo(nsName, logger, "CephBucketTopic %q deleted", nsName) return nil } @@ -302,7 +305,7 @@ func GetProvisioned(cl client.Client, ctx context.Context, topicName types.Names if parsedTopicARN.Resource == "" { return nil, errors.Errorf("CephBucketTopic %q is missing a topic inside ARN %q", topicName, topicARN) } - logger.Debugf("CephBucketTopic %q found with valid ARN %q", topicName, topicARN) + log.NamedDebug(topicName, logger, "CephBucketTopic found with valid ARN %q", topicARN) return bucketTopic, nil } diff --git a/pkg/operator/ceph/object/user.go b/pkg/operator/ceph/object/user.go index f3efa27d2..4026c9073 100644 --- a/pkg/operator/ceph/object/user.go +++ b/pkg/operator/ceph/object/user.go @@ -25,6 +25,7 @@ import ( "github.com/ceph/go-ceph/rgw/admin" "github.com/pkg/errors" "github.com/rook/rook/pkg/util/exec" + "github.com/rook/rook/pkg/util/log" ) const ( @@ -86,7 +87,7 @@ func decodeUser(data string) (*ObjectUser, int, error) { // The function is used **ONCE** only to provision so the RGW Admin Ops User // Subsequent interaction with the API will be done with the created user func GetUser(c *Context, id string) (*ObjectUser, int, error) { - logger.Debugf("getting s3 user %q", id) + log.NamedDebug(c.NsName(), logger, "getting s3 user %q", id) // note: err is set for non-existent user but result output is also empty result, err := runAdminCommand(c, false, "user", "info", "--uid", id) if strings.Contains(result, "no user info saved") { @@ -106,7 +107,7 @@ func GetUser(c *Context, id string) (*ObjectUser, int, error) { // The function is used **ONCE** only to provision so the RGW Admin Ops User // Subsequent interaction with the API will be done with the created user func CreateUser(c *Context, user ObjectUser, force bool) (*ObjectUser, int, error) { - logger.Debugf("creating s3 user %q", user.UserID) + log.NamedDebug(c.NsName(), logger, "creating s3 user %q", user.UserID) timeout := exec.CephCommandsTimeout if user.UserID == RGWAdminOpsUserSecretName { // Setting a really long timeout for the command that creates the admin user diff --git a/pkg/operator/ceph/object/user/controller.go b/pkg/operator/ceph/object/user/controller.go index 1f761f810..6c4823b65 100644 --- a/pkg/operator/ceph/object/user/controller.go +++ b/pkg/operator/ceph/object/user/controller.go @@ -51,6 +51,7 @@ import ( "github.com/rook/rook/pkg/operator/ceph/object" "github.com/rook/rook/pkg/operator/ceph/reporting" "github.com/rook/rook/pkg/operator/k8sutil" + "github.com/rook/rook/pkg/util/log" ) const ( @@ -220,7 +221,7 @@ func (r *ReconcileObjectStoreUser) Reconcile(context context.Context, request re reconcileResponse, cephObjectStoreUser, err := r.reconcile(request) if err != nil { r.updateStatus(k8sutil.ObservedGenerationNotAvailable, request.NamespacedName, k8sutil.ReconcileFailedStatus) - logger.Errorf("failed to reconcile %v", err) + log.NamedError(request.NamespacedName, logger, "failed to reconcile %v", err) } return reporting.ReportReconcileResult(logger, r.recorder, request, &cephObjectStoreUser, reconcileResponse, err) @@ -232,7 +233,7 @@ func (r *ReconcileObjectStoreUser) reconcile(request reconcile.Request) (reconci err := r.client.Get(r.opManagerContext, request.NamespacedName, cephObjectStoreUser) if err != nil { if kerrors.IsNotFound(err) { - logger.Debug("CephObjectStoreUser resource not found. Ignoring since object must be deleted.") + log.NamedDebug(request.NamespacedName, logger, "CephObjectStoreUser resource not found. Ignoring since object must be deleted.") return reconcile.Result{}, *cephObjectStoreUser, nil } // Error reading the object - requeue the request. @@ -249,7 +250,7 @@ func (r *ReconcileObjectStoreUser) reconcile(request reconcile.Request) (reconci return reconcile.Result{}, *cephObjectStoreUser, errors.Wrap(err, "failed to add finalizer") } if generationUpdated { - logger.Infof("reconciling the object user %q after adding finalizer", cephObjectStoreUser.Name) + log.NamedInfo(request.NamespacedName, logger, "reconciling the object user after adding finalizer") return reconcile.Result{}, *cephObjectStoreUser, nil } @@ -304,14 +305,14 @@ func (r *ReconcileObjectStoreUser) reconcile(request reconcile.Request) (reconci // Return and do not requeue. Successful deletion. return reconcile.Result{}, *cephObjectStoreUser, nil } - logger.Debugf("ObjectStore resource not ready in namespace %q, retrying in %q. %v", - clusterNamespace.Namespace, opcontroller.WaitForRequeueIfCephClusterNotReady.RequeueAfter.String(), err) + log.NamedDebug(request.NamespacedName, logger, "ObjectStore resource not ready, retrying in %q. %v", + opcontroller.WaitForRequeueIfCephClusterNotReady.RequeueAfter.String(), err) return opcontroller.WaitForRequeueIfCephClusterNotReady, *cephObjectStoreUser, err } // DELETE: the CR was deleted if !cephObjectStoreUser.GetDeletionTimestamp().IsZero() { - logger.Debugf("deleting object store user %q", request.NamespacedName) + log.NamedDebug(request.NamespacedName, logger, "deleting object store user") r.recorder.Eventf(cephObjectStoreUser, corev1.EventTypeNormal, string(cephv1.ReconcileStarted), "deleting CephObjectStoreUser %q", cephObjectStoreUser.Name) err := r.deleteUser(cephObjectStoreUser) @@ -381,7 +382,7 @@ func (r *ReconcileObjectStoreUser) reconcile(request reconcile.Request) (reconci r.updateStatus(observedGeneration, request.NamespacedName, k8sutil.ReadyStatus) // Return and do not requeue - logger.Debug("done reconciling") + log.NamedDebug(request.NamespacedName, logger, "done reconciling") return reconcile.Result{}, *cephObjectStoreUser, nil } @@ -395,7 +396,8 @@ func (r *ReconcileObjectStoreUser) reconcileCephUser(cephObjectStoreUser *cephv1 } func (r *ReconcileObjectStoreUser) createOrUpdateCephUser(u *cephv1.CephObjectStoreUser, userConfig *admin.User) error { - logger.Infof("creating ceph object user %q in namespace %q", u.Name, u.Namespace) + nsName := opcontroller.NsName(u.Namespace, u.Name) + log.NamedInfo(nsName, logger, "creating ceph object user") logCreateOrUpdate := fmt.Sprintf("retrieved existing ceph object user %q", u.Name) var user admin.User @@ -415,7 +417,7 @@ func (r *ReconcileObjectStoreUser) createOrUpdateCephUser(u *cephv1.CephObjectSt } // Update max bucket if necessary - logger.Tracef("user capabilities(id: %s, caps: %#v, user caps: %s, op mask: %s)", + log.NamedTrace(nsName, logger, "user capabilities(id: %s, caps: %#v, user caps: %s, op mask: %s)", user.ID, user.Caps, user.UserCaps, user.OpMask) if *user.MaxBuckets != *userConfig.MaxBuckets { user, err = r.objContext.AdminOpsClient.ModifyUser(r.opManagerContext, *userConfig) @@ -430,14 +432,14 @@ func (r *ReconcileObjectStoreUser) createOrUpdateCephUser(u *cephv1.CephObjectSt if user.UserCaps != userConfig.UserCaps { // If they are no caps to be removed, the API will return an error "missing user capabilities" if user.UserCaps != "" { - logger.Tracef("remove capabilities %s from user %s", user.UserCaps, userConfig.ID) + log.NamedTrace(nsName, logger, "remove capabilities %s from user %s", user.UserCaps, userConfig.ID) _, err = r.objContext.AdminOpsClient.RemoveUserCap(r.opManagerContext, userConfig.ID, user.UserCaps) if err != nil { return errors.Wrapf(err, "failed to remove current ceph object user %q capabilities", userConfig.ID) } } if userConfig.UserCaps != "" { - logger.Tracef("set capabilities %s for user %s", userConfig.UserCaps, userConfig.ID) + log.NamedTrace(nsName, logger, "set capabilities %s for user %s", userConfig.UserCaps, userConfig.ID) _, err = r.objContext.AdminOpsClient.AddUserCap(r.opManagerContext, userConfig.ID, userConfig.UserCaps) if err != nil { return errors.Wrapf(err, "failed to update ceph object user %q capabilities", userConfig.ID) @@ -478,13 +480,13 @@ func (r *ReconcileObjectStoreUser) createOrUpdateCephUser(u *cephv1.CephObjectSt } userConfig.Keys = []admin.UserKeySpec{user.Keys[0]} - logger.Debugf("reducing user %q keypairs to %v", u.Name, userConfig.Keys) + log.NamedDebug(nsName, logger, "reducing user %q keypairs to %v", u.Name, userConfig.Keys) } - if err := r.reconcileUserKeys(u.Name, userConfig.Keys); err != nil { + if err := r.reconcileUserKeys(nsName, userConfig.Keys); err != nil { return errors.Wrapf(err, "failed to reconcile keys for user %q", u.Name) } - logger.Info(logCreateOrUpdate) + log.NamedInfo(nsName, logger, "%s", logCreateOrUpdate) return nil } @@ -534,7 +536,7 @@ func userInNamespaceAllowed(requestedNamespace string, allowedNamespaces []strin // Check if there is access to create the user in another namespace for _, allowedNamespace := range allowedNamespaces { if allowedNamespace == "*" || allowedNamespace == requestedNamespace { - logger.Debugf("allow creating object user in namespace %q", requestedNamespace) + log.NamespacedDebug(requestedNamespace, logger, "allow creating object user in namespace") return true } } @@ -678,11 +680,12 @@ func (r *ReconcileObjectStoreUser) reconcileCephUserSecret(cephObjectStoreUser * } func (r *ReconcileObjectStoreUser) objectStoreInitialized(cephObjectStoreUser *cephv1.CephObjectStoreUser) error { + nsName := opcontroller.NsName(cephObjectStoreUser.Namespace, cephObjectStoreUser.Name) cephObjectStore, err := r.getObjectStore(cephObjectStoreUser) if err != nil { return err } - logger.Debug("CephObjectStore exists") + log.NamedDebug(nsName, logger, "CephObjectStore exists") // If the rgw is external just return // since there are no pods running @@ -699,7 +702,7 @@ func (r *ReconcileObjectStoreUser) objectStoreInitialized(cephObjectStoreUser *c // check if at least one pod is running if len(pods.Items) > 0 { - logger.Debugf("%d RGW pods found where object store user %q is created", len(pods.Items), cephObjectStoreUser.Name) + log.NamedDebug(nsName, logger, "%d RGW pods found where object store user %q is created", len(pods.Items), cephObjectStoreUser.Name) return nil } @@ -722,7 +725,7 @@ func (r *ReconcileObjectStoreUser) getObjectStore(user *cephv1.CephObjectStoreUs for _, store := range objectStores.Items { if store.Name == storeName { - logger.Debugf("found CephObjectStore %q referenced by CephObjectStoreUser %q", storeName, nsName) + log.NamedDebug(opcontroller.NsName(user.Namespace, user.Name), logger, "found CephObjectStore %q referenced by CephObjectStoreUser", storeName) return &store, nil } } @@ -761,16 +764,17 @@ func clusterStoreNamespace(user *cephv1.CephObjectStoreUser) string { // Delete the user func (r *ReconcileObjectStoreUser) deleteUser(u *cephv1.CephObjectStoreUser) error { + nsName := opcontroller.NsName(u.Namespace, u.Name) err := r.objContext.AdminOpsClient.RemoveUser(r.opManagerContext, admin.User{ID: u.Name}) if err != nil { if errors.Is(err, admin.ErrNoSuchUser) { - logger.Warningf("user %q does not exist, nothing to remove", u.Name) + log.NamedWarning(nsName, logger, "user does not exist, nothing to remove") return nil } return errors.Wrapf(err, "failed to delete ceph object user %q.", u.Name) } - logger.Infof("ceph object user %q deleted successfully", u.Name) + log.NamedInfo(nsName, logger, "ceph object user deleted successfully") return nil } @@ -797,10 +801,10 @@ func (r *ReconcileObjectStoreUser) updateStatus(observedGeneration int64, name t user := &cephv1.CephObjectStoreUser{} if err := r.client.Get(r.opManagerContext, name, user); err != nil { if kerrors.IsNotFound(err) { - logger.Debug("CephObjectStoreUser resource not found. Ignoring since object must be deleted.") + log.NamedDebug(name, logger, "CephObjectStoreUser resource not found. Ignoring since object must be deleted.") return } - logger.Warningf("failed to retrieve object store user %q to update status to %q. %v", name, status, err) + log.NamedWarning(name, logger, "failed to retrieve object store user %q to update status to %q. %v", name, status, err) return } if user.Status == nil { @@ -815,10 +819,10 @@ func (r *ReconcileObjectStoreUser) updateStatus(observedGeneration int64, name t user.Status.ObservedGeneration = observedGeneration } if err := reporting.UpdateStatus(r.client, user); err != nil { - logger.Errorf("failed to set object store user %q status to %q. %v", name, status, err) + log.NamedError(name, logger, "failed to set object store user %q status to %q. %v", name, status, err) return } - logger.Debugf("object store user %q status updated to %q", name, status) + log.NamedDebug(name, logger, "object store user %q status updated to %q", name, status) } // updates `.status.keys`. This functionality is not included as part of @@ -830,17 +834,17 @@ func (r *ReconcileObjectStoreUser) updateKeyStatus(name types.NamespacedName, re user := &cephv1.CephObjectStoreUser{} if err := r.client.Get(r.opManagerContext, name, user); err != nil { if kerrors.IsNotFound(err) { - logger.Debug("CephObjectStoreUser resource not found. Ignoring since object must be deleted.") + log.NamedDebug(name, logger, "CephObjectStoreUser resource not found. Ignoring since object must be deleted.") return } - logger.Warningf("failed to retrieve CephObjectStoreUser %q to update .status.keys. %v", name, err) + log.NamedWarning(name, logger, "failed to retrieve CephObjectStoreUser to update .status.keys. %v", err) return } if user.Status == nil { user.Status = &cephv1.ObjectStoreUserStatus{} } - logger.Debugf("updating CephObjectStoreUser %q .status.keys to %+v.", name.Name, referencedSecrets) + log.NamedDebug(name, logger, "updating CephObjectStoreUser .status.keys to %+v.", referencedSecrets) keyStatus := []cephv1.SecretReference{} @@ -864,10 +868,10 @@ func (r *ReconcileObjectStoreUser) updateKeyStatus(name types.NamespacedName, re user.Status.Keys = keyStatus if err := reporting.UpdateStatus(r.client, user); err != nil { - logger.Warningf("failed to update CephObjectStoreUser %q .status.keys. %v", name, err) + log.NamedWarning(name, logger, "failed to update CephObjectStoreUser.status.keys. %v", err) return } - logger.Debugf("updated CephObjectStoreUser %q .status.keys.", name) + log.NamedDebug(name, logger, "updated CephObjectStoreUser.status.keys") } // getSecretValue returns the value of key in a kubernetes secret @@ -889,9 +893,10 @@ func (r *ReconcileObjectStoreUser) getSecretValue(selector *corev1.SecretKeySele } // reconcileUserKeys ensures the user's RGW keys match exactly the targetKeys slice. Any keys set on the user but not present in targetKeys are purged. -func (r *ReconcileObjectStoreUser) reconcileUserKeys(userID string, targetKeys []admin.UserKeySpec) error { +func (r *ReconcileObjectStoreUser) reconcileUserKeys(nsName types.NamespacedName, targetKeys []admin.UserKeySpec) error { ctx := r.opManagerContext client := r.objContext.AdminOpsClient + userID := nsName.Name // fetch the current user keys userInfo, err := client.GetUser(ctx, admin.User{ID: userID}) @@ -918,7 +923,7 @@ func (r *ReconcileObjectStoreUser) reconcileUserKeys(userID string, targetKeys [ if err := client.RemoveKey(ctx, rmKey); err != nil { return errors.Wrapf(err, "failed to remove key %q from user %q", existingKey.AccessKey, userID) } - logger.Debugf("removed key %q from user %q as it is not in the target list", existingKey.AccessKey, userID) + log.NamedDebug(nsName, logger, "removed key %q from user %q as it is not in the target list", existingKey.AccessKey, userID) continue } if existingKey.SecretKey != targetKey.SecretKey { @@ -930,7 +935,7 @@ func (r *ReconcileObjectStoreUser) reconcileUserKeys(userID string, targetKeys [ if err := client.RemoveKey(ctx, rmKey); err != nil { return errors.Wrapf(err, "failed to remove key %q from user %q", existingKey.AccessKey, userID) } - logger.Debugf("removed key %q from user %q needs as it needs to be recreated", existingKey.AccessKey, userID) + log.NamedDebug(nsName, logger, "removed key %q from user %q needs as it needs to be recreated", existingKey.AccessKey, userID) continue } // else key exists and is correct, no action needed @@ -948,7 +953,7 @@ func (r *ReconcileObjectStoreUser) reconcileUserKeys(userID string, targetKeys [ if _, err := client.CreateKey(ctx, k); err != nil { return errors.Wrapf(err, "failed to create key %q for user %q", k.AccessKey, userID) } - logger.Debugf("created key %q for user %q", k.AccessKey, userID) + log.NamedDebug(nsName, logger, "created key %q for user %q", k.AccessKey, userID) } return nil diff --git a/pkg/operator/ceph/object/zone/controller.go b/pkg/operator/ceph/object/zone/controller.go index 0481d9810..0be47ccda 100644 --- a/pkg/operator/ceph/object/zone/controller.go +++ b/pkg/operator/ceph/object/zone/controller.go @@ -45,6 +45,7 @@ import ( "github.com/rook/rook/pkg/operator/ceph/pool" "github.com/rook/rook/pkg/operator/k8sutil" "github.com/rook/rook/pkg/util/exec" + "github.com/rook/rook/pkg/util/log" kerrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" @@ -145,7 +146,7 @@ func (r *ReconcileObjectZone) reconcile(request reconcile.Request) (reconcile.Re err := r.client.Get(r.opManagerContext, request.NamespacedName, cephObjectZone) if err != nil { if kerrors.IsNotFound(err) { - logger.Debug("CephObjectZone resource not found. Ignoring since object must be deleted.") + log.NamedDebug(request.NamespacedName, logger, "CephObjectZone resource not found. Ignoring since object must be deleted.") return reconcile.Result{}, *cephObjectZone, nil } // Error reading the object - requeue the request. @@ -162,7 +163,7 @@ func (r *ReconcileObjectZone) reconcile(request reconcile.Request) (reconcile.Re return reconcile.Result{}, *cephObjectZone, errors.Wrap(err, "failed to add finalizer") } if generationUpdated { - logger.Infof("reconciling the object zone %q after adding finalizer", cephObjectZone.Name) + log.NamedInfo(request.NamespacedName, logger, "reconciling the object zone after adding finalizer") return reconcile.Result{}, *cephObjectZone, nil } @@ -234,12 +235,13 @@ func (r *ReconcileObjectZone) reconcile(request reconcile.Request) (reconcile.Re r.updateStatus(observedGeneration, request.NamespacedName, k8sutil.ReadyStatus) // Return and do not requeue - logger.Debug("zone done reconciling") + log.NamedDebug(request.NamespacedName, logger, "zone done reconciling") return reconcile.Result{}, *cephObjectZone, nil } func (r *ReconcileObjectZone) createorUpdateCephZone(zone *cephv1.CephObjectZone, realmName string) (reconcile.Result, error) { - logger.Infof("creating object zone %q in zonegroup %q in realm %q", zone.Name, zone.Spec.ZoneGroup, realmName) + nsName := opcontroller.NsName(zone.Namespace, zone.Name) + log.NamedInfo(nsName, logger, "creating object zone in zonegroup %q in realm %q", zone.Spec.ZoneGroup, realmName) objContext := object.NewContext(r.context, r.clusterInfo, zone.Name) objContext.Realm = realmName @@ -256,7 +258,7 @@ func (r *ReconcileObjectZone) createorUpdateCephZone(zone *cephv1.CephObjectZone func (r *ReconcileObjectZone) createPoolsAndZone(objContext *object.Context, zone *cephv1.CephObjectZone) error { // create pools for zone - logger.Debugf("creating pools ceph zone %q", zone.Name) + log.NamedDebug(objContext.NsName(), logger, "creating pools for ceph zone %q", zone.Name) err := object.ValidateObjectStorePoolsConfig(zone.Spec.MetadataPool, zone.Spec.DataPool, zone.Spec.SharedPools) if err != nil { return fmt.Errorf("invalid zone pools config: %w", err) @@ -266,7 +268,7 @@ func (r *ReconcileObjectZone) createPoolsAndZone(objContext *object.Context, zon if err != nil { return fmt.Errorf("unable to create pools for zone: %w", err) } - logger.Debugf("created pools ceph zone %q", zone.Name) + log.NamedDebug(objContext.NsName(), logger, "created pools ceph zone %q", zone.Name) } err = r.createZoneIfNotExists(objContext, zone) @@ -316,28 +318,28 @@ func (r *ReconcileObjectZone) createZoneIfNotExists(objContext *object.Context, // create/update zone _, err = object.RunAdminCommandNoMultisite(objContext, true, "zone", "get", realmArg, zoneGroupArg, zoneArg) if err == nil { - logger.Debugf("ceph zone %q already exists, new zone and pools will not be created but checking for update", zone.Name) + log.NamedDebug(objContext.NsName(), logger, "ceph zone %q already exists, new zone and pools will not be created but checking for update", zone.Name) zoneEndpointsModified, err := object.ShouldUpdateZoneEndpointList(zoneGroupJson.Zones, zone.Spec.CustomEndpoints, objContext.Zone) if err != nil { return err } if zoneEndpointsModified { zoneEndpoints := strings.Join(zone.Spec.CustomEndpoints, ",") - logger.Debugf("Updating endpoints for zone %q are: %q", objContext.Zone, zoneEndpoints) + log.NamedDebug(objContext.NsName(), logger, "Updating endpoints for zone %q are: %q", objContext.Zone, zoneEndpoints) endpointArg := fmt.Sprintf("--endpoints=%s", zoneEndpoints) err = object.JoinMultisite(objContext, endpointArg, zoneEndpoints, zone.Namespace) if err != nil { return err } } - logger.Debugf("skip creating zone %q: already exists", zone.Name) + log.NamedDebug(objContext.NsName(), logger, "skip creating zone %q: already exists", zone.Name) return nil } if code, ok := exec.ExitStatus(err); ok && code != int(syscall.ENOENT) { return errors.Wrapf(err, "radosgw-admin zone get failed with code %d for reason %q", code, output) } - logger.Debugf("ceph zone %q not found, running `radosgw-admin zone create`", zone.Name) + log.NamedDebug(objContext.NsName(), logger, "ceph zone %q not found, running `radosgw-admin zone create`", zone.Name) accessKeyArg, secretKeyArg, err := object.GetRealmKeyArgs(r.opManagerContext, r.context, objContext.Realm, zone.Namespace) if err != nil { @@ -358,12 +360,13 @@ func (r *ReconcileObjectZone) createZoneIfNotExists(objContext *object.Context, if err != nil { return errors.Wrapf(err, "failed to create ceph zone %q for reason %q", zone.Name, output) } - logger.Debugf("created ceph zone %q", zone.Name) + log.NamedDebug(objContext.NsName(), logger, "created ceph zone %q", zone.Name) return nil } func (r *ReconcileObjectZone) getCephObjectZoneGroup(zone *cephv1.CephObjectZone) (string, reconcile.Result, error) { // empty zoneGroup gets filled by r.client.Get() + nsName := opcontroller.NsName(zone.Namespace, zone.Name) zoneGroup := &cephv1.CephObjectZoneGroup{} err := r.client.Get(r.opManagerContext, types.NamespacedName{Name: zone.Spec.ZoneGroup, Namespace: zone.Namespace}, zoneGroup) if err != nil { @@ -373,11 +376,12 @@ func (r *ReconcileObjectZone) getCephObjectZoneGroup(zone *cephv1.CephObjectZone return "", waitForRequeueIfObjectZoneGroupNotReady, errors.Wrapf(err, "error getting cephObjectZoneGroup %v", zone.Spec.ZoneGroup) } - logger.Debugf("CephObjectZoneGroup %v found", zoneGroup.Name) + log.NamedDebug(nsName, logger, "CephObjectZoneGroup %v found", zoneGroup.Name) return zoneGroup.Spec.Realm, reconcile.Result{}, nil } func (r *ReconcileObjectZone) reconcileCephZoneGroup(zone *cephv1.CephObjectZone, realmName string) (reconcile.Result, error) { + nsName := opcontroller.NsName(zone.Namespace, zone.Name) realmArg := fmt.Sprintf("--rgw-realm=%s", realmName) zoneGroupArg := fmt.Sprintf("--rgw-zonegroup=%s", zone.Spec.ZoneGroup) objContext := object.NewContext(r.context, r.clusterInfo, zone.Name) @@ -391,7 +395,7 @@ func (r *ReconcileObjectZone) reconcileCephZoneGroup(zone *cephv1.CephObjectZone } } - logger.Infof("Zone group %q found in Ceph cluster to create ceph zone %q", zone.Spec.ZoneGroup, zone.Name) + log.NamedInfo(nsName, logger, "Zone group %q found in Ceph cluster to create ceph zone %q", zone.Spec.ZoneGroup, zone.Name) return reconcile.Result{}, nil } @@ -425,10 +429,10 @@ func (r *ReconcileObjectZone) updateStatus(observedGeneration int64, name types. objectZone := &cephv1.CephObjectZone{} if err := r.client.Get(r.opManagerContext, name, objectZone); err != nil { if kerrors.IsNotFound(err) { - logger.Debug("CephObjectZone resource not found. Ignoring since object must be deleted.") + log.NamedDebug(name, logger, "CephObjectZone resource not found. Ignoring since object must be deleted.") return } - logger.Warningf("failed to retrieve object zone %q to update status to %q. %v", name, status, err) + log.NamedWarning(name, logger, "failed to retrieve object zone %q to update status to %q. %v", name, status, err) return } if objectZone.Status == nil { @@ -440,10 +444,10 @@ func (r *ReconcileObjectZone) updateStatus(observedGeneration int64, name types. objectZone.Status.ObservedGeneration = observedGeneration } if err := reporting.UpdateStatus(r.client, objectZone); err != nil { - logger.Errorf("failed to set object zone %q status to %q. %v", name, status, err) + log.NamedError(name, logger, "failed to set object zone %q status to %q. %v", name, status, err) return } - logger.Debugf("object zone %q status updated to %q", name, status) + log.NamedDebug(name, logger, "object zone %q status updated to %q", name, status) } func (r *ReconcileObjectZone) deleteZone(objContext *object.Context) error { @@ -492,10 +496,10 @@ func (r *ReconcileObjectZone) deleteZonePools(objContext *object.Context, zone * return errors.Wrapf(err, "failed to parse pool prefix for zone json %v", zoneOutput) } - logger.Debugf("deleting pools for ceph zone %q with prefix %q", zone.Name, poolPrefix) + log.NamedDebug(objContext.NsName(), logger, "deleting pools for ceph zone %q with prefix %q", zone.Name, poolPrefix) if object.EmptyPool(zone.Spec.DataPool) && object.EmptyPool(zone.Spec.MetadataPool) { - logger.Info("skipping removal of pools since not specified in the object zone") + log.NamedInfo(objContext.NsName(), logger, "skipping removal of pools since not specified in the object zone") return nil } err = object.DeletePools(objContext, false, poolPrefix) @@ -517,7 +521,8 @@ func decodePoolPrefixfromZone(data string) (string, error) { } func (r *ReconcileObjectZone) deleteCephObjectZone(zone *cephv1.CephObjectZone, realmName string) (reconcile.Result, error) { - logger.Debugf("deleting zone CR %q", zone.Name) + nsName := opcontroller.NsName(zone.Namespace, zone.Name) + log.NamedDebug(nsName, logger, "deleting zone CR %q", zone.Name) objContext := object.NewContext(r.context, r.clusterInfo, zone.Name) objContext.Realm = realmName objContext.ZoneGroup = zone.Spec.ZoneGroup @@ -560,7 +565,7 @@ func (r *ReconcileObjectZone) deleteCephObjectZone(zone *cephv1.CephObjectZone, return res, err } } else { - logger.Infof("PreservePoolsOnDelete is set in object zone %s. Pools is not deleted, but Zone is not removed", objContext.Name) + log.NamedInfo(nsName, logger, "PreservePoolsOnDelete is set in object zone %s. Pools is not deleted, but Zone is not removed", objContext.Name) } err = r.deleteZone(objContext) if err != nil { diff --git a/pkg/operator/ceph/object/zone/dependents.go b/pkg/operator/ceph/object/zone/dependents.go index 7b7ec61c8..732129f11 100644 --- a/pkg/operator/ceph/object/zone/dependents.go +++ b/pkg/operator/ceph/object/zone/dependents.go @@ -23,8 +23,10 @@ import ( v1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1" "github.com/rook/rook/pkg/clusterd" "github.com/rook/rook/pkg/daemon/ceph/client" + "github.com/rook/rook/pkg/operator/ceph/controller" "github.com/rook/rook/pkg/operator/ceph/object" "github.com/rook/rook/pkg/util/dependents" + "github.com/rook/rook/pkg/util/log" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -34,7 +36,7 @@ func CephObjectZoneDependentStores( zone *v1.CephObjectZone, objContext *object.Context, ) (*dependents.DependentList, error) { - nsName := fmt.Sprintf("%s/%s", zone.Namespace, zone.Name) + nsName := controller.NsName(zone.Namespace, zone.Name) baseErrMsg := fmt.Sprintf("failed to get dependents of CephObjectZone %q", nsName) deps := dependents.NewDependentList() @@ -46,10 +48,10 @@ func CephObjectZoneDependentStores( for _, store := range stores.Items { if store.Spec.Zone.Name == zone.Name { deps.Add("CephObjectStore", store.Name) - logger.Debugf("found CephObjectStore %q that depends on CephObjectZone %q", store.Name, nsName) + log.NamedDebug(nsName, logger, "found CephObjectStore %q that depends on CephObjectZone %q", store.Name, nsName) } else { - logger.Debugf("found CephObjectStore %q that does not depend on CephObjectZone %q", store.Name, nsName) + log.NamedDebug(nsName, logger, "found CephObjectStore %q that does not depend on CephObjectZone %q", store.Name, nsName) } } diff --git a/pkg/operator/ceph/object/zonegroup/controller.go b/pkg/operator/ceph/object/zonegroup/controller.go index fe76165d5..77edaad19 100644 --- a/pkg/operator/ceph/object/zonegroup/controller.go +++ b/pkg/operator/ceph/object/zonegroup/controller.go @@ -41,6 +41,7 @@ import ( "github.com/rook/rook/pkg/operator/ceph/object" "github.com/rook/rook/pkg/operator/k8sutil" "github.com/rook/rook/pkg/util/exec" + "github.com/rook/rook/pkg/util/log" kerrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" @@ -119,7 +120,7 @@ func (r *ReconcileObjectZoneGroup) Reconcile(context context.Context, request re // workaround because the rook logging mechanism is not compatible with the controller-runtime logging interface reconcileResponse, err := r.reconcile(request) if err != nil { - logger.Errorf("failed to reconcile: %v", err) + log.NamedError(request.NamespacedName, logger, "failed to reconcile: %v", err) } return reconcileResponse, err @@ -131,7 +132,7 @@ func (r *ReconcileObjectZoneGroup) reconcile(request reconcile.Request) (reconci err := r.client.Get(r.opManagerContext, request.NamespacedName, cephObjectZoneGroup) if err != nil { if kerrors.IsNotFound(err) { - logger.Debug("CephObjectZoneGroup resource not found. Ignoring since object must be deleted.") + log.NamedDebug(request.NamespacedName, logger, "CephObjectZoneGroup resource not found. Ignoring since object must be deleted.") return reconcile.Result{}, nil } // Error reading the object - requeue the request. @@ -160,7 +161,7 @@ func (r *ReconcileObjectZoneGroup) reconcile(request reconcile.Request) (reconci // DELETE: the CR was deleted if !cephObjectZoneGroup.GetDeletionTimestamp().IsZero() { - logger.Debugf("deleting zone group CR %q", cephObjectZoneGroup.Name) + log.NamedDebug(request.NamespacedName, logger, "deleting zone group CR %q", cephObjectZoneGroup.Name) // Return and do not requeue. Successful deletion. return reconcile.Result{}, nil @@ -205,12 +206,13 @@ func (r *ReconcileObjectZoneGroup) reconcile(request reconcile.Request) (reconci r.updateStatus(observedGeneration, request.NamespacedName, k8sutil.ReadyStatus) // Return and do not requeue - logger.Debug("zone group done reconciling") + log.NamedDebug(request.NamespacedName, logger, "zone group done reconciling") return reconcile.Result{}, nil } func (r *ReconcileObjectZoneGroup) createCephZoneGroup(zoneGroup *cephv1.CephObjectZoneGroup) (reconcile.Result, error) { - logger.Infof("creating object zone group %q in realm %q", zoneGroup.Name, zoneGroup.Spec.Realm) + nsName := opcontroller.NsName(zoneGroup.Namespace, zoneGroup.Name) + log.NamedInfo(nsName, logger, "creating object zone group %q in realm %q", zoneGroup.Name, zoneGroup.Spec.Realm) realmArg := fmt.Sprintf("--rgw-realm=%s", zoneGroup.Spec.Realm) zoneGroupArg := fmt.Sprintf("--rgw-zonegroup=%s", zoneGroup.Name) @@ -244,7 +246,7 @@ func (r *ReconcileObjectZoneGroup) createCephZoneGroup(zoneGroup *cephv1.CephObj } if code, ok := exec.ExitStatus(err); ok && code == int(syscall.ENOENT) { - logger.Debugf("ceph zone group %q not found, running `radosgw-admin zonegroup create`", zoneGroup.Name) + log.NamedDebug(nsName, logger, "ceph zone group %q not found, running `radosgw-admin zonegroup create`", zoneGroup.Name) args := []string{ "zonegroup", "create", @@ -269,6 +271,8 @@ func (r *ReconcileObjectZoneGroup) createCephZoneGroup(zoneGroup *cephv1.CephObj } func (r *ReconcileObjectZoneGroup) reconcileObjectRealm(zoneGroup *cephv1.CephObjectZoneGroup) (reconcile.Result, error) { + nsName := opcontroller.NsName(zoneGroup.Namespace, zoneGroup.Name) + // Verify the object realm API object actually exists cephObjectRealm := &cephv1.CephObjectRealm{} err := r.client.Get(r.opManagerContext, types.NamespacedName{Name: zoneGroup.Spec.Realm, Namespace: zoneGroup.Namespace}, cephObjectRealm) @@ -279,11 +283,12 @@ func (r *ReconcileObjectZoneGroup) reconcileObjectRealm(zoneGroup *cephv1.CephOb return waitForRequeueIfObjectRealmNotReady, errors.Wrapf(err, "error finding CephObjectRealm %s", zoneGroup.Spec.Realm) } - logger.Infof("CephObjectRealm %q found for CephObjectZoneGroup %q", zoneGroup.Spec.Realm, zoneGroup.Name) + log.NamedInfo(nsName, logger, "CephObjectRealm %q found for CephObjectZoneGroup", zoneGroup.Spec.Realm) return reconcile.Result{}, nil } func (r *ReconcileObjectZoneGroup) reconcileCephRealm(zoneGroup *cephv1.CephObjectZoneGroup) (reconcile.Result, error) { + nsName := opcontroller.NsName(zoneGroup.Namespace, zoneGroup.Name) realmArg := fmt.Sprintf("--rgw-realm=%s", zoneGroup.Spec.Realm) objContext := object.NewContext(r.context, r.clusterInfo, zoneGroup.Name) @@ -296,7 +301,7 @@ func (r *ReconcileObjectZoneGroup) reconcileCephRealm(zoneGroup *cephv1.CephObje } } - logger.Infof("Realm %q found in Ceph cluster to create ceph zone group %q", zoneGroup.Spec.Realm, zoneGroup.Name) + log.NamedInfo(nsName, logger, "Realm %q found in Ceph cluster to create ceph zone group", zoneGroup.Spec.Realm) return reconcile.Result{}, nil } @@ -310,10 +315,10 @@ func (r *ReconcileObjectZoneGroup) updateStatus(observedGeneration int64, name t objectZoneGroup := &cephv1.CephObjectZoneGroup{} if err := r.client.Get(r.opManagerContext, name, objectZoneGroup); err != nil { if kerrors.IsNotFound(err) { - logger.Debug("CephObjectZoneGroup resource not found. Ignoring since object must be deleted.") + log.NamedDebug(name, logger, "CephObjectZoneGroup resource not found. Ignoring since object must be deleted.") return } - logger.Warningf("failed to retrieve object zone group %q to update status to %q. %v", name, status, err) + log.NamedWarning(name, logger, "failed to retrieve object zone group %q to update status to %q. %v", name, status, err) return } if objectZoneGroup.Status == nil { @@ -325,8 +330,8 @@ func (r *ReconcileObjectZoneGroup) updateStatus(observedGeneration int64, name t objectZoneGroup.Status.ObservedGeneration = observedGeneration } if err := reporting.UpdateStatus(r.client, objectZoneGroup); err != nil { - logger.Errorf("failed to set object zone group %q status to %q. %v", name, status, err) + log.NamedError(name, logger, "failed to set object zone group %q status to %q. %v", name, status, err) return } - logger.Debugf("object zone group %q status updated to %q", name, status) + log.NamedDebug(name, logger, "object zone group %q status updated to %q", name, status) } diff --git a/pkg/operator/ceph/pool/controller.go b/pkg/operator/ceph/pool/controller.go index eec0bda1b..202cb182f 100644 --- a/pkg/operator/ceph/pool/controller.go +++ b/pkg/operator/ceph/pool/controller.go @@ -28,6 +28,7 @@ import ( cephclient "github.com/rook/rook/pkg/daemon/ceph/client" "github.com/rook/rook/pkg/util/dependents" "github.com/rook/rook/pkg/util/exec" + "github.com/rook/rook/pkg/util/log" "github.com/pkg/errors" cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1" @@ -195,7 +196,7 @@ func (r *ReconcileCephBlockPool) reconcile(request reconcile.Request) (reconcile err := r.client.Get(r.opManagerContext, request.NamespacedName, cephBlockPool) if err != nil { if kerrors.IsNotFound(err) { - logger.Debug("CephBlockPool resource not found. Ignoring since object must be deleted.") + log.NamedDebug(request.NamespacedName, logger, "CephBlockPool resource not found. Ignoring since object must be deleted.") // If there was a previous error or if a user removed this resource's finalizer, it's // possible Rook didn't clean up the monitoring routine for this resource. Ensure the // routine is stopped when we see the resource is gone. @@ -218,7 +219,7 @@ func (r *ReconcileCephBlockPool) reconcile(request reconcile.Request) (reconcile return opcontroller.ImmediateRetryResult, *cephBlockPool, errors.Wrap(err, "failed to add finalizer") } if generationUpdated { - logger.Infof("reconciling the ceph block pool %q after adding finalizer", cephBlockPool.Name) + log.NamedInfo(request.NamespacedName, logger, "reconciling the ceph block pool after adding finalizer") return reconcile.Result{}, *cephBlockPool, nil } @@ -289,7 +290,7 @@ func (r *ReconcileCephBlockPool) reconcile(request reconcile.Request) (reconcile r.recorder.Event(cephBlockPool, corev1.EventTypeNormal, string(cephv1.ReconcileStarted), "starting blockpool deletion") - logger.Infof("deleting pool %q", poolSpec.Name) + log.NamedInfo(request.NamespacedName, logger, "deleting pool") err = deletePool(r.context, clusterInfo, &poolSpec) if err != nil { return opcontroller.ImmediateRetryResult, *cephBlockPool, errors.Wrapf(err, "failed to delete pool %q. ", cephBlockPool.Name) @@ -297,7 +298,7 @@ func (r *ReconcileCephBlockPool) reconcile(request reconcile.Request) (reconcile // disable RBD stats collection if cephBlockPool was deleted if err := configureRBDStats(r.context, clusterInfo, cephBlockPool.Name); err != nil { - logger.Errorf("failed to disable stats collection for pool(s). %v", err) + log.NamedError(request.NamespacedName, logger, "failed to disable stats collection for pool(s). %v", err) } // Remove finalizer @@ -316,7 +317,7 @@ func (r *ReconcileCephBlockPool) reconcile(request reconcile.Request) (reconcile // validate the pool settings if err := validatePool(r.context, clusterInfo, &cephCluster.Spec, cephBlockPool); err != nil { if strings.Contains(err.Error(), opcontroller.UninitializedCephConfigError) { - logger.Info(opcontroller.OperatorNotInitializedMessage) + log.NamedInfo(request.NamespacedName, logger, opcontroller.OperatorNotInitializedMessage) return opcontroller.WaitForRequeueIfOperatorNotInitialized, *cephBlockPool, nil } return opcontroller.ImmediateRetryResult, *cephBlockPool, errors.Wrapf(err, "invalid pool CR %q spec", cephBlockPool.Name) @@ -333,12 +334,12 @@ func (r *ReconcileCephBlockPool) reconcile(request reconcile.Request) (reconcile reconcileResponse, err = r.reconcileCreatePool(clusterInfo, &cephCluster.Spec, cephBlockPool) if err != nil { if strings.Contains(err.Error(), opcontroller.UninitializedCephConfigError) { - logger.Info(opcontroller.OperatorNotInitializedMessage) + log.NamedInfo(request.NamespacedName, logger, opcontroller.OperatorNotInitializedMessage) return opcontroller.WaitForRequeueIfOperatorNotInitialized, *cephBlockPool, nil } statusErr = r.updateStatus(request.NamespacedName, cephv1.ConditionFailure, k8sutil.ObservedGenerationNotAvailable, nil) if statusErr != nil { - logger.Errorf("failed to update %q status to %q: %v", request.NamespacedName, cephv1.ConditionFailure, statusErr) + log.NamedError(request.NamespacedName, logger, "failed to update status to %q: %v", cephv1.ConditionFailure, statusErr) } return reconcileResponse, *cephBlockPool, errors.Wrapf(err, "failed to create pool %q.", cephBlockPool.GetName()) } @@ -349,7 +350,7 @@ func (r *ReconcileCephBlockPool) reconcile(request reconcile.Request) (reconcile } checker := cephclient.NewMirrorChecker(r.context, r.client, r.clusterInfo, request.NamespacedName, &poolSpec, cephBlockPool) // ADD PEERS - logger.Debug("reconciling create rbd mirror peer configuration") + log.NamedDebug(request.NamespacedName, logger, "reconciling create rbd mirror peer configuration") if cephBlockPool.Spec.Mirroring.Enabled { // Always create a bootstrap peer token in case another cluster wants to add us as a peer reconcileResponse, err = opcontroller.CreateBootstrapPeerSecret(r.context, clusterInfo, cephBlockPool, k8sutil.NewOwnerInfo(cephBlockPool, r.scheme)) @@ -368,10 +369,10 @@ func (r *ReconcileCephBlockPool) reconcile(request reconcile.Request) (reconcile } // Check if rbd-mirror CR and daemons are running - logger.Debug("listing rbd-mirror CR") + log.NamedDebug(request.NamespacedName, logger, "listing rbd-mirror CR") // Add bootstrap peer if any - logger.Debug("reconciling ceph bootstrap peers import") + log.NamedDebug(request.NamespacedName, logger, "reconciling ceph bootstrap peers import") reconcileResponse, err = r.reconcileAddBootstrapPeer(cephBlockPool, request.NamespacedName) if err != nil { return reconcileResponse, *cephBlockPool, errors.Wrap(err, "failed to add ceph rbd mirror peer") @@ -390,7 +391,7 @@ func (r *ReconcileCephBlockPool) reconcile(request reconcile.Request) (reconcile if cephBlockPool.Spec.StatusCheck.Mirror.Disabled { // Stop monitoring the mirroring status of this pool if blockPoolContextsExists && r.blockPoolContexts[blockPoolChannelKey].started { - logger.Info("stop monitoring the mirroring status of the pool %q", cephBlockPool.Name) + log.NamedInfo(request.NamespacedName, logger, "stop monitoring the mirroring status of the pool") r.cancelMirrorMonitoring(cephBlockPool) } // Reset the MirrorHealthCheckSpec @@ -398,7 +399,7 @@ func (r *ReconcileCephBlockPool) reconcile(request reconcile.Request) (reconcile } else { // Start monitoring of the pool if r.blockPoolContexts[blockPoolChannelKey].started { - logger.Debug("pool monitoring go routine already running!") + log.NamedDebug(request.NamespacedName, logger, "pool monitoring go routine already running!") } else { if cephBlockPool.Spec.Mirroring.Mode != "init-only" { r.blockPoolContexts[blockPoolChannelKey].started = true @@ -414,7 +415,7 @@ func (r *ReconcileCephBlockPool) reconcile(request reconcile.Request) (reconcile // disable mirroring err = r.disableMirroring(poolSpec.Name) if err != nil { - logger.Warningf("failed to disable mirroring on pool %q running in ceph cluster namespace %q. %v", poolSpec.Name, r.clusterInfo.Namespace, err) + log.NamedWarning(request.NamespacedName, logger, "failed to disable mirroring on pool. %v", err) } // update ObservedGeneration in status at the end of reconcile // Set Ready status, we are done reconciling @@ -433,7 +434,7 @@ func (r *ReconcileCephBlockPool) reconcile(request reconcile.Request) (reconcile } // Return and do not requeue - logger.Debug("done reconciling") + log.NamedDebug(request.NamespacedName, logger, "done reconciling") return reconcile.Result{}, *cephBlockPool, nil } @@ -442,6 +443,7 @@ func (r *ReconcileCephBlockPool) reconcile(request reconcile.Request) (reconcile // If the pool is not empty and force deletion is specified, create a cleanup job // to delete the images and snapshots forcefully. func (r *ReconcileCephBlockPool) handleDeletionBlocked(cephBlockPool *cephv1.CephBlockPool, cephCluster *cephv1.CephCluster) error { + nsName := opcontroller.NsName(cephBlockPool.Namespace, cephBlockPool.Name) poolSpec := cephBlockPool.ToNamedPoolSpec() deletionBlocked := false @@ -456,7 +458,7 @@ func (r *ReconcileCephBlockPool) handleDeletionBlocked(cephBlockPool *cephv1.Cep deletionBlocked = true _, _, depCondition = reporting.GenerateConditionBlockedDueToDependents(cephBlockPool, deps) } - logger.Info(depCondition.Message) + log.NamedInfo(nsName, logger, "%s", depCondition.Message) radosNamespaces := deps.OfKind(radosNamespacesKeyName) poolPresent, err := cephclient.IsPoolPresent(r.context, r.clusterInfo, poolSpec.Name) @@ -480,13 +482,12 @@ func (r *ReconcileCephBlockPool) handleDeletionBlocked(cephBlockPool *cephv1.Cep deletionBlocked = true emptyCondition = dependents.DeletionBlockedDueToNonEmptyPoolCondition(true, emptyMessage) } - logger.Info(emptyCondition.Message) + log.NamedInfo(nsName, logger, "%s", emptyCondition.Message) - nsName := types.NamespacedName{Namespace: cephBlockPool.Namespace, Name: cephBlockPool.Name} err = reporting.UpdateStatusConditionsWithRetry( r.opManagerContext, r.client, cephBlockPool, nsName, cephBlockPool.Kind, emptyCondition, depCondition) if err != nil { - logger.Warningf("failed to update %q status with deletion blocked conditions: %v", nsName.String(), err) + log.NamedWarning(nsName, logger, "failed to update %q status with deletion blocked conditions: %v", nsName.String(), err) } if !isEmpty { @@ -517,7 +518,8 @@ func (r *ReconcileCephBlockPool) reconcileCreatePool(clusterInfo *cephclient.Clu } func (r *ReconcileCephBlockPool) cleanup(cephblockpool *cephv1.CephBlockPool, cephCluster *cephv1.CephCluster) error { - logger.Infof("starting cleanup of the ceph resources for CephBlockPool %q in k8s namespace %q", cephblockpool.Name, cephblockpool.Namespace) + nsName := opcontroller.NsName(cephblockpool.Namespace, cephblockpool.Name) + log.NamedInfo(nsName, logger, "starting cleanup of the ceph resources for CephBlockPool") cleanupConfig := map[string]string{ opcontroller.CephBlockPoolNameEnv: cephblockpool.Name, } @@ -532,12 +534,13 @@ func (r *ReconcileCephBlockPool) cleanup(cephblockpool *cephv1.CephBlockPool, ce // Create the pool func createPool(context *clusterd.Context, clusterInfo *cephclient.ClusterInfo, clusterSpec *cephv1.ClusterSpec, p *cephv1.NamedPoolSpec) error { + nsName := opcontroller.NsName(clusterInfo.Namespace, p.Name) // Set the application name to rbd by default, but override later for special pools if p.Application == "" { p.Application = poolApplicationNameRBD } // create the pool - logger.Infof("creating pool %q in namespace %q", p.Name, clusterInfo.Namespace) + log.NamedInfo(nsName, logger, "creating pool") if err := cephclient.CreatePool(context, clusterInfo, clusterSpec, p); err != nil { return errors.Wrapf(err, "failed to configure pool %q", p.Name) } @@ -545,13 +548,13 @@ func createPool(context *clusterd.Context, clusterInfo *cephclient.ClusterInfo, if p.Application != poolApplicationNameRBD { return nil } - logger.Infof("initializing pool %q for RBD use", p.Name) + log.NamedInfo(nsName, logger, "initializing pool for RBD use") args := []string{"pool", "init", p.Name} output, err := cephclient.NewRBDCommand(context, clusterInfo, args).RunWithTimeout(exec.CephCommandsTimeout) if err != nil { return errors.Wrapf(err, "failed to initialize pool %q for RBD use. %s", p.Name, string(output)) } - logger.Infof("successfully initialized pool %q for RBD use", p.Name) + log.NamedInfo(nsName, logger, "successfully initialized pool for RBD use") return nil } @@ -610,7 +613,8 @@ func contains(slice []string, item string) bool { } func configureRBDStats(clusterContext *clusterd.Context, clusterInfo *cephclient.ClusterInfo, deletedPool string) error { - logger.Debug("configuring RBD per-image IO statistics collection") + nsName := opcontroller.NsName(clusterInfo.Namespace, deletedPool) + log.NamedDebug(nsName, logger, "configuring RBD per-image IO statistics collection") namespaceListOpt := client.InNamespace(clusterInfo.Namespace) cephBlockPoolList := &cephv1.CephBlockPoolList{} var rookStatsPools []string @@ -639,7 +643,7 @@ func configureRBDStats(clusterContext *clusterd.Context, clusterInfo *cephclient } existingStatsPoolsList := strings.Split(existingStatsPools, ",") enableStatsForPools := generateStatsPoolList(existingStatsPoolsList, rookStatsPools, removePools) - logger.Debugf("RBD per-image IO statistics will be collected for pools: %v", enableStatsForPools) + log.NamedDebug(nsName, logger, "RBD per-image IO statistics will be collected for pools: %v", enableStatsForPools) if len(enableStatsForPools) == 0 { err = monStore.Delete("mgr", "mgr/prometheus/rbd_stats_pools") } else { @@ -649,7 +653,7 @@ func configureRBDStats(clusterContext *clusterd.Context, clusterInfo *cephclient if err != nil { return errors.Wrapf(err, "failed to enable rbd_stats_pools") } - logger.Debug("configured RBD per-image IO statistics collection") + log.NamedDebug(nsName, logger, "configured RBD per-image IO statistics collection") return nil } @@ -672,6 +676,7 @@ func (r *ReconcileCephBlockPool) cancelMirrorMonitoring(cephBlockPool *cephv1.Ce } func (r *ReconcileCephBlockPool) disableMirroring(pool string) error { + nsName := opcontroller.NsName(r.clusterInfo.Namespace, pool) mirrorInfo, err := cephclient.GetPoolMirroringInfo(r.context, r.clusterInfo, pool) if err != nil { return errors.Wrapf(err, "failed to get mirroring info for the pool %q", pool) @@ -685,7 +690,7 @@ func (r *ReconcileCephBlockPool) disableMirroring(pool string) error { return errors.Wrap(err, "failed to check if any rados namespace is mirrored") } if mirroringEnabled { - logger.Debugf("disabling mirroring on pool %q is not possible. There are mirrored rados namespaces in the pool running in ceph cluster namespace %q", pool, r.clusterInfo.Namespace) + log.NamedDebug(nsName, logger, "disabling mirroring on pool is not possible. There are mirrored rados namespaces in the pool") return errors.New("mirroring must be disabled in all radosnamespaces in the pool before disabling mirroring in the pool") } @@ -697,7 +702,7 @@ func (r *ReconcileCephBlockPool) disableMirroring(pool string) error { if len(*mirroredPools.Images) > 0 { msg := fmt.Sprintf("there are images in the pool %q. Please manually disable mirroring for each image", pool) - logger.Errorf("%s", msg) + log.NamedError(nsName, logger, "%s", msg) return errors.New(msg) } } @@ -709,7 +714,7 @@ func (r *ReconcileCephBlockPool) disableMirroring(pool string) error { if err != nil { return errors.Wrapf(err, "failed to remove cluster peer with UUID %q for the pool %q", peer.UUID, pool) } - logger.Infof("successfully removed peer site %q for the pool %q", peer.UUID, pool) + log.NamedInfo(nsName, logger, "successfully removed peer site %q", peer.UUID) } } @@ -718,19 +723,20 @@ func (r *ReconcileCephBlockPool) disableMirroring(pool string) error { if err != nil { return errors.Wrapf(err, "failed to disable mirroring for pool %q", pool) } - logger.Infof("successfully disabled mirroring on the pool %q", pool) + log.NamedInfo(nsName, logger, "successfully disabled mirroring on the pool %q", pool) return nil } func (r *ReconcileCephBlockPool) isAnyRadosNamespaceMirrored(poolName string) (bool, error) { - logger.Debugf("list rados namespace in pool %q running in ceph cluster namespace %q", poolName, r.clusterInfo.Namespace) + nsName := opcontroller.NsName(r.clusterInfo.Namespace, poolName) + log.NamedDebug(nsName, logger, "list rados namespace in pool") list, err := cephclient.ListRadosNamespacesInPool(r.context, r.clusterInfo, poolName) if err != nil { return false, errors.Wrapf(err, "failed to list rados namespace in pool %q", poolName) } - logger.Debugf("rados namespace list %v in pool %q running in ceph cluster namespace %q", list, poolName, r.clusterInfo.Namespace) + log.NamedDebug(nsName, logger, "rados namespace list %v in pool", list) for _, namespace := range list { poolAndRadosNamespaceName := fmt.Sprintf("%s/%s", poolName, namespace) @@ -738,7 +744,7 @@ func (r *ReconcileCephBlockPool) isAnyRadosNamespaceMirrored(poolName string) (b if err != nil { return false, errors.Wrapf(err, "failed to get mirroring info for the rados namespace %q", poolAndRadosNamespaceName) } - logger.Debugf("mirroring info for the rados namespace %q running in ceph cluster namespace %q: %v", poolAndRadosNamespaceName, r.clusterInfo.Namespace, mirrorInfo) + log.NamedDebug(nsName, logger, "mirroring info for the rados namespace %q: %v", poolAndRadosNamespaceName, mirrorInfo) if mirrorInfo.Mode != "disabled" { return true, nil } diff --git a/pkg/operator/ceph/pool/dependents.go b/pkg/operator/ceph/pool/dependents.go index 0d20f4e6a..b32b9b8c5 100644 --- a/pkg/operator/ceph/pool/dependents.go +++ b/pkg/operator/ceph/pool/dependents.go @@ -23,7 +23,9 @@ import ( cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1" "github.com/rook/rook/pkg/clusterd" "github.com/rook/rook/pkg/daemon/ceph/client" + "github.com/rook/rook/pkg/operator/ceph/controller" "github.com/rook/rook/pkg/util/dependents" + "github.com/rook/rook/pkg/util/log" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -32,7 +34,7 @@ const radosNamespacesKeyName = "CephBlockPoolRadosNamespaces" // cephBlockPoolDependents returns the rbd namespaces (s) which exist in the rbd pool that should block // deletion. func cephBlockPoolDependents(clusterdCtx *clusterd.Context, clusterInfo *client.ClusterInfo, blockpool *cephv1.CephBlockPool) (*dependents.DependentList, error) { - nsName := fmt.Sprintf("%s/%s", blockpool.Namespace, blockpool.Name) + nsName := controller.NsName(blockpool.Namespace, blockpool.Name) baseErrMsg := fmt.Sprintf("failed to get dependents of CephBlockPool %q", nsName) deps := dependents.NewDependentList() @@ -46,7 +48,7 @@ func cephBlockPoolDependents(clusterdCtx *clusterd.Context, clusterInfo *client. if namespace.Spec.BlockPoolName == blockpool.Name { deps.Add(radosNamespacesKeyName, cephv1.GetRadosNamespaceName(&namespaces.Items[i])) } - logger.Debugf("found CephBlockPoolRadosNamespace %q that does not depend on CephBlockPool %q", namespace.Name, nsName) + log.NamedDebug(nsName, logger, "found CephBlockPoolRadosNamespace %q that does not depend on CephBlockPool %q", namespace.Name, blockpool.Name) } return deps, nil diff --git a/pkg/operator/ceph/pool/peers.go b/pkg/operator/ceph/pool/peers.go index 7d7d5ce1f..70046d0bb 100644 --- a/pkg/operator/ceph/pool/peers.go +++ b/pkg/operator/ceph/pool/peers.go @@ -21,6 +21,7 @@ import ( cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1" "github.com/rook/rook/pkg/daemon/ceph/client" opcontroller "github.com/rook/rook/pkg/operator/ceph/controller" + "github.com/rook/rook/pkg/util/log" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/reconcile" @@ -36,7 +37,7 @@ func (r *ReconcileCephBlockPool) reconcileAddBootstrapPeer(pool *cephv1.CephBloc // List all the peers secret, we can have more than one peer we might want to configure // For each, get the Kubernetes Secret and import the "peer token" so that we can configure the mirroring for _, peerSecret := range pool.Spec.Mirroring.Peers.SecretNames { - logger.Debugf("fetching bootstrap peer kubernetes secret %q", peerSecret) + log.NamedDebug(namespacedName, logger, "fetching bootstrap peer kubernetes secret %q", peerSecret) s, err := r.context.Clientset.CoreV1().Secrets(r.clusterInfo.Namespace).Get(r.opManagerContext, peerSecret, metav1.GetOptions{}) // We don't care about IsNotFound here, we still need to fail if err != nil { diff --git a/pkg/operator/ceph/pool/radosnamespace/controller.go b/pkg/operator/ceph/pool/radosnamespace/controller.go index 564d7fb96..7f855c9e7 100644 --- a/pkg/operator/ceph/pool/radosnamespace/controller.go +++ b/pkg/operator/ceph/pool/radosnamespace/controller.go @@ -33,6 +33,7 @@ import ( "github.com/rook/rook/pkg/operator/ceph/reporting" "github.com/rook/rook/pkg/operator/k8sutil" "github.com/rook/rook/pkg/util/dependents" + "github.com/rook/rook/pkg/util/log" "github.com/coreos/pkg/capnslog" "github.com/pkg/errors" @@ -152,7 +153,7 @@ func (r *ReconcileCephBlockPoolRadosNamespace) Reconcile(context context.Context // workaround because the rook logging mechanism is not compatible with the controller-runtime logging interface reconcileResponse, radosNamespace, err := r.reconcile(request) if err != nil { - logger.Errorf("failed to reconcile %q. %v", request.NamespacedName, err) + log.NamedError(request.NamespacedName, logger, "failed to reconcile. %v", err) } return reporting.ReportReconcileResult(logger, r.recorder, request, radosNamespace, reconcileResponse, err) @@ -165,7 +166,7 @@ func (r *ReconcileCephBlockPoolRadosNamespace) reconcile(request reconcile.Reque err := r.client.Get(r.opManagerContext, request.NamespacedName, radosNamespace) if err != nil { if kerrors.IsNotFound(err) { - logger.Debugf("cephBlockPoolRadosNamespace resource %q not found. Ignoring since object must be deleted.", namespacedName) + log.NamedDebug(namespacedName, logger, "cephBlockPoolRadosNamespace resource %q not found. Ignoring since object must be deleted.", namespacedName) return reconcile.Result{}, radosNamespace, nil } // Error reading the object - requeue the request. @@ -178,7 +179,7 @@ func (r *ReconcileCephBlockPoolRadosNamespace) reconcile(request reconcile.Reque return reconcile.Result{}, radosNamespace, errors.Wrap(err, "failed to add finalizer") } if generationUpdated { - logger.Infof("reconciling the rados namespace %q after adding finalizer", radosNamespace.Name) + log.NamedInfo(namespacedName, logger, "reconciling the rados namespace %q after adding finalizer", radosNamespace.Name) return reconcile.Result{}, radosNamespace, nil } @@ -234,10 +235,10 @@ func (r *ReconcileCephBlockPoolRadosNamespace) reconcile(request reconcile.Reque return reconcile.Result{}, radosNamespace, errors.Wrap(err, "failed to list cephBlockPoolRadosNamespace") } - logger.Debugf("delete cephBlockPoolRadosNamespace %q", namespacedName) + log.NamedDebug(namespacedName, logger, "delete cephBlockPoolRadosNamespace %q", namespacedName) // On external cluster, we don't delete the rados namespace, it has to be deleted manually if cephCluster.Spec.External.Enable { - logger.Warning("external rados namespace %q deletion is not supported, delete it manually", namespacedName) + log.NamedWarning(request.NamespacedName, logger, "external rados namespace deletion is not supported, delete it manually") } else if len(cephRNSList.Items) <= 1 { // If we have more than one cephBlockPoolRadosNamespace CR with same spec.blockPoolName and same spec.name, // skip the call to deleteRadosNamespace(). This allows the finalizer to be removed without @@ -249,7 +250,7 @@ func (r *ReconcileCephBlockPoolRadosNamespace) reconcile(request reconcile.Reque return opcontroller.WaitForRequeueIfFinalizerBlocked, radosNamespace, err } if strings.Contains(err.Error(), opcontroller.UninitializedCephConfigError) { - logger.Info(opcontroller.OperatorNotInitializedMessage) + log.NamedInfo(namespacedName, logger, opcontroller.OperatorNotInitializedMessage) return opcontroller.WaitForRequeueIfOperatorNotInitialized, radosNamespace, nil } return reconcile.Result{}, radosNamespace, errors.Wrapf(err, "failed to delete ceph blockpool rados namespace %q", radosNamespace.Name) @@ -258,7 +259,7 @@ func (r *ReconcileCephBlockPoolRadosNamespace) reconcile(request reconcile.Reque // We must remove it first otherwise the checker will panic since the status/info will be nil r.cancelMirrorMonitoring(radosNamespaceChannelKeyName(radosNamespace.Namespace, poolAndRadosNamespaceName)) } else { - logger.Infof("Removing finalizer from RNS CR %s without checking if the radosnamespaceName contains any data since more than one RNS(count %d) contains the same blockPool and rados name", radosNamespace.Name, len(cephRNSList.Items)) + log.NamedInfo(namespacedName, logger, "Removing finalizer from RNS without checking if the radosnamespaceName contains any data since more than one RNS(count %d) contains the same blockPool and rados name", len(cephRNSList.Items)) } if len(cephRNSList.Items) <= 1 { @@ -281,7 +282,7 @@ func (r *ReconcileCephBlockPoolRadosNamespace) reconcile(request reconcile.Reque radosNamespaceName := cephv1.GetRadosNamespaceName(radosNamespace) if cephCluster.Spec.External.Enable { - logger.Debug("skip creating external radosnamespace in external mode, create it manually, the controller will assume it's there") + log.NamedDebug(namespacedName, logger, "skip creating external radosnamespace in external mode, create it manually, the controller will assume it's there") err = r.updateClusterConfig(radosNamespace, cephCluster) if err != nil { return reconcile.Result{}, radosNamespace, errors.Wrap(err, "failed to save cluster config") @@ -332,7 +333,7 @@ func (r *ReconcileCephBlockPoolRadosNamespace) reconcile(request reconcile.Reque err = r.createOrUpdateRadosNamespace(radosNamespace) if err != nil { if strings.Contains(err.Error(), opcontroller.UninitializedCephConfigError) { - logger.Info(opcontroller.OperatorNotInitializedMessage) + log.NamedInfo(namespacedName, logger, opcontroller.OperatorNotInitializedMessage) return opcontroller.WaitForRequeueIfOperatorNotInitialized, radosNamespace, nil } r.updateStatus(r.client, request.NamespacedName, cephv1.ConditionFailure) @@ -359,7 +360,7 @@ func (r *ReconcileCephBlockPoolRadosNamespace) reconcile(request reconcile.Reque } // Return and do not requeue - logger.Debugf("done reconciling cephBlockPoolRadosNamespace %q", namespacedName) + log.NamedDebug(namespacedName, logger, "done reconciling cephBlockPoolRadosNamespace") return reconcile.Result{}, radosNamespace, nil } @@ -398,11 +399,11 @@ func (r *ReconcileCephBlockPoolRadosNamespace) updateClusterConfig(cephBlockPool // Create the ceph blockpool rados namespace func (r *ReconcileCephBlockPoolRadosNamespace) createOrUpdateRadosNamespace(cephBlockPoolRadosNamespace *cephv1.CephBlockPoolRadosNamespace) error { - namespacedName := fmt.Sprintf("%s/%s", cephBlockPoolRadosNamespace.Namespace, cephBlockPoolRadosNamespace.Name) - logger.Infof("creating ceph blockpool rados namespace %q", namespacedName) + nsName := opcontroller.NsName(cephBlockPoolRadosNamespace.Namespace, cephBlockPoolRadosNamespace.Name) + log.NamedInfo(nsName, logger, "creating ceph blockpool rados namespace") if cephv1.GetRadosNamespaceName(cephBlockPoolRadosNamespace) == "" { - logger.Infof("can't create empty radosnamespace %q in the namespace %q as it is already present", cephBlockPoolRadosNamespace.Name, cephBlockPoolRadosNamespace.Namespace) + log.NamedInfo(nsName, logger, "can't create empty radosnamespace as it is already present") return nil } err := cephclient.CreateRadosNamespace(r.context, r.clusterInfo, cephBlockPoolRadosNamespace.Spec.BlockPoolName, cephv1.GetRadosNamespaceName(cephBlockPoolRadosNamespace)) @@ -415,12 +416,12 @@ func (r *ReconcileCephBlockPoolRadosNamespace) createOrUpdateRadosNamespace(ceph // Delete the ceph blockpool rados namespace func (r *ReconcileCephBlockPoolRadosNamespace) deleteRadosNamespace(radosNamespace *cephv1.CephBlockPoolRadosNamespace, cephCluster *cephv1.CephCluster) (bool, error) { - nsName := types.NamespacedName{Namespace: radosNamespace.Namespace, Name: radosNamespace.Name} - logger.Infof("deleting rados namespace %q", nsName.String()) + nsName := opcontroller.NsName(radosNamespace.Namespace, radosNamespace.Name) + log.NamedInfo(nsName, logger, "deleting rados namespace %q", nsName.String()) name := cephv1.GetRadosNamespaceName(radosNamespace) if name == "" { - logger.Info("no need to delete implicit radosnamepace") + log.NamedInfo(nsName, logger, "no need to delete implicit radosnamepace") return false, nil } @@ -437,12 +438,12 @@ func (r *ReconcileCephBlockPoolRadosNamespace) deleteRadosNamespace(radosNamespa false, fmt.Sprintf("rados namespace %q is empty and can be deleted", radosNamespace.Name)) } - logger.Info(emptyCondition.Message) + log.NamedInfo(nsName, logger, "%s", emptyCondition.Message) err := reporting.UpdateStatusConditionsWithRetry( r.opManagerContext, r.client, radosNamespace, nsName, radosNamespace.Kind, emptyCondition) if err != nil { - logger.Warningf("failed to update %q status with deletion blocked conditions: %v", nsName.String(), err) + log.NamedWarning(nsName, logger, "failed to update %q status with deletion blocked conditions: %v", nsName.String(), err) } if containsImages { @@ -459,7 +460,7 @@ func (r *ReconcileCephBlockPoolRadosNamespace) deleteRadosNamespace(radosNamespa return containsImages, errors.Wrapf(deleteErr, "failed to delete rados namespace %q", radosNamespace.Name) } - logger.Infof("deleted rados namespace %q", nsName.String()) + log.NamedInfo(nsName, logger, "deleted rados namespace %q", nsName.String()) return false, nil } @@ -469,7 +470,7 @@ func (r *ReconcileCephBlockPoolRadosNamespace) updateStatus(client client.Client cephBlockPoolRadosNamespace := &cephv1.CephBlockPoolRadosNamespace{} if err := client.Get(r.opManagerContext, name, cephBlockPoolRadosNamespace); err != nil { if kerrors.IsNotFound(err) { - logger.Debugf("CephBlockPoolRadosNamespace resource %q not found. Ignoring since object must be deleted.", name) + log.NamedDebug(name, logger, "CephBlockPoolRadosNamespace resource %q not found. Ignoring since object must be deleted.", name) return nil } return errors.Wrapf(err, "failed to retrieve ceph blockpool rados namespace %q to update status to %q", name, status) @@ -486,10 +487,10 @@ func (r *ReconcileCephBlockPoolRadosNamespace) updateStatus(client client.Client return nil }) if err != nil { - logger.Errorf("failed to update ceph blockpool rados namespace %q status to %q after retries. %v", name, status, err) + log.NamedError(name, logger, "failed to update ceph blockpool rados namespace %q status to %q after retries. %v", name, status, err) return } - logger.Debugf("ceph blockpool rados namespace %q status updated to %q", name, status) + log.NamedDebug(name, logger, "ceph blockpool rados namespace %q status updated to %q", name, status) } func buildClusterID(cephBlockPoolRadosNamespace *cephv1.CephBlockPoolRadosNamespace) string { @@ -501,7 +502,8 @@ func buildClusterID(cephBlockPoolRadosNamespace *cephv1.CephBlockPoolRadosNamesp } func (r *ReconcileCephBlockPoolRadosNamespace) cleanup(radosNamespace *cephv1.CephBlockPoolRadosNamespace, cephCluster *cephv1.CephCluster) error { - logger.Infof("starting cleanup of the ceph resources for radosNamespace %q in namespace %q", radosNamespace.Name, radosNamespace.Namespace) + nsName := opcontroller.NsName(radosNamespace.Namespace, radosNamespace.Name) + log.NamedInfo(nsName, logger, "starting cleanup of the ceph resources for radosNamespace %q in namespace %q", radosNamespace.Name, radosNamespace.Namespace) cleanupConfig := map[string]string{ opcontroller.CephBlockPoolNameEnv: radosNamespace.Spec.BlockPoolName, opcontroller.CephBlockPoolRadosNamespaceEnv: cephv1.GetRadosNamespaceName(radosNamespace), @@ -520,6 +522,7 @@ func checkBlockPoolMirroring(cephBlockPool *cephv1.CephBlockPool) bool { } func (r *ReconcileCephBlockPoolRadosNamespace) reconcileMirroring(cephBlockPoolRadosNamespace *cephv1.CephBlockPoolRadosNamespace, cephBlockPool *cephv1.CephBlockPool) error { + nsName := opcontroller.NsName(cephBlockPoolRadosNamespace.Namespace, cephBlockPoolRadosNamespace.Name) poolAndRadosNamespaceName := fmt.Sprintf("%s/%s", cephBlockPool.Name, cephv1.GetRadosNamespaceName(cephBlockPoolRadosNamespace)) if cephv1.GetRadosNamespaceName(cephBlockPoolRadosNamespace) == "" { poolAndRadosNamespaceName = cephBlockPool.Name @@ -567,10 +570,10 @@ func (r *ReconcileCephBlockPoolRadosNamespace) reconcileMirroring(cephBlockPoolR // Run the goroutine to update the mirroring status // use the monitoring settings from the cephBlockPool CR if !cephBlockPool.Spec.StatusCheck.Mirror.Disabled { - logger.Debugf("starting mirror monitoring for radosnamespace %q", poolAndRadosNamespaceName) + log.NamedDebug(nsName, logger, "starting mirror monitoring for radosnamespace") // Start monitoring of the radosNamespace if r.radosNamespaceContexts[radosNamespaceChannelKey].started { - logger.Debug("radosnamespace monitoring go routine already running!") + log.NamedDebug(nsName, logger, "radosnamespace monitoring go routine already running!") } else { r.radosNamespaceContexts[radosNamespaceChannelKey].started = true go checker.CheckMirroring(r.radosNamespaceContexts[radosNamespaceChannelKey].internalCtx) diff --git a/pkg/operator/ceph/pool/status.go b/pkg/operator/ceph/pool/status.go index 24e226181..b03c5b2fb 100644 --- a/pkg/operator/ceph/pool/status.go +++ b/pkg/operator/ceph/pool/status.go @@ -24,6 +24,7 @@ import ( opcontroller "github.com/rook/rook/pkg/operator/ceph/controller" "github.com/rook/rook/pkg/operator/ceph/reporting" "github.com/rook/rook/pkg/operator/k8sutil" + "github.com/rook/rook/pkg/util/log" kerrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/util/retry" @@ -36,10 +37,10 @@ func (r *ReconcileCephBlockPool) updateStatus(poolName types.NamespacedName, sta err := r.client.Get(r.opManagerContext, poolName, pool) if err != nil { if kerrors.IsNotFound(err) { - logger.Debug("CephBlockPool resource not found. Ignoring since object must be deleted.") + log.NamedDebug(poolName, logger, "CephBlockPool resource not found. Ignoring since object must be deleted.") return nil } - logger.Warningf("failed to retrieve pool %q to update status to %q. %v", poolName, status, err) + log.NamedWarning(poolName, logger, "failed to retrieve pool %q to update status to %q. %v", poolName, status, err) return errors.Wrapf(err, "failed to retrieve pool %q to update status to %q", poolName, status) } @@ -63,14 +64,14 @@ func (r *ReconcileCephBlockPool) updateStatus(poolName types.NamespacedName, sta } if err := reporting.UpdateStatus(r.client, pool); err != nil { - logger.Warningf("failed to set pool %q status to %q. %v", pool.Name, status, err) + log.NamedWarning(poolName, logger, "failed to set pool %q status to %q. %v", pool.Name, status, err) return errors.Wrapf(err, "failed to set pool %q status to %q", pool.Name, status) } - logger.Debugf("pool %q status updated to %q", poolName, status) + log.NamedDebug(poolName, logger, "pool %q status updated to %q", poolName, status) return nil }) if err != nil { - logger.Error(err) + log.NamedError(poolName, logger, "%s", err.Error()) } return nil @@ -101,12 +102,13 @@ func updateStatusInfo(cephBlockPool *cephv1.CephBlockPool) { } func (r *ReconcileCephBlockPool) updatePoolID(cephBlockPool *cephv1.CephBlockPool) { + nsName := opcontroller.NsName(cephBlockPool.Namespace, cephBlockPool.Name) poolName := cephBlockPool.ToNamedPoolSpec().Name poolDetails, err := cephclient.GetPoolDetails(r.context, r.clusterInfo, poolName) if err != nil { - logger.Warningf("failed to get pool details for cephBlockPool %q", poolName) + log.NamedWarning(nsName, logger, "failed to get pool details for cephBlockPool") return } - logger.Infof("set pool ID %d to cephBlockPool %q status", poolDetails.Number, poolName) + log.NamedInfo(nsName, logger, "set pool ID %d to cephBlockPool status", poolDetails.Number) cephBlockPool.Status.PoolID = poolDetails.Number } diff --git a/pkg/operator/ceph/pool/validate.go b/pkg/operator/ceph/pool/validate.go index 310f8136d..a31416f5a 100644 --- a/pkg/operator/ceph/pool/validate.go +++ b/pkg/operator/ceph/pool/validate.go @@ -22,6 +22,7 @@ import ( cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1" "github.com/rook/rook/pkg/clusterd" cephclient "github.com/rook/rook/pkg/daemon/ceph/client" + "github.com/rook/rook/pkg/util/log" ) // validatePool Validate the pool arguments @@ -142,7 +143,7 @@ func ValidatePoolSpec(context *clusterd.Context, clusterInfo *cephclient.Cluster // validate pool compression mode if specified if p.CompressionMode != "" { - logger.Warning("compressionMode is DEPRECATED, use Parameters instead") + log.NamespacedWarning(clusterInfo.Namespace, logger, "compressionMode is DEPRECATED, use Parameters instead") } // Test the same for Parameters @@ -177,7 +178,7 @@ func ValidatePoolSpec(context *clusterd.Context, clusterInfo *cephclient.Cluster } if !p.Mirroring.Enabled && p.Mirroring.SnapshotSchedulesEnabled() { - logger.Warning("mirroring must be enabled to configure snapshot scheduling") + log.NamespacedWarning(clusterInfo.Namespace, logger, "mirroring must be enabled to configure snapshot scheduling") } return nil