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  }