Skip to content

Commit

Permalink
feat(MeshService): add events when generating from Kubernetes Service (
Browse files Browse the repository at this point in the history
…#10290)

Also sets `k8s.kuma.io/service-name`

Signed-off-by: Mike Beaumont <[email protected]>
  • Loading branch information
michaelbeaumont authored May 21, 2024
1 parent 5631efc commit 960380b
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 10 deletions.
36 changes: 32 additions & 4 deletions pkg/plugins/runtime/k8s/controllers/meshservice_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
kube_runtime "k8s.io/apimachinery/pkg/runtime"
kube_types "k8s.io/apimachinery/pkg/types"
kube_record "k8s.io/client-go/tools/record"
kube_ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/builder"
kube_client "sigs.k8s.io/controller-runtime/pkg/client"
Expand All @@ -30,9 +31,22 @@ import (
"github.com/kumahq/kuma/pkg/util/pointer"
)

const (
// CreatedMeshServiceReason is added to an event when
// a new MeshService is successfully created.
CreatedMeshServiceReason = "CreatedMeshService"
// UpdatedMeshServiceReason is added to an event when
// an existing MeshService is successfully updated.
UpdatedMeshServiceReason = "UpdatedMeshService"
// FailedToGenerateMeshServiceReason is added to an event when
// a MeshService cannot be generated.
FailedToGenerateMeshServiceReason = "FailedToGenerateMeshService"
)

// MeshServiceReconciler reconciles a MeshService object
type MeshServiceReconciler struct {
kube_client.Client
kube_record.EventRecorder
Log logr.Logger
Scheme *kube_runtime.Scheme
}
Expand Down Expand Up @@ -101,16 +115,22 @@ func (r *MeshServiceReconciler) Reconcile(ctx context.Context, req kube_ctrl.Req
Namespace: svc.GetNamespace(),
},
}
if err := kube_controllerutil.SetOwnerReference(svc, ms, r.Scheme); err != nil {
return kube_ctrl.Result{}, errors.Wrap(err, "could not set owner reference")
}

operationResult, err := kube_controllerutil.CreateOrUpdate(ctx, r.Client, ms, func() error {
if ms.ObjectMeta.GetGeneration() != 0 {
if owners := ms.GetOwnerReferences(); len(owners) == 0 || owners[0].UID != svc.GetUID() {
r.EventRecorder.Eventf(
svc, kube_core.EventTypeWarning, FailedToGenerateMeshServiceReason, "MeshService already exists and isn't owned by Service",
)
return errors.Errorf("MeshService already exists and isn't owned by Service")
}
}
ms.ObjectMeta.Labels = maps.Clone(svc.GetLabels())
if ms.ObjectMeta.Labels == nil {
ms.ObjectMeta.Labels = map[string]string{}
}
ms.ObjectMeta.Labels[mesh_proto.MeshTag] = mesh
ms.ObjectMeta.Labels[metadata.KumaSerivceName] = svc.GetName()
if ms.Spec == nil {
ms.Spec = &meshservice_api.MeshService{}
}
Expand Down Expand Up @@ -139,12 +159,20 @@ func (r *MeshServiceReconciler) Reconcile(ctx context.Context, req kube_ctrl.Req
IP: svc.Spec.ClusterIP,
},
}
if err := kube_controllerutil.SetOwnerReference(svc, ms, r.Scheme); err != nil {
return errors.Wrap(err, "could not set owner reference")
}
return nil
})
if err != nil {
return kube_ctrl.Result{}, err
}

switch operationResult {
case kube_controllerutil.OperationResultCreated:
r.EventRecorder.Eventf(svc, kube_core.EventTypeNormal, CreatedMeshServiceReason, "Created Kuma MeshService: %s", ms.Name)
case kube_controllerutil.OperationResultUpdated:
r.EventRecorder.Eventf(svc, kube_core.EventTypeNormal, UpdatedMeshServiceReason, "Updated Kuma MeshService: %s", ms.Name)
}
log.V(1).Info("mesh service reconciled", "result", operationResult)
return kube_ctrl.Result{}, nil
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
kube_core "k8s.io/api/core/v1"
kube_errors "k8s.io/apimachinery/pkg/api/errors"
kube_types "k8s.io/apimachinery/pkg/types"
kube_record "k8s.io/client-go/tools/record"
kube_ctrl "sigs.k8s.io/controller-runtime"
kube_client "sigs.k8s.io/controller-runtime/pkg/client"
kube_client_fake "sigs.k8s.io/controller-runtime/pkg/client/fake"
Expand Down Expand Up @@ -62,9 +63,10 @@ var _ = Describe("MeshServiceController", func() {
Build()

reconciler = &MeshServiceReconciler{
Client: kubeClient,
Log: logr.Discard(),
Scheme: k8sClientScheme,
Client: kubeClient,
Log: logr.Discard(),
Scheme: k8sClientScheme,
EventRecorder: kube_record.NewFakeRecorder(10),
}

key := kube_types.NamespacedName{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
metadata:
creationTimestamp: null
labels:
k8s.kuma.io/service-name: example
kuma.io/mesh: default
name: example
namespace: demo
Expand Down
3 changes: 3 additions & 0 deletions pkg/plugins/runtime/k8s/metadata/annotations.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,9 @@ const (
KumaInitFirst = "kuma.io/init-first"
// KumaWaitForDataplaneReady allows to specify if the application sidecar should be hold until Envoy is ready
KumaWaitForDataplaneReady = "kuma.io/wait-for-dataplane-ready"

// KumaServiceName points to the Service that a MeshService is derived from
KumaSerivceName = "k8s.kuma.io/service-name"
)

var PodAnnotationDeprecations = []Deprecation{
Expand Down
7 changes: 4 additions & 3 deletions pkg/plugins/runtime/k8s/plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,9 +142,10 @@ func addServiceReconciler(mgr kube_ctrl.Manager) error {

func addMeshServiceReconciler(mgr kube_ctrl.Manager) error {
reconciler := &k8s_controllers.MeshServiceReconciler{
Client: mgr.GetClient(),
Log: core.Log.WithName("controllers").WithName("MeshService"),
Scheme: mgr.GetScheme(),
Client: mgr.GetClient(),
Log: core.Log.WithName("controllers").WithName("MeshService"),
Scheme: mgr.GetScheme(),
EventRecorder: mgr.GetEventRecorderFor("k8s.kuma.io/mesh-service-generator"),
}
return reconciler.SetupWithManager(mgr)
}
Expand Down

0 comments on commit 960380b

Please sign in to comment.