Skip to content

Commit

Permalink
use contextual logging
Browse files Browse the repository at this point in the history
  • Loading branch information
fabriziopandini committed Dec 22, 2022
1 parent 69b84ec commit 87890f1
Show file tree
Hide file tree
Showing 7 changed files with 1,151 additions and 277 deletions.
112 changes: 57 additions & 55 deletions controllers/kubemarkmachine_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ import (
"time"

"github.com/Masterminds/semver"
"github.com/go-logr/logr"
infrav1 "github.com/kubernetes-sigs/cluster-api-provider-kubemark/api/v1alpha4"
v1 "k8s.io/api/core/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/resource"
Expand All @@ -56,8 +56,6 @@ import (
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
"sigs.k8s.io/controller-runtime/pkg/handler"
"sigs.k8s.io/controller-runtime/pkg/source"

infrav1 "github.com/kubernetes-sigs/cluster-api-provider-kubemark/api/v1alpha4"
)

const (
Expand All @@ -71,7 +69,6 @@ const (
type KubemarkMachineReconciler struct {
client.Client
KubemarkCluster KubemarkCluster
Log logr.Logger
Scheme *runtime.Scheme
KubemarkImage string
}
Expand All @@ -86,32 +83,55 @@ type KubemarkMachineReconciler struct {
// +kubebuilder:rbac:groups="",resources=pods,verbs=create;delete

func (r *KubemarkMachineReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
logger := r.Log.WithValues("kubemarkmachine", req.NamespacedName)
log := ctrl.LoggerFrom(ctx).WithValues("kubemarkmachine", req.NamespacedName)

kubemarkMachine := &infrav1.KubemarkMachine{}
err := r.Get(ctx, req.NamespacedName, kubemarkMachine)
if err != nil {
if apierrors.IsNotFound(err) {
return ctrl.Result{}, nil
}
logger.Error(err, "error finding kubemark machine")
log.Error(err, "error finding kubemark machine")
return ctrl.Result{}, err
}

// Fetch the Machine.
machine, err := util.GetOwnerMachine(ctx, r.Client, kubemarkMachine.ObjectMeta)
if err != nil {
log.Error(err, "error finding owner machine")
return ctrl.Result{}, err
}
if machine == nil {
log.Info("Machine Controller has not yet set OwnerRef")
return ctrl.Result{}, nil
}

log = log.WithValues("machine", machine.Name)

// Fetch the Cluster.
cluster, err := util.GetClusterFromMetadata(ctx, r.Client, machine.ObjectMeta)
if err != nil {
log.Info("Machine is missing cluster label or cluster does not exist")
return ctrl.Result{}, nil
}
log = log.WithValues("cluster", cluster.Name)
ctx = ctrl.LoggerInto(ctx, log)

helper, err := patch.NewHelper(kubemarkMachine, r.Client)
if err != nil {
return ctrl.Result{}, fmt.Errorf("failed to init patch helper: %w", err)
}

controllerutil.AddFinalizer(kubemarkMachine, infrav1.MachineFinalizer)
if err := helper.Patch(ctx, kubemarkMachine); err != nil {
logger.Error(err, "failed to add finalizer")
log.Error(err, "failed to add finalizer")
return ctrl.Result{}, err
}

defer func() {
if err := helper.Patch(ctx, kubemarkMachine); err != nil {
if !apierrors.IsNotFound(err) {
logger.Error(err, "failed to patch kubemarkMachine")
log.Error(err, "failed to patch kubemarkMachine")
}
}
}()
Expand All @@ -122,12 +142,12 @@ func (r *KubemarkMachineReconciler) Reconcile(ctx context.Context, req ctrl.Requ
}

if kubemarkClusterClient == nil {
logger.Info("Waiting for kubemark cluster client...")
log.Info("Waiting for kubemark cluster client...")
return ctrl.Result{RequeueAfter: 10 * time.Second}, nil
}

if !kubemarkMachine.ObjectMeta.DeletionTimestamp.IsZero() {
logger.Info("deleting machine")
log.Info("deleting machine")

if err := kubemarkClusterClient.Delete(ctx, &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Expand All @@ -136,7 +156,7 @@ func (r *KubemarkMachineReconciler) Reconcile(ctx context.Context, req ctrl.Requ
},
}); err != nil {
if !apierrors.IsNotFound(err) {
logger.Error(err, "error deleting kubemark pod")
log.Error(err, "error deleting kubemark pod")
return ctrl.Result{}, err
}
}
Expand All @@ -147,7 +167,7 @@ func (r *KubemarkMachineReconciler) Reconcile(ctx context.Context, req ctrl.Requ
},
}); err != nil {
if !apierrors.IsNotFound(err) {
logger.Error(err, "error deleting kubemark configMap")
log.Error(err, "error deleting kubemark configMap")
return ctrl.Result{}, err
}
}
Expand All @@ -156,54 +176,34 @@ func (r *KubemarkMachineReconciler) Reconcile(ctx context.Context, req ctrl.Requ
}

if kubemarkMachine.Status.Ready {
logger.Info("machine already ready, skipping reconcile")
log.Info("machine already ready, skipping reconcile")
return ctrl.Result{}, err
}

// Fetch the Machine.
machine, err := util.GetOwnerMachine(ctx, r.Client, kubemarkMachine.ObjectMeta)
if err != nil {
logger.Error(err, "error finding owner machine")
return ctrl.Result{}, err
}
if machine == nil {
logger.Info("Machine Controller has not yet set OwnerRef")
return ctrl.Result{}, nil
}
machinePatchHelper, err := patch.NewHelper(machine, r.Client)
if err != nil {
return ctrl.Result{}, fmt.Errorf("failed to init patch helper: %w", err)
}
defer func() {
if err := machinePatchHelper.Patch(ctx, machine); err != nil {
if !apierrors.IsNotFound(err) {
logger.Error(err, "failed to patch machine")
log.Error(err, "failed to patch machine")
}
}
}()

logger = logger.WithValues("machine", machine.Name)

// Fetch the Cluster.
cluster, err := util.GetClusterFromMetadata(ctx, r.Client, machine.ObjectMeta)
restConfig, err := getRemoteCluster(ctx, r.Client, cluster)
if err != nil {
logger.Info("Machine is missing cluster label or cluster does not exist")
return ctrl.Result{}, nil
}
logger = logger.WithValues("cluster", cluster.Name)

restConfig, err := getRemoteCluster(ctx, logger, r.Client, cluster)
if err != nil {
logger.Error(err, "error getting remote cluster")
log.Error(err, "error getting remote cluster")
return ctrl.Result{}, err
}

if !cluster.Status.InfrastructureReady {
logger.Info("Cluster infrastructure is not ready yet")
log.Info("Cluster infrastructure is not ready yet")
return ctrl.Result{}, nil
}
if machine.Spec.Bootstrap.DataSecretName == nil {
logger.Info("Bootstrap data secret reference is not yet available")
log.Info("Bootstrap data secret reference is not yet available")
return ctrl.Result{}, nil
}

Expand All @@ -212,30 +212,30 @@ func (r *KubemarkMachineReconciler) Reconcile(ctx context.Context, req ctrl.Requ
Name: secret.Name(cluster.Name, secret.ClusterCA),
Namespace: cluster.Namespace,
}, &caSecret); err != nil {
logger.Error(err, "error getting cluster CA secret")
log.Error(err, "error getting cluster CA secret")
return ctrl.Result{}, err
}

privateKey, err := ecdsa.GenerateKey(elliptic.P256(), cryptorand.Reader)
if err != nil {
logger.Error(err, "failed to generate private key")
log.Error(err, "failed to generate private key")
return ctrl.Result{}, err
}
der, err := x509.MarshalECPrivateKey(privateKey)
if err != nil {
logger.Error(err, "failed to marshal the private key to DER")
log.Error(err, "failed to marshal the private key to DER")
return ctrl.Result{}, err
}
keyPEM := pem.EncodeToMemory(&pem.Block{Type: keyutil.ECPrivateKeyBlockType, Bytes: der})

caCert, err := certs.DecodeCertPEM(caSecret.Data[secret.TLSCrtDataName])
if err != nil {
logger.Error(err, "failed to decode ca certificate")
log.Error(err, "failed to decode ca certificate")
return ctrl.Result{}, err
}
caKey, err := certs.DecodePrivateKeyPEM(caSecret.Data[secret.TLSKeyDataName])
if err != nil {
logger.Error(err, "err decoding ca private key")
log.Error(err, "err decoding ca private key")
return ctrl.Result{}, err
}

Expand All @@ -255,23 +255,23 @@ func (r *KubemarkMachineReconciler) Reconcile(ctx context.Context, req ctrl.Requ
}
certBytes, err := x509.CreateCertificate(cryptorand.Reader, kubeletCert, caCert, &privateKey.PublicKey, caKey)
if err != nil {
logger.Error(err, "err creating kubelet certificate")
log.Error(err, "err creating kubelet certificate")
return ctrl.Result{}, err
}

kubeconfig, err := generateCertificateKubeconfig(restConfig, "/kubeconfig/cert.pem")
if err != nil {
logger.Error(err, "err generating certificate kubeconfig")
log.Error(err, "err generating certificate kubeconfig")
return ctrl.Result{}, err
}

stackedCert := bytes.Buffer{}
if err := pem.Encode(&stackedCert, &pem.Block{Type: cert.CertificateBlockType, Bytes: certBytes}); err != nil {
logger.Error(err, "err encoding certificate")
log.Error(err, "err encoding certificate")
return ctrl.Result{}, err
}
if _, err := stackedCert.Write(keyPEM); err != nil {
logger.Error(err, "err writing pem bytes")
log.Error(err, "err writing pem bytes")
return ctrl.Result{}, err
}

Expand All @@ -287,14 +287,14 @@ func (r *KubemarkMachineReconciler) Reconcile(ctx context.Context, req ctrl.Requ
}
if err := kubemarkClusterClient.Create(ctx, secret); err != nil {
if !apierrors.IsAlreadyExists(err) {
logger.Error(err, "failed to create secret")
log.Error(err, "failed to create secret")
return ctrl.Result{}, err
}
}
version := machine.Spec.Version
if version == nil {
err := errors.New("Machine has no spec.version")
logger.Error(err, "")
log.Error(err, "")
return ctrl.Result{}, err
}

Expand All @@ -310,12 +310,12 @@ func (r *KubemarkMachineReconciler) Reconcile(ctx context.Context, req ctrl.Requ
// TODO remove the version check once 1.22.0 is no longer supported.
c, err := semver.NewConstraint(">= 1.22.0")
if err != nil {
logger.Error(err, "Unable to create version constraint")
log.Error(err, "Unable to create version constraint")
return ctrl.Result{}, err
}
v, err := semver.NewVersion(*version)
if err != nil {
logger.Error(err, "Unable to create version constraint")
log.Error(err, "Unable to create version constraint")
return ctrl.Result{}, err
}

Expand All @@ -326,7 +326,7 @@ func (r *KubemarkMachineReconciler) Reconcile(ctx context.Context, req ctrl.Requ
} else {
if kubemarkMachine.Spec.KubemarkOptions.ExtendedResources != nil {
err := errors.New("Kubernetes version is too low to support extended resources, must be >=1.22.0")
logger.Error(err, "observed version: %s", *version)
log.Error(err, "observed version: %s", *version)
return ctrl.Result{}, err
}
}
Expand Down Expand Up @@ -405,7 +405,7 @@ func (r *KubemarkMachineReconciler) Reconcile(ctx context.Context, req ctrl.Requ

if err = kubemarkClusterClient.Create(ctx, pod); err != nil {
if !apierrors.IsAlreadyExists(err) {
logger.Error(err, "failed to create pod")
log.Error(err, "failed to create pod")
return ctrl.Result{}, err
}
}
Expand Down Expand Up @@ -473,10 +473,12 @@ func generateCertificateKubeconfig(bootstrapClientConfig *restclient.Config, pem
return runtime.Encode(clientcmdlatest.Codec, kubeconfigData)
}

func getRemoteCluster(ctx context.Context, logger logr.Logger, mgmtClient client.Reader, cluster *clusterv1.Cluster) (*restclient.Config, error) {
func getRemoteCluster(ctx context.Context, mgmtClient client.Reader, cluster *clusterv1.Cluster) (*restclient.Config, error) {
log := ctrl.LoggerFrom(ctx)

restConfig, err := remote.RESTConfig(ctx, MachineControllerName, mgmtClient, util.ObjectKey(cluster))
if err != nil {
logger.Error(err, "error getting restconfig")
log.Error(err, "error getting restconfig")
return nil, err
}
restConfig.Timeout = 30 * time.Second
Expand Down
8 changes: 3 additions & 5 deletions controllers/kubemarkmachinetemplate_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import (
"fmt"
"reflect"

"github.com/go-logr/logr"
infrav1 "github.com/kubernetes-sigs/cluster-api-provider-kubemark/api/v1alpha4"
corev1 "k8s.io/api/core/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors"
Expand All @@ -33,20 +32,19 @@ import (

type KubemarkMachineTemplateReconciler struct {
client.Client
Log logr.Logger
Scheme *runtime.Scheme
}

// +kubebuilder:rbac:groups=infrastructure.cluster.x-k8s.io,resources=kubemarkmachinetemplates,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=infrastructure.cluster.x-k8s.io,resources=kubemarkmachinetemplates/status,verbs=get;update;patch

func (r *KubemarkMachineTemplateReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
logger := r.Log.WithValues("kubemarkmachinetemplate", req.NamespacedName)
log := ctrl.LoggerFrom(ctx).WithValues("kubemarkmachinetemplate", req.NamespacedName)
updateRequired := false

var machineTemplate infrav1.KubemarkMachineTemplate
if err := r.Get(ctx, req.NamespacedName, &machineTemplate); err != nil {
logger.Error(err, "unable to fetch KubemarkMachineTemplate")
log.Error(err, "unable to fetch KubemarkMachineTemplate")
return ctrl.Result{}, client.IgnoreNotFound(err)
}

Expand All @@ -71,7 +69,7 @@ func (r *KubemarkMachineTemplateReconciler) Reconcile(ctx context.Context, req c
if updateRequired {
if err := helper.Patch(ctx, &machineTemplate); err != nil {
if !apierrors.IsNotFound(err) {
logger.Error(err, "failed to patch machineTemplate")
log.Error(err, "failed to patch machineTemplate")
return ctrl.Result{}, err
}
}
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ go 1.19

require (
github.com/Masterminds/semver v1.5.0
github.com/go-logr/logr v1.2.3
github.com/pkg/errors v0.9.1
k8s.io/api v0.25.0
k8s.io/apimachinery v0.25.0
Expand All @@ -23,6 +22,7 @@ require (
github.com/emicklei/go-restful/v3 v3.9.0 // indirect
github.com/evanphx/json-patch/v5 v5.6.0 // indirect
github.com/fsnotify/fsnotify v1.6.0 // indirect
github.com/go-logr/logr v1.2.3 // indirect
github.com/go-openapi/jsonpointer v0.19.5 // indirect
github.com/go-openapi/jsonreference v0.20.0 // indirect
github.com/go-openapi/swag v0.22.3 // indirect
Expand Down

0 comments on commit 87890f1

Please sign in to comment.