diff --git a/internal/utils/client.go b/internal/utils/client.go index c5e8715c..d4a7b54c 100644 --- a/internal/utils/client.go +++ b/internal/utils/client.go @@ -288,6 +288,14 @@ func (c *Client) StartServer(datacenterId, serverId string) error { return nil } +func (c *Client) ResumeServer(datacenterId, serverId string) error { + _, err := c.ServersApi.DatacentersServersResumePost(c.ctx, datacenterId, serverId).Execute() + if err != nil { + return sdk_utils.ShortenOpenApiErr(err) + } + return nil +} + func (c *Client) StopServer(datacenterId, serverId string) error { _, err := c.ServersApi.DatacentersServersStopPost(c.ctx, datacenterId, serverId).Execute() if err != nil { @@ -296,6 +304,14 @@ func (c *Client) StopServer(datacenterId, serverId string) error { return nil } +func (c *Client) SuspendServer(datacenterId, serverId string) error { + _, err := c.ServersApi.DatacentersServersSuspendPost(c.ctx, datacenterId, serverId).Execute() + if err != nil { + return sdk_utils.ShortenOpenApiErr(err) + } + return nil +} + func (c *Client) RestartServer(datacenterId, serverId string) error { _, err := c.ServersApi.DatacentersServersRebootPost(c.ctx, datacenterId, serverId).Execute() if err != nil { diff --git a/internal/utils/client_service.go b/internal/utils/client_service.go index 3746dc8b..936d7dc3 100644 --- a/internal/utils/client_service.go +++ b/internal/utils/client_service.go @@ -26,7 +26,9 @@ type ClientService interface { GetNic(datacenterId, ServerId, NicId string) (*ionoscloud.Nic, error) GetTemplates() (*ionoscloud.Templates, error) StartServer(datacenterId, serverId string) error + ResumeServer(datacenterId, serverId string) error StopServer(datacenterId, serverId string) error + SuspendServer(datacenterId, serverId string) error RestartServer(datacenterId, serverId string) error RemoveServer(datacenterId, serverId string) error CreateAttachVolume(datacenterId, serverId string, properties *ClientVolumeProperties) (*ionoscloud.Volume, error) diff --git a/internal/utils/mocks/ClientService.go b/internal/utils/mocks/ClientService.go index 75fe3fff..7aa7636f 100644 --- a/internal/utils/mocks/ClientService.go +++ b/internal/utils/mocks/ClientService.go @@ -447,6 +447,20 @@ func (mr *MockClientServiceMockRecorder) RestartServer(datacenterId, serverId in return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RestartServer", reflect.TypeOf((*MockClientService)(nil).RestartServer), datacenterId, serverId) } +// ResumeServer mocks base method. +func (m *MockClientService) ResumeServer(datacenterId, serverId string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ResumeServer", datacenterId, serverId) + ret0, _ := ret[0].(error) + return ret0 +} + +// ResumeServer indicates an expected call of ResumeServer. +func (mr *MockClientServiceMockRecorder) ResumeServer(datacenterId, serverId interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResumeServer", reflect.TypeOf((*MockClientService)(nil).ResumeServer), datacenterId, serverId) +} + // StartServer mocks base method. func (m *MockClientService) StartServer(datacenterId, serverId string) error { m.ctrl.T.Helper() @@ -475,6 +489,20 @@ func (mr *MockClientServiceMockRecorder) StopServer(datacenterId, serverId inter return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StopServer", reflect.TypeOf((*MockClientService)(nil).StopServer), datacenterId, serverId) } +// SuspendServer mocks base method. +func (m *MockClientService) SuspendServer(datacenterId, serverId string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SuspendServer", datacenterId, serverId) + ret0, _ := ret[0].(error) + return ret0 +} + +// SuspendServer indicates an expected call of SuspendServer. +func (mr *MockClientServiceMockRecorder) SuspendServer(datacenterId, serverId interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SuspendServer", reflect.TypeOf((*MockClientService)(nil).SuspendServer), datacenterId, serverId) +} + // UpdateCloudInitFile mocks base method. func (m *MockClientService) UpdateCloudInitFile(cloudInitYAML, key string, value []interface{}, single_value bool, behaviour string) (string, error) { m.ctrl.T.Helper() diff --git a/ionoscloud.go b/ionoscloud.go index 3dbb9be0..fd0f7ce6 100644 --- a/ionoscloud.go +++ b/ionoscloud.go @@ -933,7 +933,14 @@ func (d *Driver) Start() error { return fmt.Errorf("error getting state: %w", err) } if serverState != state.Running { - err = d.client().StartServer(d.DatacenterId, d.ServerId) + if d.ServerType == "ENTERPRISE" { + err = d.client().StartServer(d.DatacenterId, d.ServerId) + } else if d.ServerType == "CUBE" { + err = d.client().ResumeServer(d.DatacenterId, d.ServerId) + } else { + err = fmt.Errorf("Wrong server type: %s", d.ServerType) + } + if err != nil { return fmt.Errorf("error starting server: %w", err) } @@ -953,7 +960,13 @@ func (d *Driver) Stop() error { log.Infof("Host is already stopped") return nil } - err = d.client().StopServer(d.DatacenterId, d.ServerId) + if d.ServerType == "ENTERPRISE" { + err = d.client().StopServer(d.DatacenterId, d.ServerId) + } else if d.ServerType == "CUBE" { + err = d.client().SuspendServer(d.DatacenterId, d.ServerId) + } else { + err = fmt.Errorf("Wrong server type: %s", d.ServerType) + } if err != nil { return fmt.Errorf("error stoping server: %w", err) } @@ -1015,15 +1028,17 @@ func (d *Driver) GetState() (state.State, error) { return state.None, fmt.Errorf("error getting server: %w", err) } - if metadata, ok := server.GetMetadataOk(); ok && metadata != nil { - if metadataState, ok := metadata.GetStateOk(); ok && metadataState != nil { - switch *metadataState { + if serverProperties, ok := server.GetPropertiesOk(); ok && serverProperties != nil { + if vmState, ok := serverProperties.GetVmStateOk(); ok && vmState != nil { + switch *vmState { case "NOSTATE": return state.None, nil - case "AVAILABLE": + case "RUNNING": return state.Running, nil case "PAUSED": return state.Paused, nil + case "SUSPENDED": + return state.Stopped, nil case "BLOCKED": return state.Stopped, nil case "SHUTDOWN": @@ -1032,8 +1047,6 @@ func (d *Driver) GetState() (state.State, error) { return state.Stopped, nil case "CRASHED": return state.Error, nil - case "INACTIVE": - return state.Stopped, nil } } } diff --git a/ionoscloud_test.go b/ionoscloud_test.go index e5cecda4..9940313c 100644 --- a/ionoscloud_test.go +++ b/ionoscloud_test.go @@ -806,7 +806,7 @@ func TestStartServerErr(t *testing.T) { } func TestStartRunningServer(t *testing.T) { - s := serverWithState(testVar, "AVAILABLE") + s := serverWithState(testVar, "RUNNING") driver, clientMock := NewTestDriverFlagsSet(t, authFlagsSet) driver.DatacenterId = testVar driver.ServerId = testVar @@ -826,7 +826,7 @@ func TestStopErr(t *testing.T) { } func TestStop(t *testing.T) { - s := serverWithState(testVar, "NOSTATE") + s := serverWithState(testVar, "SHUTOFF") driver, clientMock := NewTestDriverFlagsSet(t, authFlagsSet) driver.DatacenterId = testVar driver.ServerId = testVar @@ -1005,8 +1005,8 @@ func TestGetImageId(t *testing.T) { func serverWithState(serverId, serverState string) *sdkgo.Server { return &sdkgo.Server{ Id: &serverId, - Metadata: &sdkgo.DatacenterElementMetadata{ - State: &serverState, + Properties: &sdkgo.ServerProperties{ + VmState: &serverState, }, } } @@ -1014,8 +1014,8 @@ func serverWithState(serverId, serverState string) *sdkgo.Server { func serverWithNicAttached(serverId, serverState, nicId string) *sdkgo.Server { return &sdkgo.Server{ Id: &serverId, - Metadata: &sdkgo.DatacenterElementMetadata{ - State: &serverState, + Properties: &sdkgo.ServerProperties{ + VmState: &serverState, }, Entities: &sdkgo.ServerEntities{ Nics: &sdkgo.Nics{