@@ -47,7 +47,9 @@ type Driver struct {
4747 connectionString string
4848 // conn *libvirt.Connect
4949 // VM *libvirt.Domain
50- vmLoaded bool
50+ vmLoaded bool
51+ UserDataFile string
52+ CloudConfigRoot string
5153}
5254
5355func (d * Driver ) GetCreateFlags () []mcnflag.Flag {
@@ -95,6 +97,10 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag {
9597 Usage : "SSH username" ,
9698 Value : defaultSSHUser ,
9799 },
100+ mcnflag.StringFlag {
101+ Name : "qemu-userdata" ,
102+ Usage : "cloud-config userdata file" ,
103+ },
98104 /* Not yet implemented
99105 mcnflag.Flag{
100106 Name: "qemu-no-share",
@@ -152,6 +158,7 @@ func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error {
152158 d .SwarmHost = flags .String ("swarm-host" )
153159 d .SwarmDiscovery = flags .String ("swarm-discovery" )
154160 d .SSHUser = flags .String ("qemu-ssh-user" )
161+ d .UserDataFile = flags .String ("qemu-userdata" )
155162 d .SSHPort = 22
156163 d .DiskPath = d .ResolveStorePath (fmt .Sprintf ("%s.img" , d .MachineName ))
157164 return nil
@@ -232,6 +239,13 @@ func (d *Driver) Create() error {
232239 return err
233240 }
234241
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+
235249 log .Infof ("Starting QEMU VM..." )
236250 if err := d .Start (); err != nil {
237251 return err
@@ -288,6 +302,13 @@ func (d *Driver) Start() error {
288302 startCmd = append (startCmd , "-enable-kvm" )
289303 }
290304
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+
291312 // last argument is always the name of the disk image
292313 startCmd = append (startCmd , d .diskPath ())
293314
@@ -496,6 +517,35 @@ func (d *Driver) generateDiskImage(size int) error {
496517 return nil
497518}
498519
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+
499549func (d * Driver ) RunQMPCommand (command string ) (map [string ]interface {}, error ) {
500550
501551 // connect to monitor
0 commit comments