diff --git a/cloud/scope/client.go b/cloud/scope/client.go index f64888b9e..404a92c7d 100644 --- a/cloud/scope/client.go +++ b/cloud/scope/client.go @@ -33,7 +33,6 @@ type LinodeInstanceClient interface { GetImage(ctx context.Context, imageID string) (*linodego.Image, error) CreateStackscript(ctx context.Context, opts linodego.StackscriptCreateOptions) (*linodego.Stackscript, error) ListStackscripts(ctx context.Context, opts *linodego.ListOptions) ([]linodego.Stackscript, error) - WaitForInstanceDiskStatus(ctx context.Context, instanceID int, diskID int, status linodego.DiskStatus, timeoutSeconds int) (*linodego.InstanceDisk, error) } // LinodeVPCClient defines the methods that a Linode client must have to interact with Linode's VPC service. diff --git a/controller/linodemachine_controller.go b/controller/linodemachine_controller.go index 4bb52b145..149828b3d 100644 --- a/controller/linodemachine_controller.go +++ b/controller/linodemachine_controller.go @@ -51,9 +51,8 @@ import ( ) const ( - linodeBusyCode = 400 - defaultDiskFilesystem = string(linodego.FilesystemExt4) - defaultResizeWaitSeconds = 5 + linodeBusyCode = 400 + defaultDiskFilesystem = string(linodego.FilesystemExt4) // conditions for preflight instance creation ConditionPreflightCreated clusterv1.ConditionType = "PreflightCreated" @@ -413,7 +412,9 @@ func (r *LinodeMachineReconciler) createDisks(ctx context.Context, logger logr.L }, ) if err != nil { - logger.Error(err, "Failed to create disk", "DiskLabel", label) + if !linodego.ErrHasStatus(err, linodeBusyCode) { + logger.Error(err, "Failed to create disk", "DiskLabel", label) + } conditions.MarkFalse( machineScope.LinodeMachine, @@ -490,17 +491,6 @@ func (r *LinodeMachineReconciler) resizeRootDisk( conditions.MarkTrue(machineScope.LinodeMachine, ConditionPreflightRootDiskResizing) } - // wait for the disk to resize - if _, err := machineScope.LinodeClient.WaitForInstanceDiskStatus(ctx, linodeInstanceID, rootDiskID, linodego.DiskReady, defaultResizeWaitSeconds); err != nil { - logger.Info("Timed out resizing root disk", - "timeout", defaultResizeWaitSeconds, - "reqeue", true, - ) - conditions.MarkFalse(machineScope.LinodeMachine, ConditionPreflightRootDiskResized, string(cerrs.CreateMachineError), clusterv1.ConditionSeverityWarning, err.Error()) - - return err - } - conditions.Delete(machineScope.LinodeMachine, ConditionPreflightRootDiskResizing) conditions.MarkTrue(machineScope.LinodeMachine, ConditionPreflightRootDiskResized) diff --git a/controller/linodemachine_controller_test.go b/controller/linodemachine_controller_test.go index 781914d26..d561c0738 100644 --- a/controller/linodemachine_controller_test.go +++ b/controller/linodemachine_controller_test.go @@ -273,17 +273,13 @@ var _ = Describe("create", Label("machine", "create"), func() { ResizeInstanceDisk(ctx, 123, 100, 4262). After(getInstDisk). Return(nil) - waitForInstDisk := mockLinodeClient.EXPECT(). - WaitForInstanceDiskStatus(ctx, 123, 100, linodego.DiskReady, defaultResizeWaitSeconds). - After(resizeInstDisk). - Return(nil, nil) createEtcdDisk := mockLinodeClient.EXPECT(). CreateInstanceDisk(ctx, 123, linodego.InstanceDiskCreateOptions{ Label: "etcd-data", Size: 10738, Filesystem: string(linodego.FilesystemExt4), }). - After(waitForInstDisk). + After(resizeInstDisk). Return(&linodego.InstanceDisk{ID: 101}, nil) listInstConfsForProfile := mockLinodeClient.EXPECT(). ListInstanceConfigs(ctx, 123, gomock.Any()). @@ -398,10 +394,15 @@ var _ = Describe("create", Label("machine", "create"), func() { ResizeInstanceDisk(ctx, 123, 100, 4262). After(getInstDisk). Return(nil) - mockLinodeClient.EXPECT(). - WaitForInstanceDiskStatus(ctx, 123, 100, linodego.DiskReady, defaultResizeWaitSeconds). + + createFailedEtcdDisk := mockLinodeClient.EXPECT(). + CreateInstanceDisk(ctx, 123, linodego.InstanceDiskCreateOptions{ + Label: "etcd-data", + Size: 10738, + Filesystem: string(linodego.FilesystemExt4), + }). After(resizeInstDisk). - Return(nil, errors.New("Waiting for Instance 123 Disk 100 status ready: not yet")) + Return(nil, linodego.Error{Code: 400}) mScope := scope.MachineScope{ Client: k8sClient, @@ -421,30 +422,19 @@ var _ = Describe("create", Label("machine", "create"), func() { listInst = mockLinodeClient.EXPECT(). ListInstances(ctx, gomock.Any()). + After(createFailedEtcdDisk). Return([]linodego.Instance{{ ID: 123, IPv4: []*net.IP{ptr.To(net.IPv4(192, 168, 0, 2))}, Status: linodego.InstanceOffline, }}, nil) - listInstConfs = mockLinodeClient.EXPECT(). - ListInstanceConfigs(ctx, 123, gomock.Any()). - After(listInst). - Return([]linodego.InstanceConfig{{ - Devices: &linodego.InstanceConfigDeviceMap{ - SDA: &linodego.InstanceConfigDevice{DiskID: 100}, - }, - }}, nil) - waitForInstDisk := mockLinodeClient.EXPECT(). - WaitForInstanceDiskStatus(ctx, 123, 100, linodego.DiskReady, defaultResizeWaitSeconds). - After(listInstConfs). - Return(nil, nil) createEtcdDisk := mockLinodeClient.EXPECT(). CreateInstanceDisk(ctx, 123, linodego.InstanceDiskCreateOptions{ Label: "etcd-data", Size: 10738, Filesystem: string(linodego.FilesystemExt4), }). - After(waitForInstDisk). + After(listInst). Return(&linodego.InstanceDisk{ID: 101}, nil) listInstConfsForProfile := mockLinodeClient.EXPECT(). ListInstanceConfigs(ctx, 123, gomock.Any()). diff --git a/mock/client.go b/mock/client.go index 90d363d79..fb5748fe2 100644 --- a/mock/client.go +++ b/mock/client.go @@ -369,21 +369,6 @@ func (mr *MockLinodeMachineClientMockRecorder) UpdateInstanceConfig(ctx, linodeI return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateInstanceConfig", reflect.TypeOf((*MockLinodeMachineClient)(nil).UpdateInstanceConfig), ctx, linodeID, configID, opts) } -// WaitForInstanceDiskStatus mocks base method. -func (m *MockLinodeMachineClient) WaitForInstanceDiskStatus(ctx context.Context, instanceID, diskID int, status linodego.DiskStatus, timeoutSeconds int) (*linodego.InstanceDisk, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "WaitForInstanceDiskStatus", ctx, instanceID, diskID, status, timeoutSeconds) - ret0, _ := ret[0].(*linodego.InstanceDisk) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// WaitForInstanceDiskStatus indicates an expected call of WaitForInstanceDiskStatus. -func (mr *MockLinodeMachineClientMockRecorder) WaitForInstanceDiskStatus(ctx, instanceID, diskID, status, timeoutSeconds any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WaitForInstanceDiskStatus", reflect.TypeOf((*MockLinodeMachineClient)(nil).WaitForInstanceDiskStatus), ctx, instanceID, diskID, status, timeoutSeconds) -} - // MockLinodeInstanceClient is a mock of LinodeInstanceClient interface. type MockLinodeInstanceClient struct { ctrl *gomock.Controller @@ -629,21 +614,6 @@ func (mr *MockLinodeInstanceClientMockRecorder) UpdateInstanceConfig(ctx, linode return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateInstanceConfig", reflect.TypeOf((*MockLinodeInstanceClient)(nil).UpdateInstanceConfig), ctx, linodeID, configID, opts) } -// WaitForInstanceDiskStatus mocks base method. -func (m *MockLinodeInstanceClient) WaitForInstanceDiskStatus(ctx context.Context, instanceID, diskID int, status linodego.DiskStatus, timeoutSeconds int) (*linodego.InstanceDisk, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "WaitForInstanceDiskStatus", ctx, instanceID, diskID, status, timeoutSeconds) - ret0, _ := ret[0].(*linodego.InstanceDisk) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// WaitForInstanceDiskStatus indicates an expected call of WaitForInstanceDiskStatus. -func (mr *MockLinodeInstanceClientMockRecorder) WaitForInstanceDiskStatus(ctx, instanceID, diskID, status, timeoutSeconds any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WaitForInstanceDiskStatus", reflect.TypeOf((*MockLinodeInstanceClient)(nil).WaitForInstanceDiskStatus), ctx, instanceID, diskID, status, timeoutSeconds) -} - // MockLinodeVPCClient is a mock of LinodeVPCClient interface. type MockLinodeVPCClient struct { ctrl *gomock.Controller