@@ -47,7 +47,9 @@ type Driver struct {
47
47
connectionString string
48
48
// conn *libvirt.Connect
49
49
// VM *libvirt.Domain
50
- vmLoaded bool
50
+ vmLoaded bool
51
+ UserDataFile string
52
+ CloudConfigRoot string
51
53
}
52
54
53
55
func (d * Driver ) GetCreateFlags () []mcnflag.Flag {
@@ -95,6 +97,10 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag {
95
97
Usage : "SSH username" ,
96
98
Value : defaultSSHUser ,
97
99
},
100
+ mcnflag.StringFlag {
101
+ Name : "qemu-userdata" ,
102
+ Usage : "cloud-config userdata file" ,
103
+ },
98
104
/* Not yet implemented
99
105
mcnflag.Flag{
100
106
Name: "qemu-no-share",
@@ -152,6 +158,7 @@ func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error {
152
158
d .SwarmHost = flags .String ("swarm-host" )
153
159
d .SwarmDiscovery = flags .String ("swarm-discovery" )
154
160
d .SSHUser = flags .String ("qemu-ssh-user" )
161
+ d .UserDataFile = flags .String ("qemu-userdata" )
155
162
d .SSHPort = 22
156
163
d .DiskPath = d .ResolveStorePath (fmt .Sprintf ("%s.img" , d .MachineName ))
157
164
return nil
@@ -232,6 +239,13 @@ func (d *Driver) Create() error {
232
239
return err
233
240
}
234
241
242
+ if d .UserDataFile != "" {
243
+ log .Infof ("Creating Userdata Disk..." )
244
+ if d .CloudConfigRoot , err = d .generateUserdataDisk (d .UserDataFile ); err != nil {
245
+ return err
246
+ }
247
+ }
248
+
235
249
log .Infof ("Starting QEMU VM..." )
236
250
if err := d .Start (); err != nil {
237
251
return err
@@ -288,6 +302,13 @@ func (d *Driver) Start() error {
288
302
startCmd = append (startCmd , "-enable-kvm" )
289
303
}
290
304
305
+ if d .CloudConfigRoot != "" {
306
+ startCmd = append (startCmd ,
307
+ "-fsdev" ,
308
+ fmt .Sprintf ("local,security_model=passthrough,readonly,id=fsdev0,path=%s" , d .CloudConfigRoot ))
309
+ startCmd = append (startCmd , "-device" , "virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=config-2" )
310
+ }
311
+
291
312
// last argument is always the name of the disk image
292
313
startCmd = append (startCmd , d .diskPath ())
293
314
@@ -496,6 +517,35 @@ func (d *Driver) generateDiskImage(size int) error {
496
517
return nil
497
518
}
498
519
520
+ func (d * Driver ) generateUserdataDisk (userdataFile string ) (string , error ) {
521
+ // Start with virtio, add ISO & FAT format later
522
+ // Start with local file, add wget/fetct URL? (or if URL, use datasource..)
523
+ log .Infof ("1" )
524
+ userdata , err := ioutil .ReadFile (userdataFile )
525
+ if err != nil {
526
+ return "" , err
527
+ }
528
+
529
+ log .Infof ("2" )
530
+ machineDir := filepath .Join (d .StorePath , "machines" , d .GetMachineName ())
531
+ ccRoot := filepath .Join (machineDir , "cloud-config" )
532
+ os .MkdirAll (ccRoot , 0755 )
533
+
534
+ log .Infof ("3" )
535
+ userDataDir := filepath .Join (ccRoot , "openstack/latest" )
536
+ os .MkdirAll (userDataDir , 0755 )
537
+
538
+ log .Infof ("4" )
539
+ writeFile := filepath .Join (userDataDir , "user_data" )
540
+ if err := ioutil .WriteFile (writeFile , userdata , 0644 ); err != nil {
541
+ return "" , err
542
+ }
543
+ log .Infof ("5" )
544
+
545
+ return ccRoot , nil
546
+
547
+ }
548
+
499
549
func (d * Driver ) RunQMPCommand (command string ) (map [string ]interface {}, error ) {
500
550
501
551
// connect to monitor
0 commit comments