1
1
package resources
2
2
3
3
import (
4
+ "fmt"
5
+
4
6
"github.com/loft-sh/vcluster/pkg/mappings/generic"
5
7
"github.com/loft-sh/vcluster/pkg/syncer/synccontext"
6
8
"github.com/loft-sh/vcluster/pkg/util/translate"
7
9
corev1 "k8s.io/api/core/v1"
8
10
"k8s.io/apimachinery/pkg/types"
11
+ "k8s.io/klog/v2"
9
12
"sigs.k8s.io/controller-runtime/pkg/client"
10
13
)
11
14
12
15
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
+ })
14
19
if err != nil {
15
20
return nil , err
16
21
}
17
22
18
- return & servicesMapper {
23
+ return generic . WithRecorder ( & servicesMapper {
19
24
Mapper : mapper ,
20
- }, nil
25
+ }) , nil
21
26
}
22
27
23
28
type servicesMapper struct {
24
29
synccontext.Mapper
25
30
}
26
31
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
+
27
74
func (s * servicesMapper ) VirtualToHost (ctx * synccontext.SyncContext , req types.NamespacedName , vObj client.Object ) types.NamespacedName {
28
75
if req .Name == "kubernetes" && req .Namespace == "default" {
29
76
return types.NamespacedName {
@@ -43,5 +90,10 @@ func (s *servicesMapper) HostToVirtual(ctx *synccontext.SyncContext, req types.N
43
90
}
44
91
}
45
92
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
47
99
}
0 commit comments