@@ -46,39 +46,48 @@ func (qc *Cluster) NewMachine(userdata *conf.UserData) (platform.Machine, error)
4646 return qc .NewMachineWithOptions (userdata , platform.MachineOptions {})
4747}
4848
49- func (qc * Cluster ) NewMachineWithOptions (userdata * conf.UserData , options platform.MachineOptions ) (platform.Machine , error ) {
50- if options .InstanceType != "" {
51- return nil , errors .New ("platform qemu does not support changing instance types" )
49+ // ensureBuilderDefaults applies flight-level QEMU settings to a builder.
50+ func (qc * Cluster ) ensureBuilderDefaults (builder * platform.QemuBuilder ) (* platform.QemuBuilder , error ) {
51+ if builder == nil {
52+ builder = platform .NewQemuBuilder ()
5253 }
53- id := uuid .New ()
54-
55- dir := filepath .Join (qc .RuntimeConf ().OutputDir , id )
56- if err := os .Mkdir (dir , 0777 ); err != nil {
57- return nil , err
54+ if qc .flight .opts .Arch != "" {
55+ if err := builder .SetArchitecture (qc .flight .opts .Arch ); err != nil {
56+ return nil , err
57+ }
58+ }
59+ if qc .flight .opts .Firmware != "" {
60+ builder .Firmware = qc .flight .opts .Firmware
5861 }
62+ builder .Swtpm = qc .flight .opts .Swtpm
63+ return builder , nil
64+ }
5965
66+ // createMachine prepares a machine and configures Ignition or SMBIOS SSH credentials
67+ // on the builder. When --no-ignition is set, userdata may be nil.
68+ func (qc * Cluster ) createMachine (builder * platform.QemuBuilder , userdata * conf.UserData , options platform.MachineOptions , dir , id string ) (* machine , * conf.Conf , error ) {
6069 rconf := qc .RuntimeConf ()
6170 noIgnition := rconf .NoIgnition
6271
6372 var config * conf.Conf
6473 if noIgnition {
6574 if qc .flight .opts .SecureExecution {
66- return nil , errors .New ("secure execution requires Ignition; not supported with --no-ignition" )
75+ return nil , nil , errors .New ("secure execution requires Ignition; not supported with --no-ignition" )
6776 }
6877 if len (append (qc .flight .opts .BindRO , options .BindMountHostRO ... )) > 0 {
69- return nil , errors .New ("bind mounts require Ignition; not supported with --no-ignition" )
78+ return nil , nil , errors .New ("bind mounts require Ignition; not supported with --no-ignition" )
7079 }
7180 } else {
7281 var err error
7382 config , err = qc .RenderUserDataIfNeeded (userdata )
7483 if err != nil {
75- return nil , err
84+ return nil , nil , err
7685 }
7786 }
7887
7988 journal , err := platform .NewJournal (dir )
8089 if err != nil {
81- return nil , err
90+ return nil , nil , err
8291 }
8392
8493 qm := & machine {
@@ -88,14 +97,9 @@ func (qc *Cluster) NewMachineWithOptions(userdata *conf.UserData, options platfo
8897 consolePath : filepath .Join (dir , "console.txt" ),
8998 }
9099
91- builder := platform .NewQemuBuilder ()
92- if options .DisablePDeathSig {
93- builder .Pdeathsig = false
94- }
95-
96100 if qc .flight .opts .SecureExecution {
97101 if err := builder .SetSecureExecution (qc .flight .opts .SecureExecutionIgnitionPubKey , qc .flight .opts .SecureExecutionHostKey , config ); err != nil {
98- return nil , err
102+ return nil , nil , err
99103 }
100104 }
101105
@@ -110,53 +114,77 @@ func (qc *Cluster) NewMachineWithOptions(userdata *conf.UserData, options platfo
110114 for _ , mountpair := range append (qc .flight .opts .BindRO , options .BindMountHostRO ... ) {
111115 src , dest , err := platform .ParseBindOpt (mountpair )
112116 if err != nil {
113- return nil , err
117+ return nil , nil , err
114118 }
115119 readonly := true
116120 builder .MountHost (src , dest , readonly )
117- config .MountHost (dest , readonly )
121+ if config != nil {
122+ config .MountHost (dest , readonly )
123+ }
118124 }
119125
120126 if noIgnition {
121127 keys , err := qc .Keys ()
122128 if err != nil {
123- return nil , err
129+ return nil , nil , err
124130 }
125131 smbios , err := platform .SystemdSMBIOSSSHCredential (rconf .SSHUser , keys )
126132 if err != nil {
127- return nil , err
133+ return nil , nil , err
128134 }
129135 builder .Smbios = append (builder .Smbios , smbios )
130136 } else {
131137 builder .SetConfig (config )
132138 }
133- defer builder .Close ()
134- builder .UUID = qm .id
135- if qc .flight .opts .Arch != "" {
136- if err := builder .SetArchitecture (qc .flight .opts .Arch ); err != nil {
137- return nil , err
138- }
139+
140+ return qm , config , nil
141+ }
142+
143+ func (qc * Cluster ) NewMachineWithOptions (userdata * conf.UserData , options platform.MachineOptions ) (platform.Machine , error ) {
144+ if options .InstanceType != "" {
145+ return nil , errors .New ("platform qemu does not support changing instance types" )
139146 }
140- if qc .flight .opts .Firmware != "" {
141- builder .Firmware = qc .flight .opts .Firmware
147+ id := uuid .New ()
148+
149+ dir := filepath .Join (qc .RuntimeConf ().OutputDir , id )
150+ if err := os .Mkdir (dir , 0777 ); err != nil {
151+ return nil , err
142152 }
143- builder .Swtpm = qc .flight .opts .Swtpm
144- builder .Hostname = fmt .Sprintf ("qemu%d" , qc .BaseCluster .AllocateMachineSerial ())
145- builder .ConsoleFile = qm .consolePath
153+
154+ qemuBuilder := platform .NewQemuBuilder ()
155+ if options .DisablePDeathSig {
156+ qemuBuilder .Pdeathsig = false
157+ }
158+
159+ var err error
160+ qemuBuilder , err = qc .ensureBuilderDefaults (qemuBuilder )
161+ if err != nil {
162+ return nil , err
163+ }
164+
165+ qm , _ , err := qc .createMachine (qemuBuilder , userdata , options , dir , id )
166+ if err != nil {
167+ return nil , err
168+ }
169+
170+ defer qemuBuilder .Close ()
171+ qemuBuilder .UUID = qm .id
172+ qemuBuilder .ConsoleFile = qm .consolePath
173+ qemuBuilder .NumaNodes = options .NumaNodes
174+ qemuBuilder .Hostname = fmt .Sprintf ("qemu%d" , qc .BaseCluster .AllocateMachineSerial ())
146175
147176 if qc .flight .opts .Memory != "" {
148177 memory , err := strconv .ParseInt (qc .flight .opts .Memory , 10 , 32 )
149178 if err != nil {
150179 return nil , errors .Wrapf (err , "parsing memory option" )
151180 }
152- builder .MemoryMiB = int (memory )
181+ qemuBuilder .MemoryMiB = int (memory )
153182 } else if options .MinMemory != 0 {
154- builder .MemoryMiB = options .MinMemory
183+ qemuBuilder .MemoryMiB = options .MinMemory
155184 } else if qc .flight .opts .SecureExecution {
156- builder .MemoryMiB = 4096 // SE needs at least 4GB
185+ qemuBuilder .MemoryMiB = 4096 // SE needs at least 4GB
157186 }
158187
159- builder .NumaNodes = options .NumaNodes
160188 var primaryDisk platform.Disk
161189 if options .PrimaryDisk != "" {
162190 var diskp * platform.Disk
@@ -167,7 +195,7 @@ func (qc *Cluster) NewMachineWithOptions(userdata *conf.UserData, options platfo
167195 }
168196
169197 if qc .flight .opts .Cex || options .Cex {
170- if err := builder .AddCexDevice (); err != nil {
198+ if err := qemuBuilder .AddCexDevice (); err != nil {
171199 return nil , err
172200 }
173201 }
@@ -194,38 +222,38 @@ func (qc *Cluster) NewMachineWithOptions(userdata *conf.UserData, options platfo
194222 primaryDisk .BackingFile = options .OverrideBackingFile
195223 }
196224
197- if err = builder .AddBootDisk (& primaryDisk ); err != nil {
225+ if err = qemuBuilder .AddBootDisk (& primaryDisk ); err != nil {
198226 return nil , err
199227 }
200- if err = builder .AddDisksFromSpecs (options .AdditionalDisks ); err != nil {
228+ if err = qemuBuilder .AddDisksFromSpecs (options .AdditionalDisks ); err != nil {
201229 return nil , err
202230 }
203231
204232 if len (options .HostForwardPorts ) > 0 {
205- builder .EnableUsermodeNetworking (options .HostForwardPorts , "" )
233+ qemuBuilder .EnableUsermodeNetworking (options .HostForwardPorts , "" )
206234 } else {
207235 h := []platform.HostForwardPort {
208236 {Service : "ssh" , HostPort : 0 , GuestPort : 22 },
209237 }
210- builder .EnableUsermodeNetworking (h , "" )
238+ qemuBuilder .EnableUsermodeNetworking (h , "" )
211239 }
212240 if options .AdditionalNics > 0 {
213- builder .AddAdditionalNics (options .AdditionalNics )
241+ qemuBuilder .AddAdditionalNics (options .AdditionalNics )
214242 }
215243 if options .AppendKernelArgs != "" {
216- builder .AppendKernelArgs = options .AppendKernelArgs
244+ qemuBuilder .AppendKernelArgs = options .AppendKernelArgs
217245 }
218246 if options .AppendFirstbootKernelArgs != "" {
219- builder .AppendFirstbootKernelArgs = options .AppendFirstbootKernelArgs
247+ qemuBuilder .AppendFirstbootKernelArgs = options .AppendFirstbootKernelArgs
220248 }
221249 if ! qc .RuntimeConf ().InternetAccess {
222- builder .RestrictNetworking = true
250+ qemuBuilder .RestrictNetworking = true
223251 }
224252 if options .Firmware != "" {
225- builder .Firmware = options .Firmware
253+ qemuBuilder .Firmware = options .Firmware
226254 }
227255
228- inst , err := builder .Exec ()
256+ inst , err := qemuBuilder .Exec ()
229257 if err != nil {
230258 return nil , err
231259 }
0 commit comments