@@ -50,6 +50,47 @@ def get_libvirt_params(**kwargs):
5050 return libvirt_auth , template_params
5151
5252
53+ def handle_device_type (d_type , device ):
54+ handled_device = {}
55+ serial_values = ['source_path' , 'target_port' ]
56+ usb_values = ['vendor_id' , 'product_id' ]
57+ pci_values = ['bus' , 'slot' , 'function' ]
58+ tpm_values = ['path' ]
59+ valid_values = None
60+ if d_type == 'serial' :
61+ valid_values = serial_values
62+ elif d_type == 'usb' :
63+ valid_values = usb_values
64+ elif d_type == 'pci' :
65+ valid_values = pci_values
66+ elif d_type == 'tpm' :
67+ valid_values = tpm_values
68+ if valid_values :
69+ for k in device :
70+ if k in valid_values :
71+ handled_device [k ] = device .get (k )
72+ return handled_device
73+
74+
75+ def handle_devices (devices ):
76+ serial_devices = []
77+ usb_devices = []
78+ pci_devices = []
79+ tpm_devices = []
80+ for device in devices :
81+ to_append = handle_device_type (device .get ('type' ), device )
82+ if to_append :
83+ if device .get ('type' ) == 'serial' :
84+ serial_devices .append (to_append )
85+ elif device .get ('type' ) == 'usb' :
86+ usb_devices .append (to_append )
87+ elif device .get ('type' ) == 'pci' :
88+ pci_devices .append (to_append )
89+ elif device .get ('type' ) == 'tpm' :
90+ tpm_devices .append (to_append )
91+ return serial_devices , usb_devices , pci_devices , tpm_devices
92+
93+
5394def gen_xml_template (kwargs , template_params , default_template ):
5495 # templates
5596 template_resource = kwargs .get ('template_resource' )
@@ -70,6 +111,21 @@ def gen_xml_template(kwargs, template_params, default_template):
70111 params = {"ctx" : ctx }
71112 if template_params :
72113 params .update (template_params )
114+ # let's handle devices properly
115+ passthrough_devices = params .pop ('devices' , None )
116+ if passthrough_devices :
117+ serial_devices , usb_devices , pci_devices , tpm_devices = \
118+ handle_devices (passthrough_devices )
119+ if serial_devices :
120+ params .update ({'serial_devices' : serial_devices })
121+ if usb_devices :
122+ params .update ({'usb_devices' : usb_devices })
123+ if pci_devices :
124+ params .update ({'pci_devices' : pci_devices })
125+ if tpm_devices :
126+ params .update ({'tpm_devices' : tpm_devices })
127+ if not isinstance (template_content , str ):
128+ template_content = template_content .decode ("utf-8" )
73129 xmlconfig = filters .render_template (template_content , params )
74130 ctx .logger .debug (repr (xmlconfig ))
75131 return xmlconfig
0 commit comments