Skip to content

Commit faae228

Browse files
committed
Use APIReader client to Get() VirtualMachinePublishRequest
Unlike ConfigMaps and Secrets which we cannot cache because their quantity and size will exceed our container's memory limit, the pub req shouldn't be cached because of how the controller is implemented so make that explicit in the controller.
1 parent 45c7a1e commit faae228

File tree

3 files changed

+10
-9
lines changed

3 files changed

+10
-9
lines changed

controllers/virtualmachinepublishrequest/virtualmachinepublishrequest_controller.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ func AddToManager(ctx *context.ControllerManagerContext, mgr manager.Manager) er
7070

7171
r := NewReconciler(
7272
mgr.GetClient(),
73+
mgr.GetAPIReader(),
7374
ctrl.Log.WithName("controllers").WithName(controlledTypeName),
7475
record.New(mgr.GetEventRecorderFor(controllerNameLong)),
7576
ctx.VMProvider,
@@ -124,12 +125,14 @@ func vmiToVMPubMapperFn(ctx *context.ControllerManagerContext, c client.Client)
124125

125126
func NewReconciler(
126127
client client.Client,
128+
apiReader client.Reader,
127129
logger logr.Logger,
128130
recorder record.Recorder,
129131
vmProvider vmprovider.VirtualMachineProviderInterface) *Reconciler {
130132

131133
return &Reconciler{
132134
Client: client,
135+
apiReader: apiReader,
133136
Logger: logger,
134137
Recorder: recorder,
135138
VMProvider: vmProvider,
@@ -140,6 +143,7 @@ func NewReconciler(
140143
// Reconciler reconciles a VirtualMachinePublishRequest object.
141144
type Reconciler struct {
142145
client.Client
146+
apiReader client.Reader
143147
Logger logr.Logger
144148
Recorder record.Recorder
145149
VMProvider vmprovider.VirtualMachineProviderInterface
@@ -167,7 +171,11 @@ func requeueDelay(ctx *context.VirtualMachinePublishRequestContext) time.Duratio
167171

168172
func (r *Reconciler) Reconcile(ctx goctx.Context, req ctrl.Request) (_ ctrl.Result, reterr error) {
169173
vmPublishReq := &vmopv1alpha1.VirtualMachinePublishRequest{}
170-
err := r.Get(ctx, req.NamespacedName, vmPublishReq)
174+
// Get the VirtualMachinePublishRequest directly from the API server - bypassing the cache of the
175+
// regular client - to avoid potentially stale objects from cache. We rely on the up-to-date Status
176+
// when sending publish VM requests during reconciliation.
177+
// Update() of stale object will be rejected by API server and result in unnecessary reconciles.
178+
err := r.apiReader.Get(ctx, req.NamespacedName, vmPublishReq)
171179
if err != nil {
172180
// Delete registered metrics if the resource is not found.
173181
if apiErrors.IsNotFound(err) {

controllers/virtualmachinepublishrequest/virtualmachinepublishrequest_controller_unit_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ func unitTestsReconcile() {
6666
JustBeforeEach(func() {
6767
ctx = suite.NewUnitTestContextForController(initObjects...)
6868
reconciler = virtualmachinepublishrequest.NewReconciler(
69+
ctx.Client,
6970
ctx.Client,
7071
ctx.Logger,
7172
ctx.Recorder,

pkg/manager/manager.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import (
2626
netopv1alpha1 "github.com/vmware-tanzu/vm-operator/external/net-operator/api/v1alpha1"
2727
cnsv1alpha1 "github.com/vmware-tanzu/vm-operator/external/vsphere-csi-driver/pkg/syncer/cnsoperator/apis/cnsnodevmattachment/v1alpha1"
2828
"github.com/vmware-tanzu/vm-operator/pkg/context"
29-
"github.com/vmware-tanzu/vm-operator/pkg/lib"
3029
"github.com/vmware-tanzu/vm-operator/pkg/record"
3130
"github.com/vmware-tanzu/vm-operator/pkg/vmprovider/providers/vsphere"
3231
)
@@ -58,13 +57,6 @@ func New(opts Options) (Manager, error) {
5857
// the cache for ConfigMaps and Secrets so they are looked up from API sever directly.
5958
cacheDisabledObjects := []client.Object{&corev1.ConfigMap{}, &corev1.Secret{}}
6059

61-
// Look up VirtualMachinePublishRequest resources from API server directly to avoid get stale objects from cache,
62-
// We kind of rely on the up-to-date status when sending publish VM requests during reconciling VMPublishRequests.
63-
// Update stale object will be rejected by API server and result in unnecessary reconciles.
64-
if lib.IsWCPVMImageRegistryEnabled() {
65-
cacheDisabledObjects = append(cacheDisabledObjects, &vmopv1.VirtualMachinePublishRequest{})
66-
}
67-
6860
// Build the controller manager.
6961
mgr, err := ctrlmgr.New(opts.KubeConfig, ctrlmgr.Options{
7062
Scheme: opts.Scheme,

0 commit comments

Comments
 (0)