@@ -18,6 +18,9 @@ import (
18
18
"k8s.io/apimachinery/pkg/runtime"
19
19
"k8s.io/apimachinery/pkg/types"
20
20
"k8s.io/apimachinery/pkg/util/wait"
21
+ "k8s.io/apimachinery/pkg/version"
22
+ "k8s.io/client-go/kubernetes"
23
+ "k8s.io/client-go/rest"
21
24
"k8s.io/client-go/tools/record"
22
25
"k8s.io/client-go/util/workqueue"
23
26
ctrl "sigs.k8s.io/controller-runtime"
@@ -47,13 +50,20 @@ const (
47
50
maintenanceRequeue = 1 * time .Minute
48
51
)
49
52
50
- func NewWorkspaceReconciler (c client.Client , scheme * runtime.Scheme , recorder record.EventRecorder , cfg * config.Configuration , reg prometheus.Registerer , maintenance maintenance.Maintenance ) (* WorkspaceReconciler , error ) {
53
+ func NewWorkspaceReconciler (c client.Client , restConfig * rest.Config , scheme * runtime.Scheme , recorder record.EventRecorder , cfg * config.Configuration , reg prometheus.Registerer , maintenance maintenance.Maintenance ) (* WorkspaceReconciler , error ) {
54
+ // Create kubernetes clientset
55
+ kubeClient , err := kubernetes .NewForConfig (restConfig )
56
+ if err != nil {
57
+ return nil , fmt .Errorf ("failed to create kubernetes client: %w" , err )
58
+ }
59
+
51
60
reconciler := & WorkspaceReconciler {
52
61
Client : c ,
53
62
Scheme : scheme ,
54
63
Config : cfg ,
55
64
maintenance : maintenance ,
56
65
Recorder : recorder ,
66
+ kubeClient : kubeClient ,
57
67
}
58
68
59
69
metrics , err := newControllerMetrics (reconciler )
@@ -75,6 +85,8 @@ type WorkspaceReconciler struct {
75
85
metrics * controllerMetrics
76
86
maintenance maintenance.Maintenance
77
87
Recorder record.EventRecorder
88
+
89
+ kubeClient kubernetes.Interface
78
90
}
79
91
80
92
//+kubebuilder:rbac:groups=workspace.gitpod.io,resources=workspaces,verbs=get;list;watch;create;update;patch;delete
@@ -181,7 +193,8 @@ func (r *WorkspaceReconciler) actOnStatus(ctx context.Context, workspace *worksp
181
193
// if there isn't a workspace pod and we're not currently deleting this workspace,// create one.
182
194
switch {
183
195
case workspace .Status .PodStarts == 0 || workspace .Status .PodStarts - workspace .Status .PodRecreated < 1 :
184
- sctx , err := newStartWorkspaceContext (ctx , r .Config , workspace )
196
+ serverVersion := r .getServerVersion (ctx )
197
+ sctx , err := newStartWorkspaceContext (ctx , r .Config , workspace , serverVersion )
185
198
if err != nil {
186
199
log .Error (err , "unable to create startWorkspace context" )
187
200
return ctrl.Result {Requeue : true }, err
@@ -627,6 +640,20 @@ func (r *WorkspaceReconciler) SetupWithManager(mgr ctrl.Manager) error {
627
640
Complete (r )
628
641
}
629
642
643
+ func (r * WorkspaceReconciler ) getServerVersion (ctx context.Context ) * version.Info {
644
+ log := log .FromContext (ctx )
645
+
646
+ serverVersion , err := r .kubeClient .Discovery ().ServerVersion ()
647
+ if err != nil {
648
+ log .Error (err , "cannot get server version! Assuming 1.30 going forward" )
649
+ serverVersion = & version.Info {
650
+ Major : "1" ,
651
+ Minor : "30" ,
652
+ }
653
+ }
654
+ return serverVersion
655
+ }
656
+
630
657
func SetupIndexer (mgr ctrl.Manager ) error {
631
658
var err error
632
659
var once sync.Once
0 commit comments