Add --network switch to select a networking model (#22)
This commit is contained in:
parent
e588479701
commit
ba80fba648
39
appvm.go
39
appvm.go
@ -31,6 +31,15 @@ import (
|
|||||||
kingpin "gopkg.in/alecthomas/kingpin.v2"
|
kingpin "gopkg.in/alecthomas/kingpin.v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
type networkModel int
|
||||||
|
|
||||||
|
const (
|
||||||
|
networkOffline networkModel = iota
|
||||||
|
networkQemu networkModel = iota
|
||||||
|
networkLibvirt networkModel = iota
|
||||||
|
)
|
||||||
|
|
||||||
func list(l *libvirt.Libvirt) {
|
func list(l *libvirt.Libvirt) {
|
||||||
domains, err := l.Domains()
|
domains, err := l.Domains()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -173,14 +182,14 @@ func isRunning(l *libvirt.Libvirt, name string) bool {
|
|||||||
|
|
||||||
func generateAppVM(l *libvirt.Libvirt,
|
func generateAppVM(l *libvirt.Libvirt,
|
||||||
nixName, vmName, appvmPath, sharedDir string,
|
nixName, vmName, appvmPath, sharedDir string,
|
||||||
verbose, online, gui bool) (err error) {
|
verbose bool, network networkModel, gui bool) (err error) {
|
||||||
|
|
||||||
realpath, reginfo, qcow2, err := generateVM(appvmPath, nixName, verbose)
|
realpath, reginfo, qcow2, err := generateVM(appvmPath, nixName, verbose)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
xml := generateXML(vmName, online, gui, realpath, reginfo, qcow2, sharedDir)
|
xml := generateXML(vmName, network, gui, realpath, reginfo, qcow2, sharedDir)
|
||||||
_, err = l.DomainCreateXML(xml, libvirt.DomainStartValidate)
|
_, err = l.DomainCreateXML(xml, libvirt.DomainStartValidate)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -209,8 +218,8 @@ func isAppvmConfigurationExists(appvmPath, name string) bool {
|
|||||||
return fileExists(appvmPath + "/nix/" + name + ".nix")
|
return fileExists(appvmPath + "/nix/" + name + ".nix")
|
||||||
}
|
}
|
||||||
|
|
||||||
func start(l *libvirt.Libvirt, name string, verbose, online, gui, stateless bool,
|
func start(l *libvirt.Libvirt, name string, verbose bool, network networkModel,
|
||||||
args, open string) {
|
gui, stateless bool, args, open string) {
|
||||||
|
|
||||||
appvmPath := configDir
|
appvmPath := configDir
|
||||||
|
|
||||||
@ -267,7 +276,7 @@ func start(l *libvirt.Libvirt, name string, verbose, online, gui, stateless bool
|
|||||||
}
|
}
|
||||||
|
|
||||||
err := generateAppVM(l, name, vmName, appvmPath, sharedDir,
|
err := generateAppVM(l, name, vmName, appvmPath, sharedDir,
|
||||||
verbose, online, gui)
|
verbose, network, gui)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
@ -415,6 +424,22 @@ func cleanupStatelessVMs(l *libvirt.Libvirt) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func parseNetworkModel(flagOffline bool, flagNetworking string) networkModel {
|
||||||
|
if flagNetworking != "" && flagOffline {
|
||||||
|
log.Fatal("Can't use both --network and --offline switches")
|
||||||
|
}
|
||||||
|
if flagOffline || flagNetworking == "offline" {
|
||||||
|
return networkOffline
|
||||||
|
}
|
||||||
|
if flagNetworking == "libvirt" {
|
||||||
|
return networkLibvirt
|
||||||
|
}
|
||||||
|
if flagNetworking == "qemu" {
|
||||||
|
return networkQemu
|
||||||
|
}
|
||||||
|
return networkQemu // qemu is the default network model
|
||||||
|
}
|
||||||
|
|
||||||
var configDir = os.Getenv("HOME") + "/.config/appvm/"
|
var configDir = os.Getenv("HOME") + "/.config/appvm/"
|
||||||
var appvmHomesDir = os.Getenv("HOME") + "/appvm/"
|
var appvmHomesDir = os.Getenv("HOME") + "/appvm/"
|
||||||
|
|
||||||
@ -454,6 +479,7 @@ func main() {
|
|||||||
startOffline := startCommand.Flag("offline", "Disconnect").Bool()
|
startOffline := startCommand.Flag("offline", "Disconnect").Bool()
|
||||||
startCli := startCommand.Flag("cli", "Disable graphics mode, enable serial").Bool()
|
startCli := startCommand.Flag("cli", "Disable graphics mode, enable serial").Bool()
|
||||||
startStateless := startCommand.Flag("stateless", "Do not use default state directory").Bool()
|
startStateless := startCommand.Flag("stateless", "Do not use default state directory").Bool()
|
||||||
|
startNetwork := startCommand.Flag("network", "Used networking model").Enum("offline", "qemu", "libvirt")
|
||||||
|
|
||||||
stopName := kingpin.Command("stop", "Stop application").Arg("name", "Application name").Required().String()
|
stopName := kingpin.Command("stop", "Stop application").Arg("name", "Application name").Required().String()
|
||||||
dropName := kingpin.Command("drop", "Remove application data").Arg("name", "Application name").Required().String()
|
dropName := kingpin.Command("drop", "Remove application data").Arg("name", "Application name").Required().String()
|
||||||
@ -498,8 +524,9 @@ func main() {
|
|||||||
generate(*generateName, *generateBin, *generateVMName,
|
generate(*generateName, *generateBin, *generateVMName,
|
||||||
*generateBuildVM)
|
*generateBuildVM)
|
||||||
case "start":
|
case "start":
|
||||||
|
networkModel := parseNetworkModel(*startOffline, *startNetwork)
|
||||||
start(l, *startName,
|
start(l, *startName,
|
||||||
!*startQuiet, !*startOffline, !*startCli, *startStateless,
|
!*startQuiet, networkModel, !*startCli, *startStateless,
|
||||||
*startArgs, *startOpen)
|
*startArgs, *startOpen)
|
||||||
case "stop":
|
case "stop":
|
||||||
stop(l, *stopName)
|
stop(l, *stopName)
|
||||||
|
44
xml.go
44
xml.go
@ -5,7 +5,7 @@ import "fmt"
|
|||||||
// You may think that you want to rewrite to proper golang structures.
|
// You may think that you want to rewrite to proper golang structures.
|
||||||
// Believe me, you shouldn't.
|
// Believe me, you shouldn't.
|
||||||
|
|
||||||
func generateXML(vmName string, online, gui bool,
|
func generateXML(vmName string, network networkModel, gui bool,
|
||||||
vmNixPath, reginfo, img, sharedDir string) string {
|
vmNixPath, reginfo, img, sharedDir string) string {
|
||||||
|
|
||||||
devices := ""
|
devices := ""
|
||||||
@ -14,28 +14,40 @@ func generateXML(vmName string, online, gui bool,
|
|||||||
devices = guiDevices
|
devices = guiDevices
|
||||||
}
|
}
|
||||||
|
|
||||||
qemuParams := `
|
qemuParams := qemuParamsDefault
|
||||||
<qemu:commandline>
|
|
||||||
<qemu:arg value='-device'/>
|
|
||||||
<qemu:arg value='e1000,netdev=net0'/>
|
|
||||||
<qemu:arg value='-netdev'/>
|
|
||||||
<qemu:arg value='user,id=net0'/>
|
|
||||||
<qemu:arg value='-snapshot'/>
|
|
||||||
</qemu:commandline>
|
|
||||||
`
|
|
||||||
|
|
||||||
if !online {
|
if network == networkQemu {
|
||||||
qemuParams = `
|
qemuParams = qemuParamsWithNetwork
|
||||||
<qemu:commandline>
|
} else if network == networkLibvirt {
|
||||||
<qemu:arg value='-snapshot'/>
|
devices += netDevices
|
||||||
</qemu:commandline>
|
|
||||||
`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return fmt.Sprintf(xmlTmpl, vmName, vmNixPath, vmNixPath, vmNixPath,
|
return fmt.Sprintf(xmlTmpl, vmName, vmNixPath, vmNixPath, vmNixPath,
|
||||||
reginfo, img, sharedDir, sharedDir, sharedDir, devices, qemuParams)
|
reginfo, img, sharedDir, sharedDir, sharedDir, devices, qemuParams)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var qemuParamsDefault = `
|
||||||
|
<qemu:commandline>
|
||||||
|
<qemu:arg value='-snapshot'/>
|
||||||
|
</qemu:commandline>
|
||||||
|
`
|
||||||
|
|
||||||
|
var qemuParamsWithNetwork = `
|
||||||
|
<qemu:commandline>
|
||||||
|
<qemu:arg value='-device'/>
|
||||||
|
<qemu:arg value='e1000,netdev=net0'/>
|
||||||
|
<qemu:arg value='-netdev'/>
|
||||||
|
<qemu:arg value='user,id=net0'/>
|
||||||
|
<qemu:arg value='-snapshot'/>
|
||||||
|
</qemu:commandline>
|
||||||
|
`
|
||||||
|
|
||||||
|
var netDevices = `
|
||||||
|
<interface type='network'>
|
||||||
|
<source network='default'/>
|
||||||
|
</interface>
|
||||||
|
`
|
||||||
|
|
||||||
var guiDevices = `
|
var guiDevices = `
|
||||||
<!-- Graphical console -->
|
<!-- Graphical console -->
|
||||||
<graphics type='spice' autoport='yes'>
|
<graphics type='spice' autoport='yes'>
|
||||||
|
Loading…
Reference in New Issue
Block a user