@@ -159,14 +159,20 @@ def action_edit(guest, options, parserclass):
159
159
return cli .parse_option_strings (options , guest , inst , editing = True )
160
160
161
161
162
- def action_add_device (guest , options , parserclass ):
162
+ def action_add_device (guest , options , parserclass , devs ):
163
163
if not parserclass .prop_is_list (guest ):
164
164
fail (_ ("Cannot use --add-device with --%s" ) % parserclass .cli_arg_name )
165
165
set_os_variant (options , guest )
166
- devs = cli .parse_option_strings (options , guest , None )
167
- devs = xmlutil .listify (devs )
168
- for dev in devs :
169
- dev .set_defaults (guest )
166
+
167
+ if devs :
168
+ for dev in devs :
169
+ guest .add_device (dev )
170
+ else :
171
+ devs = cli .parse_option_strings (options , guest , None )
172
+ devs = xmlutil .listify (devs )
173
+ for dev in devs :
174
+ dev .set_defaults (guest )
175
+
170
176
return devs
171
177
172
178
@@ -305,8 +311,15 @@ def update_changes(domain, devs, action, confirm):
305
311
print_stdout ("" )
306
312
307
313
308
- def prepare_changes (xmlobj , options , parserclass ):
309
- origxml = xmlobj .get_xml ()
314
+ def prepare_changes (orig_xmlobj , options , parserclass , devs = None ):
315
+ """
316
+ Parse the command line device/XML arguments, and apply the changes to
317
+ a copy of the passed in xmlobj.
318
+
319
+ :returns: (list of device objects, action string, altered xmlobj)
320
+ """
321
+ origxml = orig_xmlobj .get_xml ()
322
+ xmlobj = orig_xmlobj .__class__ (conn = orig_xmlobj .conn , parsexml = origxml )
310
323
has_edit = options .edit != - 1
311
324
is_xmlcli = parserclass is cli .ParserXML
312
325
@@ -322,7 +335,7 @@ def prepare_changes(xmlobj, options, parserclass):
322
335
action = "update"
323
336
324
337
elif options .add_device :
325
- devs = action_add_device (xmlobj , options , parserclass )
338
+ devs = action_add_device (xmlobj , options , parserclass , devs )
326
339
action = "hotplug"
327
340
328
341
elif options .remove_device :
@@ -342,7 +355,7 @@ def prepare_changes(xmlobj, options, parserclass):
342
355
elif options .print_xml :
343
356
print_stdout (newxml )
344
357
345
- return devs , action
358
+ return devs , action , xmlobj
346
359
347
360
348
361
#######################
@@ -498,13 +511,14 @@ def main(conn=None):
498
511
print_stdout (dev .get_xml ())
499
512
return 0
500
513
514
+ devs = None
501
515
performed_update = False
502
516
if options .update :
503
517
if options .update and options .start :
504
518
fail_conflicting ("--update" , "--start" )
505
-
506
519
if vm_is_running :
507
- devs , action = prepare_changes (active_xmlobj , options , parserclass )
520
+ devs , action , dummy = prepare_changes (
521
+ active_xmlobj , options , parserclass )
508
522
update_changes (domain , devs , action , options .confirm )
509
523
performed_update = True
510
524
else :
@@ -515,14 +529,15 @@ def main(conn=None):
515
529
return 0
516
530
517
531
original_xml = inactive_xmlobj .get_xml ()
518
- devs , action = prepare_changes (inactive_xmlobj , options , parserclass )
532
+ devs , action , xmlobj_to_define = prepare_changes (
533
+ inactive_xmlobj , options , parserclass , devs = devs )
519
534
if not options .define :
520
535
if options .start :
521
- start_domain_transient (conn , inactive_xmlobj , devs ,
536
+ start_domain_transient (conn , xmlobj_to_define , devs ,
522
537
action , options .confirm )
523
538
return 0
524
539
525
- dom = define_changes (conn , inactive_xmlobj ,
540
+ dom = define_changes (conn , xmlobj_to_define ,
526
541
devs , action , options .confirm )
527
542
if not dom :
528
543
# --confirm user said 'no'
0 commit comments