Skip to content

Commit

Permalink
Merge pull request #15411 from scaleway/scw_instance_resize_and_termi…
Browse files Browse the repository at this point in the history
…nation

scaleway: instance resize and termination
  • Loading branch information
k8s-ci-robot committed May 17, 2023
2 parents eccf23c + 33a4246 commit 7a45e92
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 43 deletions.
46 changes: 9 additions & 37 deletions upup/pkg/fi/cloudup/scaleway/cloud.go
Original file line number Diff line number Diff line change
Expand Up @@ -474,7 +474,7 @@ func (s *scwCloudImplementation) DeleteLoadBalancer(loadBalancer *lb.LB) error {
}

func (s *scwCloudImplementation) DeleteServer(server *instance.Server) error {
srv, err := s.instanceAPI.GetServer(&instance.GetServerRequest{
_, err := s.instanceAPI.GetServer(&instance.GetServerRequest{
Zone: s.zone,
ServerID: server.ID,
})
Expand All @@ -486,50 +486,22 @@ func (s *scwCloudImplementation) DeleteServer(server *instance.Server) error {
return err
}

// If the server is running, we turn it off and wait before deleting it
if srv.Server.State == instance.ServerStateRunning {
_, err := s.instanceAPI.ServerAction(&instance.ServerActionRequest{
Zone: s.zone,
ServerID: server.ID,
Action: instance.ServerActionPoweroff,
})
if err != nil {
return fmt.Errorf("delete server %s: error powering off instance: %w", server.ID, err)
}
}
_, err = s.instanceAPI.WaitForServer(&instance.WaitForServerRequest{
ServerID: server.ID,
// We terminate the server. This stops and deletes the machine immediately
_, err = s.instanceAPI.ServerAction(&instance.ServerActionRequest{
Zone: s.zone,
})
if err != nil {
return fmt.Errorf("delete server %s: error waiting for instance after power-off: %w", server.ID, err)
}

// We delete the server and wait before deleting its volumes
err = s.instanceAPI.DeleteServer(&instance.DeleteServerRequest{
ServerID: server.ID,
Zone: s.zone,
Action: instance.ServerActionTerminate,
})
if err != nil {
return fmt.Errorf("delete server %s: error deleting instance: %w", server.ID, err)
if err != nil && !is404Error(err) {
return fmt.Errorf("delete server %s: error terminating instance: %w", server.ID, err)
}

_, err = s.instanceAPI.WaitForServer(&instance.WaitForServerRequest{
ServerID: server.ID,
Zone: s.zone,
})
if !is404Error(err) {
return fmt.Errorf("delete server %s: error waiting for instance after deletion: %w", server.ID, err)
}

// We delete the volumes that were attached to the server (including etcd volumes)
for i := range server.Volumes {
err = s.instanceAPI.DeleteVolume(&instance.DeleteVolumeRequest{
Zone: s.zone,
VolumeID: server.Volumes[i].ID,
})
if err != nil {
return fmt.Errorf("delete server %s: error deleting volume %s: %w", server.ID, server.Volumes[i].Name, err)
}
if err != nil && !is404Error(err) {
return fmt.Errorf("delete server %s: error waiting for instance after termination: %w", server.ID, err)
}

return nil
Expand Down
29 changes: 23 additions & 6 deletions upup/pkg/fi/cloudup/scalewaytasks/instance.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ import (
"k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter"
)

var commercialTypesWithBlockStorageOnly = []string{"PRO", "PLAY", "ENT"}

// +kops:fitask
type Instance struct {
Name *string
Expand Down Expand Up @@ -155,19 +157,34 @@ func (_ *Instance) RenderScw(t *scaleway.ScwAPITarget, actual, expected, changes
}
uniqueName := fmt.Sprintf("%s-%d", fi.ValueOf(expected.Name), i+actualCount)

// We create the instance
srv, err := instanceService.CreateServer(&instance.CreateServerRequest{
// If the instance's commercial type is one that has no local storage, we have to specify for the
// block storage volume a big enough size (default size is 10GB)
commercialType := fi.ValueOf(expected.CommercialType)
createServerRequest := instance.CreateServerRequest{
Zone: zone,
Name: uniqueName,
CommercialType: fi.ValueOf(expected.CommercialType),
CommercialType: commercialType,
Image: fi.ValueOf(expected.Image),
Tags: expected.Tags,
})
}
for _, ct := range commercialTypesWithBlockStorageOnly {
if strings.HasPrefix(commercialType, ct) {
continue
}
createServerRequest.Volumes = map[string]*instance.VolumeServerTemplate{
"0": {
Boot: true,
Size: scw.GB * 50,
VolumeType: instance.VolumeVolumeTypeBSSD,
},
}
}

// We create the instance and wait for it to be ready
srv, err := instanceService.CreateServer(&createServerRequest)
if err != nil {
return fmt.Errorf("error creating instance of group %q: %w", fi.ValueOf(expected.Name), err)
}

// We wait for the instance to be ready
_, err = instanceService.WaitForServer(&instance.WaitForServerRequest{
ServerID: srv.Server.ID,
Zone: zone,
Expand Down

0 comments on commit 7a45e92

Please sign in to comment.