github.com/emc-cmd/terraform@v0.7.8-0.20161101145618-f16309630e7c/builtin/providers/scaleway/helpers.go (about) 1 package scaleway 2 3 import ( 4 "fmt" 5 "time" 6 7 "github.com/hashicorp/terraform/helper/resource" 8 "github.com/scaleway/scaleway-cli/pkg/api" 9 ) 10 11 // Bool returns a pointer to of the bool value passed in. 12 func Bool(val bool) *bool { 13 return &val 14 } 15 16 // String returns a pointer to of the string value passed in. 17 func String(val string) *string { 18 return &val 19 } 20 21 func validateVolumeType(v interface{}, k string) (ws []string, errors []error) { 22 value := v.(string) 23 if value != "l_ssd" { 24 errors = append(errors, fmt.Errorf("%q must be l_ssd", k)) 25 } 26 return 27 } 28 29 func validateVolumeSize(v interface{}, k string) (ws []string, errors []error) { 30 value := v.(int) 31 if value < 1 || value > 150 { 32 errors = append(errors, fmt.Errorf("%q be more than 1 and less than 150", k)) 33 } 34 return 35 } 36 37 // deleteRunningServer terminates the server and waits until it is removed. 38 func deleteRunningServer(scaleway *api.ScalewayAPI, server *api.ScalewayServer) error { 39 err := scaleway.PostServerAction(server.Identifier, "terminate") 40 41 if err != nil { 42 if serr, ok := err.(api.ScalewayAPIError); ok { 43 if serr.StatusCode == 404 { 44 return nil 45 } 46 } 47 48 return err 49 } 50 51 return resource.Retry(20*time.Minute, func() *resource.RetryError { 52 _, err := scaleway.GetServer(server.Identifier) 53 54 if err == nil { 55 return resource.RetryableError(fmt.Errorf("Waiting for server %q to be deleted", server.Identifier)) 56 } 57 58 if serr, ok := err.(api.ScalewayAPIError); ok { 59 if serr.StatusCode == 404 { 60 return nil 61 } 62 } 63 64 return resource.RetryableError(err) 65 }) 66 } 67 68 // deleteStoppedServer needs to cleanup attached root volumes. this is not done 69 // automatically by Scaleway 70 func deleteStoppedServer(scaleway *api.ScalewayAPI, server *api.ScalewayServer) error { 71 if err := scaleway.DeleteServer(server.Identifier); err != nil { 72 return err 73 } 74 75 if rootVolume, ok := server.Volumes["0"]; ok { 76 if err := scaleway.DeleteVolume(rootVolume.Identifier); err != nil { 77 return err 78 } 79 } 80 return nil 81 } 82 83 // NOTE copied from github.com/scaleway/scaleway-cli/pkg/api/helpers.go 84 // the helpers.go file pulls in quite a lot dependencies, and they're just convenience wrappers anyway 85 86 func waitForServerState(scaleway *api.ScalewayAPI, serverID, targetState string) error { 87 return resource.Retry(20*time.Minute, func() *resource.RetryError { 88 s, err := scaleway.GetServer(serverID) 89 90 if err != nil { 91 return resource.NonRetryableError(err) 92 } 93 94 if s.State != targetState { 95 return resource.RetryableError(fmt.Errorf("Waiting for server to enter %q state", targetState)) 96 } 97 98 return nil 99 }) 100 }