Skip to content

Commit 77fc613

Browse files
Merge pull request GoogleCloudPlatform#3016 from jasonvigil/sqlinstance-lro-polling
chore: Cleanup duplicate LRO polling code
2 parents aa0e8a1 + e3f2089 commit 77fc613

File tree

1 file changed

+39
-108
lines changed

1 file changed

+39
-108
lines changed

pkg/controller/direct/sql/sqlinstance_controller.go

+39-108
Original file line numberDiff line numberDiff line change
@@ -176,25 +176,8 @@ func (a *sqlInstanceAdapter) cloneInstance(ctx context.Context, u *unstructured.
176176
if err != nil {
177177
return fmt.Errorf("cloning SQLInstance %s failed: %w", a.desired.Name, err)
178178
}
179-
180-
pollingBackoff := gax.Backoff{
181-
Initial: time.Second,
182-
Max: time.Minute,
183-
Multiplier: 2,
184-
}
185-
for {
186-
log.V(2).Info("polling", "op", op)
187-
188-
if op.Status == "DONE" {
189-
break
190-
}
191-
if err := gax.Sleep(ctx, pollingBackoff.Pause()); err != nil {
192-
return fmt.Errorf("waiting for SQLInstance %s clone failed: %w", a.desired.Name, err)
193-
}
194-
op, err = a.sqlOperationsClient.Get(a.projectID, op.Name).Do()
195-
if err != nil {
196-
return fmt.Errorf("getting SQLInstance %s clone operation %s failed: %w", a.desired.Name, op.Name, err)
197-
}
179+
if err := a.pollForLROCompletion(ctx, op, "clone"); err != nil {
180+
return err
198181
}
199182

200183
created, err := a.sqlInstancesClient.Get(a.projectID, a.resourceID).Context(ctx).Do()
@@ -221,25 +204,8 @@ func (a *sqlInstanceAdapter) insertInstance(ctx context.Context, u *unstructured
221204
if err != nil {
222205
return fmt.Errorf("creating SQLInstance %s failed: %w", a.desired.Name, err)
223206
}
224-
225-
pollingBackoff := gax.Backoff{
226-
Initial: time.Second,
227-
Max: time.Minute,
228-
Multiplier: 2,
229-
}
230-
for {
231-
log.V(2).Info("polling", "op", op)
232-
233-
if op.Status == "DONE" {
234-
break
235-
}
236-
if err := gax.Sleep(ctx, pollingBackoff.Pause()); err != nil {
237-
return fmt.Errorf("waiting for SQLInstance %s creation failed: %w", a.desired.Name, err)
238-
}
239-
op, err = a.sqlOperationsClient.Get(a.projectID, op.Name).Do()
240-
if err != nil {
241-
return fmt.Errorf("getting SQLInstance %s create operation %s failed: %w", a.desired.Name, op.Name, err)
242-
}
207+
if err := a.pollForLROCompletion(ctx, op, "create"); err != nil {
208+
return err
243209
}
244210

245211
created, err := a.sqlInstancesClient.Get(a.projectID, a.resourceID).Context(ctx).Do()
@@ -261,19 +227,8 @@ func (a *sqlInstanceAdapter) insertInstance(ctx context.Context, u *unstructured
261227
if err != nil {
262228
return fmt.Errorf("deleting SQLInstance %s root user failed: %w", a.desired.Name, err)
263229
}
264-
for {
265-
log.V(2).Info("polling", "op", op)
266-
267-
if op.Status == "DONE" {
268-
break
269-
}
270-
if err := gax.Sleep(ctx, pollingBackoff.Pause()); err != nil {
271-
return fmt.Errorf("waiting for SQLInstance %s delete user failed: %w", a.desired.Name, err)
272-
}
273-
op, err = a.sqlOperationsClient.Get(a.projectID, op.Name).Do()
274-
if err != nil {
275-
return fmt.Errorf("getting SQLInstance %s delete root user operation %s failed: %w", a.desired.Name, op.Name, err)
276-
}
230+
if err := a.pollForLROCompletion(ctx, op, "delete root user"); err != nil {
231+
return err
277232
}
278233
}
279234
}
@@ -303,25 +258,8 @@ func (a *sqlInstanceAdapter) Update(ctx context.Context, updateOp *directbase.Up
303258
if err != nil {
304259
return fmt.Errorf("patching SQLInstance %s version failed: %w", a.resourceID, err)
305260
}
306-
307-
pollingBackoff := gax.Backoff{
308-
Initial: time.Second,
309-
Max: time.Minute,
310-
Multiplier: 2,
311-
}
312-
for {
313-
log.V(2).Info("polling", "op", op)
314-
315-
if op.Status == "DONE" {
316-
break
317-
}
318-
if err := gax.Sleep(ctx, pollingBackoff.Pause()); err != nil {
319-
return fmt.Errorf("waiting for SQLInstance %s version patch failed: %w", a.resourceID, err)
320-
}
321-
op, err = a.sqlOperationsClient.Get(a.projectID, op.Name).Do()
322-
if err != nil {
323-
return fmt.Errorf("getting SQLInstance %s version patch operation %s failed: %w", a.resourceID, op.Name, err)
324-
}
261+
if err := a.pollForLROCompletion(ctx, op, "version patch"); err != nil {
262+
return err
325263
}
326264

327265
updated, err := a.sqlInstancesClient.Get(a.projectID, a.resourceID).Context(ctx).Do()
@@ -349,25 +287,8 @@ func (a *sqlInstanceAdapter) Update(ctx context.Context, updateOp *directbase.Up
349287
if err != nil {
350288
return fmt.Errorf("patching SQLInstance %s edition failed: %w", a.resourceID, err)
351289
}
352-
353-
pollingBackoff := gax.Backoff{
354-
Initial: time.Second,
355-
Max: time.Minute,
356-
Multiplier: 2,
357-
}
358-
for {
359-
log.V(2).Info("polling", "op", op)
360-
361-
if op.Status == "DONE" {
362-
break
363-
}
364-
if err := gax.Sleep(ctx, pollingBackoff.Pause()); err != nil {
365-
return fmt.Errorf("waiting for SQLInstance %s edition patch failed: %w", a.resourceID, err)
366-
}
367-
op, err = a.sqlOperationsClient.Get(a.projectID, op.Name).Do()
368-
if err != nil {
369-
return fmt.Errorf("getting SQLInstance %s edition patch operation %s failed: %w", a.resourceID, op.Name, err)
370-
}
290+
if err := a.pollForLROCompletion(ctx, op, "edition patch"); err != nil {
291+
return err
371292
}
372293

373294
updated, err := a.sqlInstancesClient.Get(a.projectID, a.resourceID).Context(ctx).Do()
@@ -393,25 +314,8 @@ func (a *sqlInstanceAdapter) Update(ctx context.Context, updateOp *directbase.Up
393314
if err != nil {
394315
return fmt.Errorf("updating SQLInstance %s failed: %w", desiredGCP.Name, err)
395316
}
396-
397-
pollingBackoff := gax.Backoff{
398-
Initial: time.Second,
399-
Max: time.Minute,
400-
Multiplier: 2,
401-
}
402-
for {
403-
log.V(2).Info("polling", "op", op)
404-
405-
if op.Status == "DONE" {
406-
break
407-
}
408-
if err := gax.Sleep(ctx, pollingBackoff.Pause()); err != nil {
409-
return fmt.Errorf("waiting for SQLInstance %s update failed: %w", desiredGCP.Name, err)
410-
}
411-
op, err = a.sqlOperationsClient.Get(a.projectID, op.Name).Do()
412-
if err != nil {
413-
return fmt.Errorf("getting SQLInstance %s update operation %s failed: %w", desiredGCP.Name, op.Name, err)
414-
}
317+
if err := a.pollForLROCompletion(ctx, op, "update"); err != nil {
318+
return err
415319
}
416320

417321
updated, err := a.sqlInstancesClient.Get(a.projectID, a.resourceID).Context(ctx).Do()
@@ -473,6 +377,33 @@ func (a *sqlInstanceAdapter) Export(ctx context.Context) (*unstructured.Unstruct
473377
return u, nil
474378
}
475379

380+
func (a *sqlInstanceAdapter) pollForLROCompletion(ctx context.Context, op *api.Operation, verb string) error {
381+
log := klog.FromContext(ctx).WithName(ctrlName)
382+
var err error
383+
384+
pollingBackoff := gax.Backoff{
385+
Initial: time.Second,
386+
Max: time.Minute,
387+
Multiplier: 2,
388+
}
389+
for {
390+
log.V(2).Info("polling", "op", op)
391+
392+
if op.Status == "DONE" {
393+
break
394+
}
395+
if err := gax.Sleep(ctx, pollingBackoff.Pause()); err != nil {
396+
return fmt.Errorf("waiting for SQLInstance %s %s failed: %w", a.resourceID, verb, err)
397+
}
398+
op, err = a.sqlOperationsClient.Get(a.projectID, op.Name).Do()
399+
if err != nil {
400+
return fmt.Errorf("getting SQLInstance %s %s operation %s failed: %w", a.resourceID, verb, op.Name, err)
401+
}
402+
}
403+
404+
return nil
405+
}
406+
476407
func setStatus(u *unstructured.Unstructured, typedStatus any) error {
477408
status, err := runtime.DefaultUnstructuredConverter.ToUnstructured(typedStatus)
478409
if err != nil {

0 commit comments

Comments
 (0)