11package resources
22
33import (
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
1215func 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
2328type 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+
2774func (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}
0 commit comments