Skip to content

Commit 6335756

Browse files
committed
Add --qemu-userdata cloud-config
Signed-off-by: Sven Dowideit <[email protected]>
1 parent 85cee23 commit 6335756

File tree

1 file changed

+51
-1
lines changed

1 file changed

+51
-1
lines changed

qemu.go

+51-1
Original file line numberDiff line numberDiff line change
@@ -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

5355
func (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+
499549
func (d *Driver) RunQMPCommand(command string) (map[string]interface{}, error) {
500550

501551
// connect to monitor

0 commit comments

Comments
 (0)