feat(scaleway): get image by label if not an UUID (#10061)

Signed-off-by: Patrik Cyvoct <patrik@ptrk.io>
This commit is contained in:
Patrik 2020-10-07 16:04:00 +02:00 committed by GitHub
parent a478bf6f37
commit d4d78feed2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 137 additions and 102 deletions

View File

@ -44,6 +44,7 @@ type Config struct {
// that will be used to launch a new server and provision it. See // that will be used to launch a new server and provision it. See
// the images list // the images list
// get the complete list of the accepted image UUID. // get the complete list of the accepted image UUID.
// The marketplace image label (eg `ubuntu_focal`) also works.
Image string `mapstructure:"image" required:"true"` Image string `mapstructure:"image" required:"true"`
// The name of the server commercial type: // The name of the server commercial type:
// C1, C2L, C2M, C2S, DEV1-S, DEV1-M, DEV1-L, DEV1-XL, // C1, C2L, C2M, C2S, DEV1-S, DEV1-M, DEV1-L, DEV1-XL,

View File

@ -5,9 +5,11 @@ import (
"fmt" "fmt"
"log" "log"
"github.com/hashicorp/go-uuid"
"github.com/hashicorp/packer/helper/multistep" "github.com/hashicorp/packer/helper/multistep"
"github.com/hashicorp/packer/packer" "github.com/hashicorp/packer/packer"
"github.com/scaleway/scaleway-sdk-go/api/instance/v1" "github.com/scaleway/scaleway-sdk-go/api/instance/v1"
"github.com/scaleway/scaleway-sdk-go/api/marketplace/v1"
"github.com/scaleway/scaleway-sdk-go/scw" "github.com/scaleway/scaleway-sdk-go/scw"
) )
@ -22,8 +24,27 @@ func (s *stepImage) Run(ctx context.Context, state multistep.StateBag) multistep
ui.Say(fmt.Sprintf("Creating image: %v", c.ImageName)) ui.Say(fmt.Sprintf("Creating image: %v", c.ImageName))
imageID := c.Image
// if not a UUID, we check the Marketplace API
_, err := uuid.ParseUUID(c.Image)
if err != nil {
apiMarketplace := marketplace.NewAPI(state.Get("client").(*scw.Client))
imageID, err = apiMarketplace.GetLocalImageIDByLabel(&marketplace.GetLocalImageIDByLabelRequest{
ImageLabel: c.Image,
Zone: scw.Zone(c.Zone),
CommercialType: c.CommercialType,
})
if err != nil {
err := fmt.Errorf("Error getting initial image info from marketplace: %s", err)
state.Put("error", err)
ui.Error(err.Error())
return multistep.ActionHalt
}
}
imageResp, err := instanceAPI.GetImage(&instance.GetImageRequest{ imageResp, err := instanceAPI.GetImage(&instance.GetImageRequest{
ImageID: c.Image, ImageID: imageID,
}) })
if err != nil { if err != nil {
err := fmt.Errorf("Error getting initial image info: %s", err) err := fmt.Errorf("Error getting initial image info: %s", err)

5
go.mod
View File

@ -42,7 +42,6 @@ require (
github.com/gobwas/glob v0.2.3 github.com/gobwas/glob v0.2.3
github.com/gofrs/flock v0.7.3 github.com/gofrs/flock v0.7.3
github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3
github.com/golang/protobuf v1.4.2 // indirect
github.com/google/go-cmp v0.5.2 github.com/google/go-cmp v0.5.2
github.com/google/go-querystring v1.0.0 // indirect github.com/google/go-querystring v1.0.0 // indirect
github.com/google/shlex v0.0.0-20150127133951-6f45313302b9 github.com/google/shlex v0.0.0-20150127133951-6f45313302b9
@ -94,7 +93,6 @@ require (
github.com/mitchellh/go-homedir v1.1.0 github.com/mitchellh/go-homedir v1.1.0
github.com/mitchellh/go-testing-interface v1.0.3 // indirect github.com/mitchellh/go-testing-interface v1.0.3 // indirect
github.com/mitchellh/go-vnc v0.0.0-20150629162542-723ed9867aed github.com/mitchellh/go-vnc v0.0.0-20150629162542-723ed9867aed
github.com/mitchellh/gox v1.0.1 // indirect
github.com/mitchellh/iochan v1.0.0 github.com/mitchellh/iochan v1.0.0
github.com/mitchellh/mapstructure v1.2.3 github.com/mitchellh/mapstructure v1.2.3
github.com/mitchellh/panicwrap v0.0.0-20170106182340-fce601fe5557 github.com/mitchellh/panicwrap v0.0.0-20170106182340-fce601fe5557
@ -113,7 +111,7 @@ require (
github.com/posener/complete v1.2.3 github.com/posener/complete v1.2.3
github.com/profitbricks/profitbricks-sdk-go v4.0.2+incompatible github.com/profitbricks/profitbricks-sdk-go v4.0.2+incompatible
github.com/satori/go.uuid v1.2.0 // indirect github.com/satori/go.uuid v1.2.0 // indirect
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.6.0.20200903143645-c0ce17a0443d github.com/scaleway/scaleway-sdk-go v1.0.0-beta.7
github.com/shirou/gopsutil v2.18.12+incompatible github.com/shirou/gopsutil v2.18.12+incompatible
github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4 // indirect github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4 // indirect
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d // indirect github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d // indirect
@ -137,7 +135,6 @@ require (
golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43 golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208
golang.org/x/sys v0.0.0-20200918174421-af09f7315aff golang.org/x/sys v0.0.0-20200918174421-af09f7315aff
golang.org/x/text v0.3.3 // indirect
golang.org/x/tools v0.0.0-20200918232735-d647fc253266 golang.org/x/tools v0.0.0-20200918232735-d647fc253266
google.golang.org/api v0.32.0 google.golang.org/api v0.32.0
google.golang.org/genproto v0.0.0-20200918140846-d0d605568037 // indirect google.golang.org/genproto v0.0.0-20200918140846-d0d605568037 // indirect

6
go.sum
View File

@ -376,7 +376,6 @@ github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=
github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-version v1.0.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/hashicorp/go-version v1.1.0 h1:bPIoEKD27tNdebFGGxxYwcL4nepeY4j1QP23PFRGzg0= github.com/hashicorp/go-version v1.1.0 h1:bPIoEKD27tNdebFGGxxYwcL4nepeY4j1QP23PFRGzg0=
github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/hashicorp/go-version v1.2.0 h1:3vNe/fWF5CBgRIguda1meWhsZHy3m8gCJ5wx+dIzX/E= github.com/hashicorp/go-version v1.2.0 h1:3vNe/fWF5CBgRIguda1meWhsZHy3m8gCJ5wx+dIzX/E=
@ -513,7 +512,6 @@ github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZX
github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4= github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4=
github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
github.com/mitchellh/gox v1.0.1/go.mod h1:ED6BioOGXMswlXa2zxfh/xdd5QhwYliBFn9V18Ap4z4=
github.com/mitchellh/iochan v1.0.0 h1:C+X3KsSTLFVBr/tK1eYN/vs4rJcvsiLU338UhYPJWeY= github.com/mitchellh/iochan v1.0.0 h1:C+X3KsSTLFVBr/tK1eYN/vs4rJcvsiLU338UhYPJWeY=
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
@ -581,8 +579,8 @@ github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkB
github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.6.0.20200903143645-c0ce17a0443d h1:pK33AoOAlzj6gJs/V1vi2Ouj2u1Ww84pREwxFi1oxkM= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.7 h1:Do8ksLD4Nr3pA0x0hnLOLftZgkiTDvwPDShRTUxtXpE=
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.6.0.20200903143645-c0ce17a0443d/go.mod h1:CJJ5VAbozOl0yEw7nHB9+7BXTJbIn6h7W+f6Gau5IP8= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.7/go.mod h1:CJJ5VAbozOl0yEw7nHB9+7BXTJbIn6h7W+f6Gau5IP8=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=

View File

@ -613,7 +613,7 @@ type Bootscript struct {
Initrd string `json:"initrd"` Initrd string `json:"initrd"`
// Kernel: the server kernel version // Kernel: the server kernel version
Kernel string `json:"kernel"` Kernel string `json:"kernel"`
// Organization: the bootscript organization // Organization: the bootscript organization ID
Organization string `json:"organization"` Organization string `json:"organization"`
// Project: the bootscript project ID // Project: the bootscript project ID
Project string `json:"project"` Project string `json:"project"`
@ -892,7 +892,7 @@ type PlacementGroup struct {
ID string `json:"id"` ID string `json:"id"`
// Name: the placement group name // Name: the placement group name
Name string `json:"name"` Name string `json:"name"`
// Organization: the placement group organization // Organization: the placement group organization ID
Organization string `json:"organization"` Organization string `json:"organization"`
// Project: the placement group project ID // Project: the placement group project ID
Project string `json:"project"` Project string `json:"project"`
@ -950,11 +950,11 @@ type SecurityGroup struct {
OutboundDefaultPolicy SecurityGroupPolicy `json:"outbound_default_policy"` OutboundDefaultPolicy SecurityGroupPolicy `json:"outbound_default_policy"`
// Organization: the security groups organization ID // Organization: the security groups organization ID
Organization string `json:"organization"` Organization string `json:"organization"`
// Project: the project ID of the security group // Project: the security group project ID
Project string `json:"project"` Project string `json:"project"`
// OrganizationDefault: true if it is your default security group for this organization // Deprecated: OrganizationDefault: true if it is your default security group for this organization ID
OrganizationDefault bool `json:"organization_default"` OrganizationDefault bool `json:"organization_default"`
// ProjectDefault: true if it is your default security group for this project id // ProjectDefault: true if it is your default security group for this project ID
ProjectDefault bool `json:"project_default"` ProjectDefault bool `json:"project_default"`
// CreationDate: the security group creation date // CreationDate: the security group creation date
CreationDate *time.Time `json:"creation_date"` CreationDate *time.Time `json:"creation_date"`
@ -1014,7 +1014,7 @@ type Server struct {
ID string `json:"id"` ID string `json:"id"`
// Name: the server name // Name: the server name
Name string `json:"name"` Name string `json:"name"`
// Organization: the server organization // Organization: the server organization ID
Organization string `json:"organization"` Organization string `json:"organization"`
// Project: the server project ID // Project: the server project ID
Project string `json:"project"` Project string `json:"project"`
@ -1181,37 +1181,41 @@ type SetPlacementGroupServersResponse struct {
Servers []*PlacementGroupServer `json:"servers"` Servers []*PlacementGroupServer `json:"servers"`
} }
// Snapshot: snapshot
type Snapshot struct { type Snapshot struct {
// ID: the snapshot ID
ID string `json:"id"` ID string `json:"id"`
// Name: the snapshot name
Name string `json:"name"` Name string `json:"name"`
// Organization: the snapshot organization ID
Organization string `json:"organization"` Organization string `json:"organization"`
// VolumeType: // Project: the snapshot project ID
Project string `json:"project"`
// VolumeType: the snapshot volume type
// //
// Default value: l_ssd // Default value: l_ssd
VolumeType VolumeVolumeType `json:"volume_type"` VolumeType VolumeVolumeType `json:"volume_type"`
// Size: the snapshot size
Size scw.Size `json:"size"` Size scw.Size `json:"size"`
// State: // State: the snapshot state
// //
// Default value: available // Default value: available
State SnapshotState `json:"state"` State SnapshotState `json:"state"`
// BaseVolume: the volume on which the snapshot is based on
BaseVolume *SnapshotBaseVolume `json:"base_volume"` BaseVolume *SnapshotBaseVolume `json:"base_volume"`
// CreationDate: the snapshot creation date
CreationDate *time.Time `json:"creation_date"` CreationDate *time.Time `json:"creation_date"`
// ModificationDate: the snapshot modification date
ModificationDate *time.Time `json:"modification_date"` ModificationDate *time.Time `json:"modification_date"`
// Zone: the snapshot zone
Project string `json:"project"`
Zone scw.Zone `json:"zone"` Zone scw.Zone `json:"zone"`
} }
// SnapshotBaseVolume: snapshot. base volume
type SnapshotBaseVolume struct { type SnapshotBaseVolume struct {
// ID: the volume ID on which the snapshot is based on
ID string `json:"id"` ID string `json:"id"`
// Name: the volume name on which the snapshot is based on
Name string `json:"name"` Name string `json:"name"`
} }
@ -1261,29 +1265,29 @@ type UpdateVolumeResponse struct {
// Volume: volume // Volume: volume
type Volume struct { type Volume struct {
// ID: the volumes unique ID // ID: the volume unique ID
ID string `json:"id"` ID string `json:"id"`
// Name: the volumes names // Name: the volume name
Name string `json:"name"` Name string `json:"name"`
// ExportURI: show the volumes NBD export URI // ExportURI: show the volume NBD export URI
ExportURI string `json:"export_uri"` ExportURI string `json:"export_uri"`
// Size: the volumes disk size // Size: the volume disk size
Size scw.Size `json:"size"` Size scw.Size `json:"size"`
// VolumeType: the volumes type // VolumeType: the volume type
// //
// Default value: l_ssd // Default value: l_ssd
VolumeType VolumeVolumeType `json:"volume_type"` VolumeType VolumeVolumeType `json:"volume_type"`
// CreationDate: the volumes creation date // CreationDate: the volume creation date
CreationDate *time.Time `json:"creation_date"` CreationDate *time.Time `json:"creation_date"`
// ModificationDate: the volumes modification date // ModificationDate: the volume modification date
ModificationDate *time.Time `json:"modification_date"` ModificationDate *time.Time `json:"modification_date"`
// Organization: the volumes organization // Organization: the volume organization ID
Organization string `json:"organization"` Organization string `json:"organization"`
// Project: the volumes project ID // Project: the volume project ID
Project string `json:"project"` Project string `json:"project"`
// Server: the server attached to the volume // Server: the server attached to the volume
Server *ServerSummary `json:"server"` Server *ServerSummary `json:"server"`
// State: the volumes state // State: the volume state
// //
// Default value: available // Default value: available
State VolumeState `json:"state"` State VolumeState `json:"state"`
@ -1315,10 +1319,12 @@ type VolumeTemplate struct {
// //
// Default value: l_ssd // Default value: l_ssd
VolumeType VolumeVolumeType `json:"volume_type,omitempty"` VolumeType VolumeVolumeType `json:"volume_type,omitempty"`
// Organization: organization ID of the volume // Deprecated: Organization: organization ID of the volume
Organization string `json:"organization,omitempty"` // Precisely one of Organization, Project must be set.
Organization *string `json:"organization,omitempty"`
// Project: project ID of the volume // Project: project ID of the volume
Project string `json:"project,omitempty"` // Precisely one of Organization, Project must be set.
Project *string `json:"project,omitempty"`
} }
type VolumeType struct { type VolumeType struct {
@ -1518,7 +1524,7 @@ type ListServersRequest struct {
PerPage *uint32 `json:"-"` PerPage *uint32 `json:"-"`
// Page: a positive integer to choose the page to return // Page: a positive integer to choose the page to return
Page *int32 `json:"-"` Page *int32 `json:"-"`
// Organization: list only servers of this organization // Organization: list only servers of this organization ID
Organization *string `json:"-"` Organization *string `json:"-"`
// Project: list only servers of this project ID // Project: list only servers of this project ID
Project *string `json:"-"` Project *string `json:"-"`
@ -1536,6 +1542,8 @@ type ListServersRequest struct {
State *ServerState `json:"-"` State *ServerState `json:"-"`
// Tags: list servers with these exact tags // Tags: list servers with these exact tags
Tags []string `json:"-"` Tags []string `json:"-"`
// PrivateNetwork: list servers in this Private Network
PrivateNetwork *string `json:"-"`
} }
// ListServers: list all servers // ListServers: list all servers
@ -1565,6 +1573,7 @@ func (s *API) ListServers(req *ListServersRequest, opts ...scw.RequestOption) (*
if len(req.Tags) != 0 { if len(req.Tags) != 0 {
parameter.AddToQuery(query, "tags", strings.Join(req.Tags, ",")) parameter.AddToQuery(query, "tags", strings.Join(req.Tags, ","))
} }
parameter.AddToQuery(query, "private_network", req.PrivateNetwork)
if fmt.Sprint(req.Zone) == "" { if fmt.Sprint(req.Zone) == "" {
return nil, errors.New("field Zone cannot be empty in request") return nil, errors.New("field Zone cannot be empty in request")
@ -1627,7 +1636,7 @@ type CreateServerRequest struct {
BootType *BootType `json:"boot_type,omitempty"` BootType *BootType `json:"boot_type,omitempty"`
// Bootscript: the bootscript ID to use when `boot_type` is set to `bootscript` // Bootscript: the bootscript ID to use when `boot_type` is set to `bootscript`
Bootscript *string `json:"bootscript,omitempty"` Bootscript *string `json:"bootscript,omitempty"`
// Organization: the server organization ID // Deprecated: Organization: the server organization ID
// Precisely one of Organization, Project must be set. // Precisely one of Organization, Project must be set.
Organization *string `json:"organization,omitempty"` Organization *string `json:"organization,omitempty"`
// Project: the server project ID // Project: the server project ID
@ -1639,8 +1648,6 @@ type CreateServerRequest struct {
SecurityGroup *string `json:"security_group,omitempty"` SecurityGroup *string `json:"security_group,omitempty"`
// PlacementGroup: placement group ID if server must be part of a placement group // PlacementGroup: placement group ID if server must be part of a placement group
PlacementGroup *string `json:"placement_group,omitempty"` PlacementGroup *string `json:"placement_group,omitempty"`
// PrivateNetwork: private Network IDs if the server need to be part of one or more Private Networks
PrivateNetwork []string `json:"private_network,omitempty"`
} }
// createServer: create a server // createServer: create a server
@ -1774,7 +1781,7 @@ type setServerRequest struct {
ID string `json:"-"` ID string `json:"-"`
// Name: the server name // Name: the server name
Name string `json:"name"` Name string `json:"name"`
// Organization: the server organization // Organization: the server organization ID
Organization string `json:"organization"` Organization string `json:"organization"`
// Project: the server project ID // Project: the server project ID
Project string `json:"project"` Project string `json:"project"`
@ -2262,7 +2269,7 @@ type CreateImageRequest struct {
DefaultBootscript string `json:"default_bootscript,omitempty"` DefaultBootscript string `json:"default_bootscript,omitempty"`
// ExtraVolumes: additional volumes of the image // ExtraVolumes: additional volumes of the image
ExtraVolumes map[string]*VolumeTemplate `json:"extra_volumes,omitempty"` ExtraVolumes map[string]*VolumeTemplate `json:"extra_volumes,omitempty"`
// Organization: organization ID of the image // Deprecated: Organization: organization ID of the image
// Precisely one of Organization, Project must be set. // Precisely one of Organization, Project must be set.
Organization *string `json:"organization,omitempty"` Organization *string `json:"organization,omitempty"`
// Project: project ID of the image // Project: project ID of the image
@ -2520,10 +2527,10 @@ type CreateSnapshotRequest struct {
Name string `json:"name,omitempty"` Name string `json:"name,omitempty"`
// VolumeID: UUID of the volume // VolumeID: UUID of the volume
VolumeID string `json:"volume_id,omitempty"` VolumeID string `json:"volume_id,omitempty"`
// Deprecated: Organization: organization ID of the snapshot
// Precisely one of Organization, Project must be set. // Precisely one of Organization, Project must be set.
Organization *string `json:"organization,omitempty"` Organization *string `json:"organization,omitempty"`
// Project: project ID of the snapshot
// Precisely one of Organization, Project must be set. // Precisely one of Organization, Project must be set.
Project *string `json:"project,omitempty"` Project *string `json:"project,omitempty"`
} }
@ -2742,7 +2749,7 @@ type ListVolumesRequest struct {
PerPage *uint32 `json:"-"` PerPage *uint32 `json:"-"`
// Page: a positive integer to choose the page to return // Page: a positive integer to choose the page to return
Page *int32 `json:"-"` Page *int32 `json:"-"`
// Organization: filter volume by organization // Organization: filter volume by organization ID
Organization *string `json:"-"` Organization *string `json:"-"`
// Project: filter volume by project ID // Project: filter volume by project ID
Project *string `json:"-"` Project *string `json:"-"`
@ -2813,27 +2820,27 @@ func (r *ListVolumesResponse) UnsafeAppend(res interface{}) (uint32, error) {
type CreateVolumeRequest struct { type CreateVolumeRequest struct {
Zone scw.Zone `json:"-"` Zone scw.Zone `json:"-"`
// Name: the volume name
Name string `json:"name,omitempty"` Name string `json:"name,omitempty"`
// Deprecated: Organization: the volume organization ID
// Precisely one of Organization, Project must be set. // Precisely one of Organization, Project must be set.
Organization *string `json:"organization,omitempty"` Organization *string `json:"organization,omitempty"`
// VolumeType: // Project: the volume project ID
// Precisely one of Organization, Project must be set.
Project *string `json:"project,omitempty"`
// VolumeType: the volume type
// //
// Default value: l_ssd // Default value: l_ssd
VolumeType VolumeVolumeType `json:"volume_type"` VolumeType VolumeVolumeType `json:"volume_type"`
// Size: the volume disk size
// Precisely one of BaseSnapshot, BaseVolume, Size must be set. // Precisely one of BaseSnapshot, BaseVolume, Size must be set.
Size *scw.Size `json:"size,omitempty"` Size *scw.Size `json:"size,omitempty"`
// BaseVolume: the ID of the volume on which this volume will be based
// Precisely one of BaseSnapshot, BaseVolume, Size must be set. // Precisely one of BaseSnapshot, BaseVolume, Size must be set.
BaseVolume *string `json:"base_volume,omitempty"` BaseVolume *string `json:"base_volume,omitempty"`
// BaseSnapshot: the ID of the snapshot on which this volume will be based
// Precisely one of BaseSnapshot, BaseVolume, Size must be set. // Precisely one of BaseSnapshot, BaseVolume, Size must be set.
BaseSnapshot *string `json:"base_snapshot,omitempty"` BaseSnapshot *string `json:"base_snapshot,omitempty"`
// Precisely one of Organization, Project must be set.
Project *string `json:"project,omitempty"`
} }
// CreateVolume: create a volume // CreateVolume: create a volume
@ -3090,13 +3097,13 @@ type CreateSecurityGroupRequest struct {
Name string `json:"name,omitempty"` Name string `json:"name,omitempty"`
// Description: description of the security group // Description: description of the security group
Description string `json:"description,omitempty"` Description string `json:"description,omitempty"`
// Organization: organization the security group belongs to // Deprecated: Organization: organization ID the security group belongs to
// Precisely one of Organization, Project must be set. // Precisely one of Organization, Project must be set.
Organization *string `json:"organization,omitempty"` Organization *string `json:"organization,omitempty"`
// Project: project ID the security group belong to // Project: project ID the security group belong to
// Precisely one of Organization, Project must be set. // Precisely one of Organization, Project must be set.
Project *string `json:"project,omitempty"` Project *string `json:"project,omitempty"`
// OrganizationDefault: whether this security group becomes the default security group for new instances // Deprecated: OrganizationDefault: whether this security group becomes the default security group for new instances
// //
// Default value: false // Default value: false
// Precisely one of OrganizationDefault, ProjectDefault must be set. // Precisely one of OrganizationDefault, ProjectDefault must be set.
@ -3245,38 +3252,38 @@ func (s *API) DeleteSecurityGroup(req *DeleteSecurityGroupRequest, opts ...scw.R
type setSecurityGroupRequest struct { type setSecurityGroupRequest struct {
Zone scw.Zone `json:"-"` Zone scw.Zone `json:"-"`
// ID: the ID of the security group (will be ignored)
ID string `json:"-"` ID string `json:"-"`
// Name: the name of the security group
Name string `json:"name"` Name string `json:"name"`
// CreationDate: the creation date of the security group (will be ignored)
CreationDate *time.Time `json:"creation_date"` CreationDate *time.Time `json:"creation_date"`
// ModificationDate: the modification date of the security group (will be ignored)
ModificationDate *time.Time `json:"modification_date"` ModificationDate *time.Time `json:"modification_date"`
// Description: the description of the security group
Description string `json:"description"` Description string `json:"description"`
// EnableDefaultSecurity: true to block SMTP on IPv4 and IPv6
EnableDefaultSecurity bool `json:"enable_default_security"` EnableDefaultSecurity bool `json:"enable_default_security"`
// InboundDefaultPolicy: // InboundDefaultPolicy: the default inbound policy
// //
// Default value: accept // Default value: accept
InboundDefaultPolicy SecurityGroupPolicy `json:"inbound_default_policy"` InboundDefaultPolicy SecurityGroupPolicy `json:"inbound_default_policy"`
// OutboundDefaultPolicy: the default outbound policy
Organization string `json:"organization"`
OrganizationDefault bool `json:"organization_default"`
// OutboundDefaultPolicy:
// //
// Default value: accept // Default value: accept
OutboundDefaultPolicy SecurityGroupPolicy `json:"outbound_default_policy"` OutboundDefaultPolicy SecurityGroupPolicy `json:"outbound_default_policy"`
// Organization: the security groups organization ID
Servers []*ServerSummary `json:"servers"` Organization string `json:"organization"`
// Project: the security group project ID
Stateful bool `json:"stateful"`
Project string `json:"project"` Project string `json:"project"`
// Deprecated: OrganizationDefault: please use project_default instead
OrganizationDefault bool `json:"organization_default"`
// ProjectDefault: true use this security group for future instances created in this project
ProjectDefault bool `json:"project_default"` ProjectDefault bool `json:"project_default"`
// Servers: the servers attached to this security group
Servers []*ServerSummary `json:"servers"`
// Stateful: true to set the security group as stateful
Stateful bool `json:"stateful"`
} }
// setSecurityGroup: update a security group // setSecurityGroup: update a security group
@ -3637,7 +3644,7 @@ type ListPlacementGroupsRequest struct {
PerPage *uint32 `json:"-"` PerPage *uint32 `json:"-"`
// Page: a positive integer to choose the page to return // Page: a positive integer to choose the page to return
Page *int32 `json:"-"` Page *int32 `json:"-"`
// Organization: list only placement groups of this organization // Organization: list only placement groups of this organization ID
Organization *string `json:"-"` Organization *string `json:"-"`
// Project: list only placement groups of this project ID // Project: list only placement groups of this project ID
Project *string `json:"-"` Project *string `json:"-"`
@ -3711,17 +3718,17 @@ type CreatePlacementGroupRequest struct {
Zone scw.Zone `json:"-"` Zone scw.Zone `json:"-"`
// Name: name of the placement group // Name: name of the placement group
Name string `json:"name,omitempty"` Name string `json:"name,omitempty"`
// Deprecated: Organization: organization ID of the placement group
// Precisely one of Organization, Project must be set. // Precisely one of Organization, Project must be set.
Organization *string `json:"organization,omitempty"` Organization *string `json:"organization,omitempty"`
// Project: project ID of the placement group
// Precisely one of Organization, Project must be set. // Precisely one of Organization, Project must be set.
Project *string `json:"project,omitempty"` Project *string `json:"project,omitempty"`
// PolicyMode: // PolicyMode: the operating mode of the placement group
// //
// Default value: optional // Default value: optional
PolicyMode PlacementGroupPolicyMode `json:"policy_mode"` PolicyMode PlacementGroupPolicyMode `json:"policy_mode"`
// PolicyType: // PolicyType: the policy type of the placement group
// //
// Default value: max_availability // Default value: max_availability
PolicyType PlacementGroupPolicyType `json:"policy_type"` PolicyType PlacementGroupPolicyType `json:"policy_type"`
@ -4114,8 +4121,6 @@ func (s *API) UpdatePlacementGroupServers(req *UpdatePlacementGroupServersReques
type ListIPsRequest struct { type ListIPsRequest struct {
Zone scw.Zone `json:"-"` Zone scw.Zone `json:"-"`
// Project: the project ID the IPs are reserved in
Project *string `json:"-"`
// Organization: the organization ID the IPs are reserved in // Organization: the organization ID the IPs are reserved in
Organization *string `json:"-"` Organization *string `json:"-"`
// Name: filter on the IP address (Works as a LIKE operation on the IP address) // Name: filter on the IP address (Works as a LIKE operation on the IP address)
@ -4126,6 +4131,8 @@ type ListIPsRequest struct {
PerPage *uint32 `json:"-"` PerPage *uint32 `json:"-"`
// Page: a positive integer to choose the page to return // Page: a positive integer to choose the page to return
Page *int32 `json:"-"` Page *int32 `json:"-"`
// Project: the project ID the IPs are reserved in
Project *string `json:"-"`
} }
// ListIPs: list all flexible IPs // ListIPs: list all flexible IPs
@ -4143,11 +4150,11 @@ func (s *API) ListIPs(req *ListIPsRequest, opts ...scw.RequestOption) (*ListIPsR
} }
query := url.Values{} query := url.Values{}
parameter.AddToQuery(query, "project", req.Project)
parameter.AddToQuery(query, "organization", req.Organization) parameter.AddToQuery(query, "organization", req.Organization)
parameter.AddToQuery(query, "name", req.Name) parameter.AddToQuery(query, "name", req.Name)
parameter.AddToQuery(query, "per_page", req.PerPage) parameter.AddToQuery(query, "per_page", req.PerPage)
parameter.AddToQuery(query, "page", req.Page) parameter.AddToQuery(query, "page", req.Page)
parameter.AddToQuery(query, "project", req.Project)
if fmt.Sprint(req.Zone) == "" { if fmt.Sprint(req.Zone) == "" {
return nil, errors.New("field Zone cannot be empty in request") return nil, errors.New("field Zone cannot be empty in request")
@ -4190,7 +4197,7 @@ func (r *ListIPsResponse) UnsafeAppend(res interface{}) (uint32, error) {
type CreateIPRequest struct { type CreateIPRequest struct {
Zone scw.Zone `json:"-"` Zone scw.Zone `json:"-"`
// Organization: the organization ID the IP is reserved in // Deprecated: Organization: the organization ID the IP is reserved in
// Precisely one of Organization, Project must be set. // Precisely one of Organization, Project must be set.
Organization *string `json:"organization,omitempty"` Organization *string `json:"organization,omitempty"`
// Project: the project ID the IP is reserved in // Project: the project ID the IP is reserved in

View File

@ -5,10 +5,11 @@
Recommended config file: Recommended config file:
```yaml ```yaml
# get your credentials on https://console.scaleway.com/account/credentials # Get your credentials on https://console.scaleway.com/project/credentials
access_key: SCWXXXXXXXXXXXXXXXXX access_key: SCWXXXXXXXXXXXXXXXXX
secret_key: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx secret_key: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
default_organization_id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx default_organization_id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
default_project_id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
default_region: fr-par default_region: fr-par
default_zone: fr-par-1 default_zone: fr-par-1
``` ```
@ -20,7 +21,7 @@ The function [`GetConfigPath`](https://godoc.org/github.com/scaleway/scaleway-sd
1. Custom directory: `$SCW_CONFIG_PATH` 1. Custom directory: `$SCW_CONFIG_PATH`
2. [XDG base directory](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html): `$XDG_CONFIG_HOME/scw/config.yaml` 2. [XDG base directory](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html): `$XDG_CONFIG_HOME/scw/config.yaml`
3. Unix home directory: `$HOME/.config/scw/config.yaml` 3. Unix home directory: `$HOME/.config/scw/config.yaml`
3. Windows home directory: `%USERPROFILE%/.config/scw/config.yaml` 4. Windows home directory: `%USERPROFILE%/.config/scw/config.yaml`
## V1 config (DEPRECATED) ## V1 config (DEPRECATED)
@ -44,10 +45,11 @@ scw.NewClient(
## Environment variables ## Environment variables
| Variable | Description | Legacy variables | | Variable | Description | Legacy variables |
| :------------------------ | :-------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------ | | :----------------------------- | :----------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------ |
| `$SCW_ACCESS_KEY` | Access key of a token ([get yours](https://console.scaleway.com/account/credentials)) | `$SCALEWAY_ACCESS_KEY` (used by terraform) | | `$SCW_ACCESS_KEY` | Access key of a token ([get yours](https://console.scaleway.com/project/credentials)) | `$SCALEWAY_ACCESS_KEY` (used by terraform) |
| `$SCW_SECRET_KEY` | Secret key of a token ([get yours](https://console.scaleway.com/account/credentials)) | `$SCW_TOKEN` (used by cli), `$SCALEWAY_TOKEN` (used by terraform), `$SCALEWAY_ACCESS_KEY` (used by terraform) | | `$SCW_SECRET_KEY` | Secret key of a token ([get yours](https://console.scaleway.com/project/credentials)) | `$SCW_TOKEN` (used by cli), `$SCALEWAY_TOKEN` (used by terraform), `$SCALEWAY_ACCESS_KEY` (used by terraform) |
| `$SCW_DEFAULT_ORGANIZATION_ID` | Your default organization ID, if you don't have one use your organization ID ([get yours](https://console.scaleway.com/account/credentials)) | `$SCW_ORGANIZATION` (used by cli),`$SCALEWAY_ORGANIZATION` (used by terraform) | | `$SCW_DEFAULT_ORGANIZATION_ID` | Your default organization ID ([get yours](https://console.scaleway.com/project/credentials)) | `$SCW_ORGANIZATION` (used by cli),`$SCALEWAY_ORGANIZATION` (used by terraform) |
| `$SCW_DEFAULT_PROJECT_ID` | Your default project ID ([get yours](https://console.scaleway.com/project/credentials)) | |
| `$SCW_DEFAULT_REGION` | Your default [region](https://developers.scaleway.com/en/quickstart/#region-and-zone) | `$SCW_REGION` (used by cli),`$SCALEWAY_REGION` (used by terraform) | | `$SCW_DEFAULT_REGION` | Your default [region](https://developers.scaleway.com/en/quickstart/#region-and-zone) | `$SCW_REGION` (used by cli),`$SCALEWAY_REGION` (used by terraform) |
| `$SCW_DEFAULT_ZONE` | Your default [availability zone](https://developers.scaleway.com/en/quickstart/#region-and-zone) | `$SCW_ZONE` (used by cli),`$SCALEWAY_ZONE` (used by terraform) | | `$SCW_DEFAULT_ZONE` | Your default [availability zone](https://developers.scaleway.com/en/quickstart/#region-and-zone) | `$SCW_ZONE` (used by cli),`$SCALEWAY_ZONE` (used by terraform) |
| `$SCW_API_URL` | Url of the API | - | | `$SCW_API_URL` | Url of the API | - |

View File

@ -30,7 +30,7 @@ const configFileTemplate = `# Scaleway configuration file
# - Scaleway Terraform Provider (https://www.terraform.io/docs/providers/scaleway/index.html) # - Scaleway Terraform Provider (https://www.terraform.io/docs/providers/scaleway/index.html)
# You need an access key and a secret key to connect to Scaleway API. # You need an access key and a secret key to connect to Scaleway API.
# Generate your token at the following address: https://console.scaleway.com/account/credentials # Generate your token at the following address: https://console.scaleway.com/project/credentials
# An access key is a secret key identifier. # An access key is a secret key identifier.
{{ if .AccessKey }}access_key: {{.AccessKey}}{{ else }}# access_key: SCW11111111111111111{{ end }} {{ if .AccessKey }}access_key: {{.AccessKey}}{{ else }}# access_key: SCW11111111111111111{{ end }}

View File

@ -23,6 +23,8 @@ const (
ZoneFrPar2 = Zone("fr-par-2") ZoneFrPar2 = Zone("fr-par-2")
// ZoneNlAms1 represents the nl-ams-1 zone // ZoneNlAms1 represents the nl-ams-1 zone
ZoneNlAms1 = Zone("nl-ams-1") ZoneNlAms1 = Zone("nl-ams-1")
// ZonePlWaw1 represents the pl-waw-1 zone
ZonePlWaw1 = Zone("pl-waw-1")
) )
var ( var (
@ -31,6 +33,7 @@ var (
ZoneFrPar1, ZoneFrPar1,
ZoneFrPar2, ZoneFrPar2,
ZoneNlAms1, ZoneNlAms1,
ZonePlWaw1,
} }
) )
@ -68,6 +71,8 @@ const (
RegionFrPar = Region("fr-par") RegionFrPar = Region("fr-par")
// RegionNlAms represents the nl-ams region // RegionNlAms represents the nl-ams region
RegionNlAms = Region("nl-ams") RegionNlAms = Region("nl-ams")
// RegionPlWaw represents the pl-waw region
RegionPlWaw = Region("pl-waw")
) )
var ( var (
@ -75,6 +80,7 @@ var (
AllRegions = []Region{ AllRegions = []Region{
RegionFrPar, RegionFrPar,
RegionNlAms, RegionNlAms,
RegionPlWaw,
} }
) )
@ -95,6 +101,8 @@ func (region Region) GetZones() []Zone {
return []Zone{ZoneFrPar1, ZoneFrPar2} return []Zone{ZoneFrPar1, ZoneFrPar2}
case RegionNlAms: case RegionNlAms:
return []Zone{ZoneNlAms1} return []Zone{ZoneNlAms1}
case RegionPlWaw:
return []Zone{ZonePlWaw1}
default: default:
return []Zone{} return []Zone{}
} }

View File

@ -6,6 +6,6 @@ import (
) )
// TODO: versioning process // TODO: versioning process
const version = "v1.0.0-beta.6+dev" const version = "v1.0.0-beta.7"
var userAgent = fmt.Sprintf("scaleway-sdk-go/%s (%s; %s; %s)", version, runtime.Version(), runtime.GOOS, runtime.GOARCH) var userAgent = fmt.Sprintf("scaleway-sdk-go/%s (%s; %s; %s)", version, runtime.Version(), runtime.GOOS, runtime.GOARCH)

2
vendor/modules.txt vendored
View File

@ -496,7 +496,7 @@ github.com/profitbricks/profitbricks-sdk-go
github.com/ryanuber/go-glob github.com/ryanuber/go-glob
# github.com/satori/go.uuid v1.2.0 # github.com/satori/go.uuid v1.2.0
github.com/satori/go.uuid github.com/satori/go.uuid
# github.com/scaleway/scaleway-sdk-go v1.0.0-beta.6.0.20200903143645-c0ce17a0443d # github.com/scaleway/scaleway-sdk-go v1.0.0-beta.7
github.com/scaleway/scaleway-sdk-go/api/instance/v1 github.com/scaleway/scaleway-sdk-go/api/instance/v1
github.com/scaleway/scaleway-sdk-go/api/marketplace/v1 github.com/scaleway/scaleway-sdk-go/api/marketplace/v1
github.com/scaleway/scaleway-sdk-go/internal/async github.com/scaleway/scaleway-sdk-go/internal/async

View File

@ -16,6 +16,7 @@
that will be used to launch a new server and provision it. See that will be used to launch a new server and provision it. See
the images list the images list
get the complete list of the accepted image UUID. get the complete list of the accepted image UUID.
The marketplace image label (eg `ubuntu_focal`) also works.
- `commercial_type` (string) - The name of the server commercial type: - `commercial_type` (string) - The name of the server commercial type:
C1, C2L, C2M, C2S, DEV1-S, DEV1-M, DEV1-L, DEV1-XL, C1, C2L, C2M, C2S, DEV1-S, DEV1-M, DEV1-L, DEV1-XL,