Skip to content

Commit 698763e

Browse files
Codelaxremyleone
andauthored
feat(instance_server): use sbs api per default for block volumes (#2804)
* feat(instance_server): use sbs api per default for block volumes * default to sbs based image * fix typo * resolve image label after root volume preparation * fix image uuid in request * update cassettes * record vpc and ipam cassettes --------- Co-authored-by: Rémy Léone <[email protected]>
1 parent 8123591 commit 698763e

21 files changed

+14895
-10056
lines changed

internal/services/instance/helpers_instance.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,7 @@ func prepareRootVolume(rootVolumeI map[string]any, serverType *instance.ServerTy
511511
// If the rootVolumeType is not defined, define it depending on the offer
512512
if rootVolumeType == "" {
513513
if serverTypeCanBootOnBlock {
514-
rootVolumeType = instance.VolumeVolumeTypeBSSD.String()
514+
rootVolumeType = instance.VolumeVolumeTypeSbsVolume.String()
515515
} else {
516516
rootVolumeType = instance.VolumeVolumeTypeLSSD.String()
517517
}

internal/services/instance/helpers_instance_block.go

+9-3
Original file line numberDiff line numberDiff line change
@@ -193,9 +193,15 @@ func instanceAndBlockAPIWithZoneAndID(m interface{}, zonedID string) (*BlockAndI
193193
}, zone, ID, nil
194194
}
195195

196-
func volumeTypeToMarketplaceFilter(volumeType any) marketplace.LocalImageType {
197-
if volumeType != nil && instance.VolumeVolumeType(volumeType.(string)) == instance.VolumeVolumeTypeSbsVolume {
196+
func volumeTypeToMarketplaceFilter(volumeType instance.VolumeVolumeType) marketplace.LocalImageType {
197+
switch volumeType {
198+
case instance.VolumeVolumeTypeSbsVolume:
198199
return marketplace.LocalImageTypeInstanceSbs
200+
case instance.VolumeVolumeTypeBSSD:
201+
return marketplace.LocalImageTypeInstanceLocal
202+
case instance.VolumeVolumeTypeLSSD:
203+
return marketplace.LocalImageTypeInstanceLocal
199204
}
200-
return marketplace.LocalImageTypeInstanceLocal
205+
206+
return marketplace.LocalImageTypeInstanceSbs
201207
}

internal/services/instance/server.go

+22-21
Original file line numberDiff line numberDiff line change
@@ -389,22 +389,6 @@ func ResourceInstanceServerCreate(ctx context.Context, d *schema.ResourceData, m
389389
commercialType := d.Get("type").(string)
390390

391391
imageUUID := locality.ExpandID(d.Get("image"))
392-
if imageUUID != "" && !scwvalidation.IsUUID(imageUUID) {
393-
// Replace dashes with underscores ubuntu-focal -> ubuntu_focal
394-
imageLabel := formatImageLabel(imageUUID)
395-
396-
marketPlaceAPI := marketplace.NewAPI(meta.ExtractScwClient(m))
397-
image, err := marketPlaceAPI.GetLocalImageByLabel(&marketplace.GetLocalImageByLabelRequest{
398-
CommercialType: commercialType,
399-
Zone: zone,
400-
ImageLabel: imageLabel,
401-
Type: volumeTypeToMarketplaceFilter(d.Get("root_volume.0.volume_type")),
402-
})
403-
if err != nil {
404-
return diag.FromErr(fmt.Errorf("could not get image '%s': %s", zonal.NewID(zone, imageLabel), err))
405-
}
406-
imageUUID = image.ID
407-
}
408392

409393
req := &instanceSDK.CreateServerRequest{
410394
Zone: zone,
@@ -417,10 +401,6 @@ func ResourceInstanceServerCreate(ctx context.Context, d *schema.ResourceData, m
417401
RoutedIPEnabled: types.ExpandBoolPtr(types.GetBool(d, "routed_ip_enabled")),
418402
}
419403

420-
if imageUUID != "" {
421-
req.Image = scw.StringPtr(imageUUID)
422-
}
423-
424404
enableIPv6, ok := d.GetOk("enable_ipv6")
425405
if ok {
426406
req.EnableIPv6 = scw.BoolPtr(enableIPv6.(bool)) //nolint:staticcheck
@@ -473,6 +453,27 @@ func ResourceInstanceServerCreate(ctx context.Context, d *schema.ResourceData, m
473453
return diag.FromErr(err)
474454
}
475455

456+
if imageUUID != "" && !scwvalidation.IsUUID(imageUUID) {
457+
// Replace dashes with underscores ubuntu-focal -> ubuntu_focal
458+
imageLabel := formatImageLabel(imageUUID)
459+
460+
marketPlaceAPI := marketplace.NewAPI(meta.ExtractScwClient(m))
461+
image, err := marketPlaceAPI.GetLocalImageByLabel(&marketplace.GetLocalImageByLabelRequest{
462+
CommercialType: commercialType,
463+
Zone: zone,
464+
ImageLabel: imageLabel,
465+
Type: volumeTypeToMarketplaceFilter(req.Volumes["0"].VolumeType),
466+
})
467+
if err != nil {
468+
return diag.FromErr(fmt.Errorf("could not get image '%s': %s", zonal.NewID(zone, imageLabel), err))
469+
}
470+
imageUUID = image.ID
471+
}
472+
473+
if imageUUID != "" {
474+
req.Image = scw.StringPtr(imageUUID)
475+
}
476+
476477
res, err := api.CreateServer(req, scw.WithContext(ctx))
477478
if err != nil {
478479
return diag.FromErr(err)
@@ -1431,7 +1432,7 @@ func instanceServerVolumesUpdate(ctx context.Context, d *schema.ResourceData, ap
14311432

14321433
// local volumes can only be added when the server is stopped
14331434
if volumeHasChange && !serverIsStopped && volume.IsLocal() && volume.IsAttached() {
1434-
return nil, errors.New("instanceSDK must be stopped to change local volumes")
1435+
return nil, errors.New("instance must be stopped to change local volumes")
14351436
}
14361437
volumes[strconv.Itoa(i+1)] = volume.VolumeTemplate()
14371438
}

0 commit comments

Comments
 (0)