Skip to content

Commit 3f2a734

Browse files
committed
Prefix new server's root-volume with server hostname (#63)
1 parent 0fb3977 commit 3f2a734

File tree

2 files changed

+93
-0
lines changed

2 files changed

+93
-0
lines changed

api/api.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,22 @@ type ScalewayVolumeDefinition struct {
150150
Organization string `json:"organization"`
151151
}
152152

153+
// ScalewayVolumePutDefinition represents a Scaleway C1 volume with nullable fields (for PUT)
154+
type ScalewayVolumePutDefinition struct {
155+
Identifier *string `json:"id,omitempty"`
156+
Size *uint64 `json:"size,omitempty"`
157+
CreationDate *string `json:"creation_date,omitempty"`
158+
ModificationDate *string `json:"modification_date,omitempty"`
159+
Organization *string `json:"organization,omitempty"`
160+
Name *string `json:"name,omitempty"`
161+
Server struct {
162+
Identifier *string `json:"id,omitempty"`
163+
Name *string `json:"name,omitempty"`
164+
} `json:"server,omitempty"`
165+
VolumeType *string `json:"volume_type,omitempty"`
166+
ExportURI *string `json:"export_uri,omitempty"`
167+
}
168+
153169
// ScalewayImage represents a Scaleway Image
154170
type ScalewayImage struct {
155171
// Identifier is a unique identifier for the image
@@ -544,6 +560,25 @@ func (s *ScalewayAPI) PatchResponse(resource string, data interface{}) (*http.Re
544560
return client.Do(req)
545561
}
546562

563+
// PutResponse returns an http.Response object for the updated resource
564+
func (s *ScalewayAPI) PutResponse(resource string, data interface{}) (*http.Response, error) {
565+
uri := fmt.Sprintf("%s/%s", strings.TrimRight(s.APIEndPoint, "/"), resource)
566+
client := &http.Client{}
567+
payload := new(bytes.Buffer)
568+
encoder := json.NewEncoder(payload)
569+
if err := encoder.Encode(data); err != nil {
570+
return nil, err
571+
}
572+
log.Debugf("PUT %s payload=%s", uri, strings.TrimSpace(fmt.Sprintf("%s", payload)))
573+
req, err := http.NewRequest("PUT", uri, payload)
574+
if err != nil {
575+
return nil, err
576+
}
577+
req.Header.Set("X-Auth-Token", s.Token)
578+
req.Header.Set("Content-Type", "application/json")
579+
return client.Do(req)
580+
}
581+
547582
// DeleteResponse returns an http.Response object for the deleted resource
548583
func (s *ScalewayAPI) DeleteResponse(resource string) (*http.Response, error) {
549584
uri := fmt.Sprintf("%s/%s", strings.TrimRight(s.APIEndPoint, "/"), resource)
@@ -851,6 +886,32 @@ func (s *ScalewayAPI) PostVolume(definition ScalewayVolumeDefinition) (string, e
851886
return "", error
852887
}
853888

889+
// PutVolume updates a volume
890+
func (s *ScalewayAPI) PutVolume(volumeID string, definition ScalewayVolumePutDefinition) error {
891+
resp, err := s.PutResponse(fmt.Sprintf("volumes/%s", volumeID), definition)
892+
if err != nil {
893+
return err
894+
}
895+
896+
defer resp.Body.Close()
897+
decoder := json.NewDecoder(resp.Body)
898+
899+
// Succeed PUT code
900+
if resp.StatusCode == 200 {
901+
return nil
902+
}
903+
904+
var error ScalewayAPIError
905+
err = decoder.Decode(&error)
906+
if err != nil {
907+
return err
908+
}
909+
910+
error.StatusCode = resp.StatusCode
911+
error.Debug()
912+
return error
913+
}
914+
854915
// ResolveServer attempts the find a matching Identifier for the input string
855916
func (s *ScalewayAPI) ResolveServer(needle string) ([]string, error) {
856917
servers := s.Cache.LookUpServers(needle, true)

api/helpers.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ func CreateServer(api *ScalewayAPI, imageName string, name string, bootscript st
234234
server.Bootscript = &bootscript
235235
}
236236

237+
inheritingVolume := false
237238
_, err := humanize.ParseBytes(imageName)
238239
if err == nil {
239240
// Create a new root volume
@@ -245,6 +246,7 @@ func CreateServer(api *ScalewayAPI, imageName string, name string, bootscript st
245246
} else {
246247
// Use an existing image
247248
// FIXME: handle snapshots
249+
inheritingVolume = true
248250
image := api.GetImageID(imageName, false)
249251
if image != "" {
250252
server.Image = &image
@@ -263,6 +265,36 @@ func CreateServer(api *ScalewayAPI, imageName string, name string, bootscript st
263265
return "", nil
264266
}
265267

268+
// For inherited volumes, we prefix the name with server hostname
269+
if inheritingVolume {
270+
createdServer, err := api.GetServer(serverID)
271+
if err != nil {
272+
return "", err
273+
}
274+
currentVolume := createdServer.Volumes["0"]
275+
276+
var volumePayload ScalewayVolumePutDefinition
277+
newName := fmt.Sprintf("%s-%s", createdServer.Hostname, currentVolume.Name)
278+
volumePayload.Name = &newName
279+
volumePayload.CreationDate = &currentVolume.CreationDate
280+
volumePayload.Organization = &currentVolume.Organization
281+
volumePayload.Server.Identifier = &currentVolume.Server.Identifier
282+
volumePayload.Server.Name = &currentVolume.Server.Name
283+
volumePayload.Identifier = &currentVolume.Identifier
284+
volumePayload.Size = &currentVolume.Size
285+
volumePayload.ModificationDate = &currentVolume.ModificationDate
286+
volumePayload.ExportURI = &currentVolume.ExportURI
287+
288+
// FIXME: temporary workaround for API bug
289+
newType := "l_hdd"
290+
volumePayload.VolumeType = &newType
291+
292+
err = api.PutVolume(currentVolume.Identifier, volumePayload)
293+
if err != nil {
294+
return "", err
295+
}
296+
}
297+
266298
return serverID, nil
267299
}
268300

0 commit comments

Comments
 (0)