Skip to content

Commit

Permalink
refactor: label translation
Browse files Browse the repository at this point in the history
  • Loading branch information
FabianKramm committed Jul 23, 2024
1 parent d4e0441 commit c4ab0e3
Show file tree
Hide file tree
Showing 26 changed files with 235 additions and 264 deletions.
13 changes: 8 additions & 5 deletions pkg/controllers/generic/export_patcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,10 @@ type exportPatcher struct {

var _ ObjectPatcher = &exportPatcher{}

func (e *exportPatcher) ServerSideApply(_ *synccontext.SyncContext, fromObj, destObj, sourceObj client.Object) error {
func (e *exportPatcher) ServerSideApply(ctx *synccontext.SyncContext, fromObj, destObj, sourceObj client.Object) error {
return patches.ApplyPatches(destObj, sourceObj, e.config.Patches, e.config.ReversePatches, &virtualToHostNameResolver{
syncContext: ctx,

namespace: fromObj.GetNamespace(),
targetNamespace: translate.Default.HostNamespace(fromObj.GetNamespace()),
})
Expand All @@ -37,6 +39,8 @@ func (e *exportPatcher) ReverseUpdate(_ *synccontext.SyncContext, destObj, sourc
}

type virtualToHostNameResolver struct {
syncContext *synccontext.SyncContext

namespace string
targetNamespace string
}
Expand Down Expand Up @@ -64,20 +68,19 @@ func (r *virtualToHostNameResolver) TranslateNameWithNamespace(name string, name
}

func (r *virtualToHostNameResolver) TranslateLabelExpressionsSelector(selector *metav1.LabelSelector) (*metav1.LabelSelector, error) {
return translate.Default.HostLabelSelectorCluster(selector), nil
return translate.HostLabelSelectorCluster(r.syncContext, selector), nil
}

func (r *virtualToHostNameResolver) TranslateLabelKey(key string) (string, error) {
return translate.Default.HostLabel(key), nil
return translate.Default.HostLabel(r.syncContext, key), nil
}

func (r *virtualToHostNameResolver) TranslateLabelSelector(selector map[string]string) (map[string]string, error) {
labelSelector := &metav1.LabelSelector{
MatchLabels: selector,
}

return metav1.LabelSelectorAsMap(
translate.Default.HostLabelSelector(labelSelector))
return metav1.LabelSelectorAsMap(translate.HostLabelSelector(r.syncContext, labelSelector))
}

func (r *virtualToHostNameResolver) TranslateNamespaceRef(namespace string) (string, error) {
Expand Down
7 changes: 5 additions & 2 deletions pkg/controllers/generic/import_patcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,11 @@ func (s *importPatcher) ServerSideApply(ctx *synccontext.SyncContext, _, destObj
return patches.ApplyPatches(destObj, sourceObj, s.config.Patches, s.config.ReversePatches, &hostToVirtualImportNameResolver{virtualClient: s.virtualClient, ctx: ctx})
}

func (s *importPatcher) ReverseUpdate(_ *synccontext.SyncContext, destObj, sourceObj client.Object) error {
return patches.ApplyPatches(destObj, sourceObj, s.config.ReversePatches, nil, &virtualToHostNameResolver{namespace: sourceObj.GetNamespace()})
func (s *importPatcher) ReverseUpdate(ctx *synccontext.SyncContext, destObj, sourceObj client.Object) error {
return patches.ApplyPatches(destObj, sourceObj, s.config.ReversePatches, nil, &virtualToHostNameResolver{
syncContext: ctx,
namespace: sourceObj.GetNamespace(),
})
}

type hostToVirtualImportNameResolver struct {
Expand Down
2 changes: 2 additions & 0 deletions pkg/controllers/register.go
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ func registerServiceSyncControllers(ctx *synccontext.ControllerContext) error {

// register controller
controller := &servicesync.ServiceSyncer{
SyncContext: ctx.ToRegisterContext().ToSyncContext("map-host-service-syncer"),
SyncServices: mapping,
CreateNamespace: true,
CreateEndpoints: true,
Expand All @@ -177,6 +178,7 @@ func registerServiceSyncControllers(ctx *synccontext.ControllerContext) error {
}

controller := &servicesync.ServiceSyncer{
SyncContext: ctx.ToRegisterContext().ToSyncContext("map-virtual-service-syncer"),
SyncServices: mapping,
IsVirtualToHostSyncer: true,
From: ctx.VirtualManager,
Expand Down
20 changes: 10 additions & 10 deletions pkg/controllers/resources/networkpolicies/syncer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,13 @@ func TestSync(t *testing.T) {
pBaseSpec := networkingv1.NetworkPolicySpec{
PodSelector: metav1.LabelSelector{
MatchLabels: map[string]string{
translate.Default.HostLabel("mykey"): "mylabel",
translate.NamespaceLabel: vObjectMeta.Namespace,
translate.MarkerLabel: translate.VClusterName,
translate.Default.HostLabel(nil, "mykey"): "mylabel",
translate.NamespaceLabel: vObjectMeta.Namespace,
translate.MarkerLabel: translate.VClusterName,
},
MatchExpressions: []metav1.LabelSelectorRequirement{
{
Key: translate.Default.HostLabel("secondkey"),
Key: translate.Default.HostLabel(nil, "secondkey"),
Operator: metav1.LabelSelectorOpIn,
Values: []string{"label-A", "label-B"},
},
Expand Down Expand Up @@ -124,9 +124,9 @@ func TestSync(t *testing.T) {
Ports: somePorts,
From: []networkingv1.NetworkPolicyPeer{{PodSelector: &metav1.LabelSelector{
MatchLabels: map[string]string{
translate.Default.HostLabel("random-key"): "value",
translate.MarkerLabel: translate.VClusterName,
translate.NamespaceLabel: vnetworkPolicyWithPodSelectorNoNs.GetNamespace(),
translate.Default.HostLabel(nil, "random-key"): "value",
translate.MarkerLabel: translate.VClusterName,
translate.NamespaceLabel: vnetworkPolicyWithPodSelectorNoNs.GetNamespace(),
},
MatchExpressions: []metav1.LabelSelectorRequirement{},
}}},
Expand All @@ -146,7 +146,7 @@ func TestSync(t *testing.T) {

pnetworkPolicyWithLabelSelectorNsSelector := pnetworkPolicyWithLabelSelectorNoNs.DeepCopy()
delete(pnetworkPolicyWithLabelSelectorNsSelector.Spec.Ingress[0].From[0].PodSelector.MatchLabels, translate.NamespaceLabel)
pnetworkPolicyWithLabelSelectorNsSelector.Spec.Ingress[0].From[0].PodSelector.MatchLabels[translate.ConvertLabelKeyWithPrefix(translate.NamespaceLabelPrefix, "nslabelkey")] = "abc"
pnetworkPolicyWithLabelSelectorNsSelector.Spec.Ingress[0].From[0].PodSelector.MatchLabels[translate.HostLabelNamespace("nslabelkey")] = "abc"

vnetworkPolicyEgressWithPodSelectorNoNs := vBaseNetworkPolicy.DeepCopy()
vnetworkPolicyEgressWithPodSelectorNoNs.Spec.Egress = []networkingv1.NetworkPolicyEgressRule{
Expand Down Expand Up @@ -200,12 +200,12 @@ func TestSync(t *testing.T) {
},
MatchExpressions: []metav1.LabelSelectorRequirement{
{
Key: translate.Default.HostLabel("pod-expr-key"),
Key: translate.Default.HostLabel(nil, "pod-expr-key"),
Operator: metav1.LabelSelectorOpExists,
Values: []string{"some-pod-key"},
},
{
Key: translate.ConvertLabelKeyWithPrefix(translate.NamespaceLabelPrefix, "ns-expr-key"),
Key: translate.HostLabelNamespace("ns-expr-key"),
Operator: metav1.LabelSelectorOpDoesNotExist,
Values: []string{"forbidden-ns-key"},
},
Expand Down
18 changes: 9 additions & 9 deletions pkg/controllers/resources/networkpolicies/translate.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,22 @@ import (

func (s *networkPolicySyncer) translate(ctx *synccontext.SyncContext, vNetworkPolicy *networkingv1.NetworkPolicy) *networkingv1.NetworkPolicy {
newNetworkPolicy := translate.HostMetadata(ctx, vNetworkPolicy, s.VirtualToHost(ctx, types.NamespacedName{Name: vNetworkPolicy.GetName(), Namespace: vNetworkPolicy.GetNamespace()}, vNetworkPolicy))
if spec := translateSpec(&vNetworkPolicy.Spec, vNetworkPolicy.GetNamespace()); spec != nil {
if spec := translateSpec(ctx, &vNetworkPolicy.Spec, vNetworkPolicy.GetNamespace()); spec != nil {
newNetworkPolicy.Spec = *spec
}
return newNetworkPolicy
}

func (s *networkPolicySyncer) translateUpdate(ctx *synccontext.SyncContext, pObj, vObj *networkingv1.NetworkPolicy) {
if translatedSpec := translateSpec(&vObj.Spec, vObj.GetNamespace()); translatedSpec != nil {
if translatedSpec := translateSpec(ctx, &vObj.Spec, vObj.GetNamespace()); translatedSpec != nil {
pObj.Spec = *translatedSpec
}

pObj.Annotations = translate.HostAnnotations(vObj, pObj)
pObj.Labels = translate.HostLabels(ctx, vObj, pObj)
}

func translateSpec(spec *networkingv1.NetworkPolicySpec, namespace string) *networkingv1.NetworkPolicySpec {
func translateSpec(ctx *synccontext.SyncContext, spec *networkingv1.NetworkPolicySpec, namespace string) *networkingv1.NetworkPolicySpec {
if spec == nil {
return nil
}
Expand All @@ -36,7 +36,7 @@ func translateSpec(spec *networkingv1.NetworkPolicySpec, namespace string) *netw
}
outSpec.Egress = append(outSpec.Egress, networkingv1.NetworkPolicyEgressRule{
Ports: er.Ports,
To: translateNetworkPolicyPeers(er.To, namespace),
To: translateNetworkPolicyPeers(ctx, er.To, namespace),
})
}
for _, ir := range spec.Ingress {
Expand All @@ -45,7 +45,7 @@ func translateSpec(spec *networkingv1.NetworkPolicySpec, namespace string) *netw
}
outSpec.Ingress = append(outSpec.Ingress, networkingv1.NetworkPolicyIngressRule{
Ports: ir.Ports,
From: translateNetworkPolicyPeers(ir.From, namespace),
From: translateNetworkPolicyPeers(ctx, ir.From, namespace),
})
}

Expand All @@ -54,7 +54,7 @@ func translateSpec(spec *networkingv1.NetworkPolicySpec, namespace string) *netw
panic("Multi-Namespace Mode not supported for network policies yet!")
}

if translatedLabelSelector := translate.Default.HostLabelSelector(&spec.PodSelector); translatedLabelSelector != nil {
if translatedLabelSelector := translate.HostLabelSelector(ctx, &spec.PodSelector); translatedLabelSelector != nil {
outSpec.PodSelector = *translatedLabelSelector
if outSpec.PodSelector.MatchLabels == nil {
outSpec.PodSelector.MatchLabels = map[string]string{}
Expand All @@ -69,18 +69,18 @@ func translateSpec(spec *networkingv1.NetworkPolicySpec, namespace string) *netw
return outSpec
}

func translateNetworkPolicyPeers(peers []networkingv1.NetworkPolicyPeer, namespace string) []networkingv1.NetworkPolicyPeer {
func translateNetworkPolicyPeers(ctx *synccontext.SyncContext, peers []networkingv1.NetworkPolicyPeer, namespace string) []networkingv1.NetworkPolicyPeer {
if peers == nil {
return nil
}
out := []networkingv1.NetworkPolicyPeer{}
for _, peer := range peers {
newPeer := networkingv1.NetworkPolicyPeer{
PodSelector: translate.Default.HostLabelSelector(peer.PodSelector),
PodSelector: translate.HostLabelSelector(ctx, peer.PodSelector),
NamespaceSelector: nil, // must be set to nil as all vcluster pods are in the same host namespace as the NetworkPolicy
}
if peer.IPBlock == nil {
translatedNamespaceSelectors := translate.LabelSelectorWithPrefix(translate.NamespaceLabelPrefix, peer.NamespaceSelector)
translatedNamespaceSelectors := translate.HostLabelSelectorNamespace(ctx, peer.NamespaceSelector)
newPeer.PodSelector = translate.MergeLabelSelectors(newPeer.PodSelector, translatedNamespaceSelectors)

if newPeer.PodSelector.MatchLabels == nil {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ func (s *persistentVolumeClaimSyncer) translateSelector(ctx *synccontext.SyncCon
if !s.useFakePersistentVolumes {
if vPvc.Annotations == nil || vPvc.Annotations[constants.SkipTranslationAnnotation] != "true" {
if vPvc.Spec.Selector != nil {
vPvc.Spec.Selector = translate.Default.HostLabelSelectorCluster(vPvc.Spec.Selector)
vPvc.Spec.Selector = translate.HostLabelSelectorCluster(ctx, vPvc.Spec.Selector)
}
if vPvc.Spec.VolumeName != "" {
vPvc.Spec.VolumeName = translate.Default.HostNameCluster(vPvc.Spec.VolumeName)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ func TestSync(t *testing.T) {
ObjectMeta: hostClusterSyncedPDB.ObjectMeta,
Spec: policyv1.PodDisruptionBudgetSpec{
MaxUnavailable: vclusterUpdatedSelectorPDB.Spec.MaxUnavailable,
Selector: translate.Default.HostLabelSelector(vclusterUpdatedSelectorPDB.Spec.Selector),
Selector: translate.HostLabelSelector(nil, vclusterUpdatedSelectorPDB.Spec.Selector),
},
}

Expand Down
4 changes: 2 additions & 2 deletions pkg/controllers/resources/poddisruptionbudgets/translate.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (

func (s *pdbSyncer) translate(ctx *synccontext.SyncContext, vObj *policyv1.PodDisruptionBudget) *policyv1.PodDisruptionBudget {
newPDB := translate.HostMetadata(ctx, vObj, s.VirtualToHost(ctx, types.NamespacedName{Name: vObj.GetName(), Namespace: vObj.GetNamespace()}, vObj))
newPDB.Spec.Selector = translate.Default.HostLabelSelector(newPDB.Spec.Selector)
newPDB.Spec.Selector = translate.HostLabelSelector(ctx, newPDB.Spec.Selector)
return newPDB
}

Expand All @@ -18,5 +18,5 @@ func (s *pdbSyncer) translateUpdate(ctx *synccontext.SyncContext, pObj, vObj *po
pObj.Labels = translate.HostLabels(ctx, vObj, pObj)
pObj.Spec.MaxUnavailable = vObj.Spec.MaxUnavailable
pObj.Spec.MinAvailable = vObj.Spec.MinAvailable
pObj.Spec.Selector = translate.Default.HostLabelSelector(vObj.Spec.Selector)
pObj.Spec.Selector = translate.HostLabelSelector(ctx, vObj.Spec.Selector)
}
2 changes: 1 addition & 1 deletion pkg/controllers/resources/pods/syncer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -570,7 +570,7 @@ func convertLabelKeyWithPrefix(labels map[string]string) map[string]string {
ret := make(map[string]string, len(labels))

for k, v := range labels {
ret[translate.ConvertLabelKeyWithPrefix(translate.LabelPrefix, k)] = v
ret[translate.Default.HostLabel(nil, k)] = v
}

return ret
Expand Down
2 changes: 1 addition & 1 deletion pkg/controllers/resources/pods/translate/diff.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ func (t *translator) Diff(ctx *synccontext.SyncContext, vPod, pPod *corev1.Pod)
}
// check pod and namespace labels
for k, v := range vNamespace.GetLabels() {
updatedLabels[translate.ConvertLabelKeyWithPrefix(translate.NamespaceLabelPrefix, k)] = v
updatedLabels[translate.HostLabelNamespace(k)] = v
}

pPod.Annotations = updatedAnnotations
Expand Down
Loading

0 comments on commit c4ab0e3

Please sign in to comment.