@@ -26,16 +26,26 @@ import (
2626type TemplateVmConfig struct {
2727 StatePath string `json:"statepath"`
2828 Driver string `json:"driver"`
29- Cpu int `json:"cpu"`
30- Memory int `json:"memory"`
31- Kernel string `json:"kernel"`
32- Initrd string `json:"initrd"`
29+ Config hypervisor.BootConfig
3330}
3431
35- func CreateTemplateVM (statePath , vmName string , cpu , mem int , kernel , initrd string , vsock bool ) (t * TemplateVmConfig , err error ) {
32+ func CreateTemplateVM (statePath , vmName string , b hypervisor.BootConfig ) (t * TemplateVmConfig , err error ) {
33+ if b .BootToBeTemplate || b .BootFromTemplate || b .MemoryPath != "" || b .DevicesStatePath != "" {
34+ return nil , fmt .Errorf ("Error boot config for template" )
35+ }
36+ b .MemoryPath = statePath + "/memory"
37+ b .DevicesStatePath = statePath + "/state"
38+
39+ config := & TemplateVmConfig {
40+ StatePath : statePath ,
41+ Driver : hypervisor .HDriver .Name (),
42+ Config : b ,
43+ }
44+ config .Config .BootFromTemplate = true
45+
3646 defer func () {
3747 if err != nil {
38- ( & TemplateVmConfig { StatePath : statePath }) .Destroy ()
48+ config .Destroy ()
3949 }
4050 }()
4151
@@ -45,7 +55,7 @@ func CreateTemplateVM(statePath, vmName string, cpu, mem int, kernel, initrd str
4555 return nil , err
4656 }
4757 flags := uintptr (syscall .MS_NOSUID | syscall .MS_NODEV )
48- opts := fmt .Sprintf ("size=%dM" , mem + 8 )
58+ opts := fmt .Sprintf ("size=%dM" , b . Memory + 8 )
4959 if err = syscall .Mount ("tmpfs" , statePath , "tmpfs" , flags , opts ); err != nil {
5060 glog .Infof ("mount template state path failed: %v" , err )
5161 return nil , err
@@ -58,18 +68,8 @@ func CreateTemplateVM(statePath, vmName string, cpu, mem int, kernel, initrd str
5868 }
5969
6070 // launch vm
61- b := & hypervisor.BootConfig {
62- CPU : cpu ,
63- Memory : mem ,
64- BootToBeTemplate : true ,
65- BootFromTemplate : false ,
66- EnableVsock : vsock ,
67- MemoryPath : statePath + "/memory" ,
68- DevicesStatePath : statePath + "/state" ,
69- Kernel : kernel ,
70- Initrd : initrd ,
71- }
72- vm , err := hypervisor .GetVm (vmName , b , true )
71+ b .BootToBeTemplate = true
72+ vm , err := hypervisor .GetVm (vmName , & b , true )
7373 if err != nil {
7474 return nil , err
7575 }
@@ -89,15 +89,6 @@ func CreateTemplateVM(statePath, vmName string, cpu, mem int, kernel, initrd str
8989 // so we wait here. We should fix it in the qemu driver side.
9090 time .Sleep (1 * time .Second )
9191
92- config := & TemplateVmConfig {
93- StatePath : statePath ,
94- Driver : hypervisor .HDriver .Name (),
95- Cpu : cpu ,
96- Memory : mem ,
97- Kernel : kernel ,
98- Initrd : initrd ,
99- }
100-
10192 configData , err := json .MarshalIndent (config , "" , "\t " )
10293 if err != nil {
10394 glog .V (1 ).Infof ("%s\n " , err .Error ())
@@ -114,16 +105,8 @@ func CreateTemplateVM(statePath, vmName string, cpu, mem int, kernel, initrd str
114105}
115106
116107func (t * TemplateVmConfig ) BootConfigFromTemplate () * hypervisor.BootConfig {
117- return & hypervisor.BootConfig {
118- CPU : t .Cpu ,
119- Memory : t .Memory ,
120- BootToBeTemplate : false ,
121- BootFromTemplate : true ,
122- MemoryPath : t .StatePath + "/memory" ,
123- DevicesStatePath : t .StatePath + "/state" ,
124- Kernel : t .Kernel ,
125- Initrd : t .Initrd ,
126- }
108+ b := t .Config
109+ return & b
127110}
128111
129112// boot vm from template, the returned vm is paused
0 commit comments