Skip to content

Commit 107dd5e

Browse files
committed
Omit informer has already started error
1 parent 4777236 commit 107dd5e

File tree

4 files changed

+105
-66
lines changed

4 files changed

+105
-66
lines changed

components/ws-manager-mk2/controllers/maintenance_controller.go

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"context"
99
"encoding/json"
1010
"fmt"
11+
"os"
1112
"sync"
1213
"time"
1314

@@ -17,7 +18,12 @@ import (
1718
"k8s.io/apimachinery/pkg/types"
1819
ctrl "sigs.k8s.io/controller-runtime"
1920
"sigs.k8s.io/controller-runtime/pkg/client"
21+
"sigs.k8s.io/controller-runtime/pkg/controller"
22+
"sigs.k8s.io/controller-runtime/pkg/event"
23+
"sigs.k8s.io/controller-runtime/pkg/handler"
2024
"sigs.k8s.io/controller-runtime/pkg/log"
25+
"sigs.k8s.io/controller-runtime/pkg/predicate"
26+
"sigs.k8s.io/controller-runtime/pkg/source"
2127
)
2228

2329
var (
@@ -106,9 +112,44 @@ func (r *MaintenanceReconciler) setEnabledUntil(ctx context.Context, enabledUnti
106112
log.FromContext(ctx).Info("maintenance mode state change", "enabledUntil", enabledUntil)
107113
}
108114

109-
func (r *MaintenanceReconciler) SetupWithManager(mgr ctrl.Manager) error {
110-
return ctrl.NewControllerManagedBy(mgr).
111-
Named("maintenance").
112-
For(&corev1.ConfigMap{}).
113-
Complete(r)
115+
func (r *MaintenanceReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager) error {
116+
c, err := controller.NewUnmanaged("maintenance-controller", mgr, controller.Options{Reconciler: r})
117+
if err != nil {
118+
return err
119+
}
120+
121+
go func() {
122+
err = c.Start(ctx)
123+
if err != nil {
124+
log.FromContext(ctx).Error(err, "cannot start maintenance reconciler")
125+
os.Exit(1)
126+
}
127+
}()
128+
129+
return c.Watch(source.Kind(mgr.GetCache(), &corev1.ConfigMap{}), &handler.EnqueueRequestForObject{}, &filterConfigMap{})
130+
131+
}
132+
133+
type filterConfigMap struct {
134+
predicate.Funcs
135+
}
136+
137+
func (f filterConfigMap) Create(e event.CreateEvent) bool {
138+
return f.filter(e.Object)
139+
}
140+
141+
func (f filterConfigMap) Update(e event.UpdateEvent) bool {
142+
return f.filter(e.ObjectNew)
143+
}
144+
145+
func (f filterConfigMap) Generic(e event.GenericEvent) bool {
146+
return f.filter(e.Object)
147+
}
148+
149+
func (f filterConfigMap) filter(obj client.Object) bool {
150+
if obj == nil {
151+
return false
152+
}
153+
154+
return obj.GetName() == configMapKey.Name && obj.GetNamespace() == configMapKey.Namespace
114155
}

components/ws-manager-mk2/controllers/workspace_controller.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -500,8 +500,8 @@ func (r *WorkspaceReconciler) SetupWithManager(mgr ctrl.Manager) error {
500500
return []string{owner.Name}
501501
}
502502
err := mgr.GetFieldIndexer().IndexField(context.Background(), &corev1.Pod{}, wsOwnerKey, idx)
503-
if err != nil {
504-
return err
503+
if err != nil && err.Error() == "informer has already started" {
504+
return nil
505505
}
506506

507507
return ctrl.NewControllerManagedBy(mgr).

components/ws-manager-mk2/main.go

Lines changed: 45 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -112,18 +112,20 @@ func main() {
112112
setupLog.Error(nil, "namespace cannot be empty")
113113
os.Exit(1)
114114
}
115+
115116
if cfg.Manager.SecretsNamespace == "" {
116117
setupLog.Error(nil, "secretsNamespace cannot be empty")
117118
os.Exit(1)
118119
}
119120

120121
mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
121-
Scheme: scheme,
122-
MetricsBindAddress: cfg.Prometheus.Addr,
123-
Port: 9443,
124-
HealthProbeBindAddress: cfg.Health.Addr,
125-
LeaderElection: true,
126-
LeaderElectionID: "ws-manager-mk2-leader.gitpod.io",
122+
Scheme: scheme,
123+
MetricsBindAddress: cfg.Prometheus.Addr,
124+
Port: 9443,
125+
HealthProbeBindAddress: cfg.Health.Addr,
126+
LeaderElection: true,
127+
LeaderElectionID: "ws-manager-mk2-leader.gitpod.io",
128+
LeaderElectionReleaseOnCancel: true,
127129
NewCache: func(config *rest.Config, opts cache.Options) (cache.Cache, error) {
128130
opts.Namespaces = []string{cfg.Manager.Namespace, cfg.Manager.SecretsNamespace}
129131
return cache.New(config, opts)
@@ -134,53 +136,50 @@ func main() {
134136
os.Exit(1)
135137
}
136138

137-
go func() {
138-
<-mgr.Elected()
139-
140-
maintenanceReconciler, err := controllers.NewMaintenanceReconciler(mgr.GetClient())
141-
if err != nil {
142-
setupLog.Error(err, "unable to create maintenance controller", "controller", "Maintenance")
143-
os.Exit(1)
144-
}
139+
mgrCtx := ctrl.SetupSignalHandler()
145140

146-
workspaceReconciler, err := controllers.NewWorkspaceReconciler(
147-
mgr.GetClient(), mgr.GetScheme(), mgr.GetEventRecorderFor("workspace"), &cfg.Manager, metrics.Registry, maintenanceReconciler)
148-
if err != nil {
149-
setupLog.Error(err, "unable to create controller", "controller", "Workspace")
150-
os.Exit(1)
151-
}
141+
maintenanceReconciler, err := controllers.NewMaintenanceReconciler(mgr.GetClient())
142+
if err != nil {
143+
setupLog.Error(err, "unable to create maintenance controller", "controller", "Maintenance")
144+
os.Exit(1)
145+
}
152146

153-
activity := activity.NewWorkspaceActivity()
147+
workspaceReconciler, err := controllers.NewWorkspaceReconciler(
148+
mgr.GetClient(), mgr.GetScheme(), mgr.GetEventRecorderFor("workspace"), &cfg.Manager, metrics.Registry, maintenanceReconciler)
149+
if err != nil {
150+
setupLog.Error(err, "unable to create controller", "controller", "Workspace")
151+
os.Exit(1)
152+
}
154153

155-
timeoutReconciler, err := controllers.NewTimeoutReconciler(mgr.GetClient(), mgr.GetEventRecorderFor("workspace"), cfg.Manager, activity, maintenanceReconciler)
156-
if err != nil {
157-
setupLog.Error(err, "unable to create timeout controller", "controller", "Timeout")
158-
os.Exit(1)
159-
}
154+
activity := activity.NewWorkspaceActivity()
160155

161-
wsmanService, err := setupGRPCService(cfg, mgr.GetClient(), activity, maintenanceReconciler)
162-
if err != nil {
163-
setupLog.Error(err, "unable to start manager service")
164-
os.Exit(1)
165-
}
156+
timeoutReconciler, err := controllers.NewTimeoutReconciler(mgr.GetClient(), mgr.GetEventRecorderFor("workspace"), cfg.Manager, activity, maintenanceReconciler)
157+
if err != nil {
158+
setupLog.Error(err, "unable to create timeout controller", "controller", "Timeout")
159+
os.Exit(1)
160+
}
166161

167-
workspaceReconciler.OnReconcile = wsmanService.OnWorkspaceReconcile
162+
wsmanService, err := setupGRPCService(cfg, mgr.GetClient(), activity, maintenanceReconciler)
163+
if err != nil {
164+
setupLog.Error(err, "unable to start manager service")
165+
os.Exit(1)
166+
}
168167

169-
if err = workspaceReconciler.SetupWithManager(mgr); err != nil {
170-
setupLog.Error(err, "unable to setup workspace controller with manager", "controller", "Workspace")
171-
os.Exit(1)
172-
}
168+
workspaceReconciler.OnReconcile = wsmanService.OnWorkspaceReconcile
169+
if err = workspaceReconciler.SetupWithManager(mgr); err != nil {
170+
setupLog.Error(err, "unable to setup workspace controller with manager", "controller", "Workspace")
171+
os.Exit(1)
172+
}
173173

174-
if err = timeoutReconciler.SetupWithManager(mgr); err != nil {
175-
setupLog.Error(err, "unable to setup timeout controller with manager", "controller", "Timeout")
176-
os.Exit(1)
177-
}
174+
if err = timeoutReconciler.SetupWithManager(mgr); err != nil {
175+
setupLog.Error(err, "unable to setup timeout controller with manager", "controller", "Timeout")
176+
os.Exit(1)
177+
}
178178

179-
if err = maintenanceReconciler.SetupWithManager(mgr); err != nil {
180-
setupLog.Error(err, "unable to setup maintenance controller with manager", "controller", "Maintenance")
181-
os.Exit(1)
182-
}
183-
}()
179+
if err = maintenanceReconciler.SetupWithManager(mgrCtx, mgr); err != nil {
180+
setupLog.Error(err, "unable to setup maintenance controller with manager", "controller", "Maintenance")
181+
os.Exit(1)
182+
}
184183

185184
// if err = (&workspacev1.Workspace{}).SetupWebhookWithManager(mgr); err != nil {
186185
// setupLog.Error(err, "unable to create webhook", "webhook", "Workspace")
@@ -199,7 +198,7 @@ func main() {
199198
}
200199

201200
setupLog.Info("starting manager")
202-
if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
201+
if err := mgr.Start(mgrCtx); err != nil {
203202
setupLog.Error(err, "problem running manager")
204203
os.Exit(1)
205204
}

components/ws-manager-mk2/service/manager.go

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,13 @@ import (
1616
validation "github.com/go-ozzo/ozzo-validation"
1717
"github.com/opentracing/opentracing-go"
1818
"github.com/prometheus/client_golang/prometheus"
19+
"github.com/sirupsen/logrus"
1920
"golang.org/x/xerrors"
2021
"google.golang.org/grpc/codes"
2122
"google.golang.org/grpc/peer"
2223
"google.golang.org/grpc/status"
2324
"google.golang.org/protobuf/proto"
2425
"google.golang.org/protobuf/types/known/timestamppb"
25-
26-
wsk8s "github.com/gitpod-io/gitpod/common-go/kubernetes"
27-
"github.com/gitpod-io/gitpod/common-go/log"
28-
"github.com/gitpod-io/gitpod/common-go/tracing"
29-
"github.com/gitpod-io/gitpod/common-go/util"
30-
"github.com/gitpod-io/gitpod/ws-manager-mk2/pkg/activity"
31-
"github.com/gitpod-io/gitpod/ws-manager-mk2/pkg/maintenance"
32-
wsmanapi "github.com/gitpod-io/gitpod/ws-manager/api"
33-
"github.com/gitpod-io/gitpod/ws-manager/api/config"
34-
workspacev1 "github.com/gitpod-io/gitpod/ws-manager/api/crd/v1"
35-
36-
csapi "github.com/gitpod-io/gitpod/content-service/api"
37-
"github.com/sirupsen/logrus"
3826
corev1 "k8s.io/api/core/v1"
3927
"k8s.io/apimachinery/pkg/api/errors"
4028
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -46,6 +34,17 @@ import (
4634
"k8s.io/utils/pointer"
4735
"sigs.k8s.io/controller-runtime/pkg/client"
4836
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
37+
38+
wsk8s "github.com/gitpod-io/gitpod/common-go/kubernetes"
39+
"github.com/gitpod-io/gitpod/common-go/log"
40+
"github.com/gitpod-io/gitpod/common-go/tracing"
41+
"github.com/gitpod-io/gitpod/common-go/util"
42+
csapi "github.com/gitpod-io/gitpod/content-service/api"
43+
"github.com/gitpod-io/gitpod/ws-manager-mk2/pkg/activity"
44+
"github.com/gitpod-io/gitpod/ws-manager-mk2/pkg/maintenance"
45+
wsmanapi "github.com/gitpod-io/gitpod/ws-manager/api"
46+
"github.com/gitpod-io/gitpod/ws-manager/api/config"
47+
workspacev1 "github.com/gitpod-io/gitpod/ws-manager/api/crd/v1"
4948
)
5049

5150
const (

0 commit comments

Comments
 (0)