Skip to content

Commit 7cf05e0

Browse files
authored
Merge pull request #2091 from FabianKramm/main
fix: map default/kubernetes correctly
2 parents 9897e85 + 990f368 commit 7cf05e0

File tree

2 files changed

+72
-4
lines changed

2 files changed

+72
-4
lines changed

pkg/mappings/resources/services.go

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,76 @@
11
package resources
22

33
import (
4+
"fmt"
5+
46
"github.com/loft-sh/vcluster/pkg/mappings/generic"
57
"github.com/loft-sh/vcluster/pkg/syncer/synccontext"
68
"github.com/loft-sh/vcluster/pkg/util/translate"
79
corev1 "k8s.io/api/core/v1"
810
"k8s.io/apimachinery/pkg/types"
11+
"k8s.io/klog/v2"
912
"sigs.k8s.io/controller-runtime/pkg/client"
1013
)
1114

1215
func CreateServiceMapper(ctx *synccontext.RegisterContext) (synccontext.Mapper, error) {
13-
mapper, err := generic.NewMapper(ctx, &corev1.Service{}, translate.Default.HostName)
16+
mapper, err := generic.NewMapperWithoutRecorder(ctx, &corev1.Service{}, func(ctx *synccontext.SyncContext, vName, vNamespace string, _ client.Object) types.NamespacedName {
17+
return translate.Default.HostName(ctx, vName, vNamespace)
18+
})
1419
if err != nil {
1520
return nil, err
1621
}
1722

18-
return &servicesMapper{
23+
return generic.WithRecorder(&servicesMapper{
1924
Mapper: mapper,
20-
}, nil
25+
}), nil
2126
}
2227

2328
type servicesMapper struct {
2429
synccontext.Mapper
2530
}
2631

32+
func (s *servicesMapper) Migrate(ctx *synccontext.RegisterContext, _ synccontext.Mapper) error {
33+
vObj := synccontext.Object{
34+
GroupVersionKind: s.GroupVersionKind(),
35+
NamespacedName: types.NamespacedName{
36+
Namespace: "default",
37+
Name: "kubernetes",
38+
},
39+
}
40+
expectedHostName := types.NamespacedName{
41+
Name: translate.VClusterName,
42+
Namespace: ctx.CurrentNamespace,
43+
}
44+
45+
// check if there is an existing mapping already
46+
existingHostName, ok := ctx.Mappings.Store().VirtualToHostName(ctx, vObj)
47+
if ok && existingHostName.String() != expectedHostName.String() {
48+
klog.FromContext(ctx).Info("Fix default/kubernetes mapping", "before", existingHostName, "now", expectedHostName)
49+
50+
// delete existing mapping & references
51+
existingMapping := vObj.WithHostName(existingHostName)
52+
err := ctx.Mappings.Store().DeleteMapping(ctx, existingMapping)
53+
if err != nil {
54+
return err
55+
}
56+
for _, reference := range ctx.Mappings.Store().ReferencesTo(ctx, vObj) {
57+
err = ctx.Mappings.Store().DeleteReferenceAndSave(ctx, existingMapping, reference)
58+
if err != nil {
59+
return fmt.Errorf("delete reference: %w", err)
60+
}
61+
}
62+
63+
// add new mapping
64+
expectedMapping := vObj.WithHostName(expectedHostName)
65+
err = ctx.Mappings.Store().AddReferenceAndSave(ctx, expectedMapping, expectedMapping)
66+
if err != nil {
67+
return fmt.Errorf("add mapping: %w", err)
68+
}
69+
}
70+
71+
return nil
72+
}
73+
2774
func (s *servicesMapper) VirtualToHost(ctx *synccontext.SyncContext, req types.NamespacedName, vObj client.Object) types.NamespacedName {
2875
if req.Name == "kubernetes" && req.Namespace == "default" {
2976
return types.NamespacedName{
@@ -43,5 +90,10 @@ func (s *servicesMapper) HostToVirtual(ctx *synccontext.SyncContext, req types.N
4390
}
4491
}
4592

46-
return s.Mapper.HostToVirtual(ctx, req, pObj)
93+
namespaceName := s.Mapper.HostToVirtual(ctx, req, pObj)
94+
if namespaceName.Name == "kubernetes" && req.Namespace == "default" {
95+
return types.NamespacedName{}
96+
}
97+
98+
return namespaceName
4799
}

pkg/syncer/synccontext/mapper.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,22 @@ type Object struct {
103103
types.NamespacedName
104104
}
105105

106+
func (o Object) WithVirtualName(vName types.NamespacedName) NameMapping {
107+
return NameMapping{
108+
GroupVersionKind: o.GroupVersionKind,
109+
VirtualName: vName,
110+
HostName: o.NamespacedName,
111+
}
112+
}
113+
114+
func (o Object) WithHostName(pName types.NamespacedName) NameMapping {
115+
return NameMapping{
116+
GroupVersionKind: o.GroupVersionKind,
117+
VirtualName: o.NamespacedName,
118+
HostName: pName,
119+
}
120+
}
121+
106122
func (o Object) Equals(other Object) bool {
107123
return o.String() == other.String()
108124
}

0 commit comments

Comments
 (0)