@@ -15,6 +15,7 @@ import (
1515 "github.com/docker/machine/libmachine/mcnflag"
1616 "github.com/docker/machine/libmachine/ssh"
1717 "github.com/docker/machine/libmachine/state"
18+ "github.com/moul/anonuuid"
1819 "github.com/scaleway/scaleway-cli/pkg/api"
1920 "github.com/scaleway/scaleway-cli/pkg/config"
2021)
@@ -38,6 +39,7 @@ type Driver struct {
3839 CommercialType string
3940 name string
4041 image string
42+ ip string
4143 stopping bool
4244 created bool
4345 // size string
@@ -85,6 +87,7 @@ func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) (err error) {
8587 d .CommercialType = flags .String ("scaleway-commercial-type" )
8688 d .name = flags .String ("scaleway-name" )
8789 d .image = flags .String ("scaleway-image" )
90+ d .ip = flags .String ("scaleway-ip" )
8891 return
8992}
9093
@@ -125,6 +128,12 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag {
125128 Usage : "Specifies the image" ,
126129 Value : defaultImage ,
127130 },
131+ mcnflag.StringFlag {
132+ EnvVar : "SCALEWAY_IP" ,
133+ Name : "scaleway-ip" ,
134+ Usage : "Specifies the IP address" ,
135+ Value : "" ,
136+ },
128137 mcnflag.BoolFlag {
129138 EnvVar : "SCALEWAY_DEBUG" ,
130139 Name : "scaleway-debug" ,
@@ -147,7 +156,6 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag {
147156func (d * Driver ) Create () (err error ) {
148157 var publicKey []byte
149158 var cl * api.ScalewayAPI
150- var ip * api.ScalewayGetIP
151159
152160 log .Infof ("Creating SSH key..." )
153161 if err = ssh .GenerateSSHKey (d .GetSSHKeyPath ()); err != nil {
@@ -162,18 +170,54 @@ func (d *Driver) Create() (err error) {
162170 if err != nil {
163171 return
164172 }
165- ip , err = cl .NewIP ()
166- if err != nil {
167- return
173+ if d .ip != "" {
174+ var ips * api.ScalewayGetIPS
175+
176+ ips , err = cl .GetIPS ()
177+ if err != nil {
178+ return
179+ }
180+ if anonuuid .IsUUID (d .ip ) == nil {
181+ d .IPID = d .ip
182+ for _ , ip := range ips .IPS {
183+ if ip .ID == d .ip {
184+ d .IPAddress = ip .Address
185+ break
186+ }
187+ }
188+ if d .IPAddress == "" {
189+ err = fmt .Errorf ("IP UUID %v not found" , d .IPID )
190+ return
191+ }
192+ } else {
193+ d .IPAddress = d .ip
194+ for _ , ip := range ips .IPS {
195+ if ip .Address == d .ip {
196+ d .IPID = ip .ID
197+ break
198+ }
199+ }
200+ if d .IPID == "" {
201+ err = fmt .Errorf ("IP address %v not found" , d .ip )
202+ return
203+ }
204+ }
205+ } else {
206+ var ip * api.ScalewayGetIP
207+
208+ ip , err = cl .NewIP ()
209+ if err != nil {
210+ return
211+ }
212+ d .IPAddress = ip .IP .Address
213+ d .IPID = ip .IP .ID
168214 }
169- d .IPAddress = ip .IP .Address
170- d .IPID = ip .IP .ID
171215 d .ServerID , err = api .CreateServer (cl , & api.ConfigCreateServer {
172216 ImageName : d .image ,
173217 CommercialType : d .CommercialType ,
174218 Name : d .name ,
175219 Bootscript : defaultBootscript ,
176- IP : ip . IP . ID ,
220+ IP : d . IPID ,
177221 Env : strings .Join ([]string {"AUTHORIZED_KEY" ,
178222 strings .Replace (string (publicKey [:len (publicKey )- 1 ]), " " , "_" , - 1 )}, "=" ),
179223 })
0 commit comments