summaryrefslogblamecommitdiffstats
path: root/src/main/resources/libvirt/rng/domaincommon.rng
blob: 6158ed79ac1096211c516dc42bfc415fec0164bd (plain) (tree)
1
2
3
4
5
6
7
8
9
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286
6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313
6314
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463







                                                                                                                  
                                   


























                                                                        
                                  

              















































































                                                                   
































































































































                                                                           
                          









                         
 


                       



                                    
                             

                                     
                                        
                         
                    















                                            


              
 
                       



































                                                  

                                        







                                         
                          

                                         

                            






                                            


                                          











                                           


                                          
                        





                                             
                         












                                       
                          


















                                             
           
 














































                                                           
                  







                                     

























                                                                     







                                       
























                                   



















                                         
                  






























                                        














































                                                            










                                                              
























































































































































                                                                        












                                              








































































                                               









                                                  





                       














                                              







































































                                                                       

























                                                                        












































































































                                                               




                                     




































































































                                                                 
                                            































                                              
                                          












                                      







                                   


















































                                           







                                        






















                                     
                                       












































































































































































                                                                           
                              






















                                             




                                           

















                                  


                          




































                                                               
                             


































































































                                                                         
                                         



















































                                         
                               





















                                       
                                          









                                     
                                       


















                                         


                                         

























































































































































































                                                      

















                                         




















































                                                                                                  



                                























                                                            


                                





















                                                          
























                                                          









                                                 



























                                                          


                                         


                                           


                                 







































































                                                    
                                                










































































                                                   

















                                     
                               



                                                                               

                            

                            
                                   




























                                                        




                                        
















































































                                               




                                       




















































































































                                                           


                            


































































































                                                                
























                                                                               
                              

















































                                                                             
                              

















                                                                
                              


                         







































































                                                                    

































































                                         

                               














                                                  
                      
                                    
                       

                                     

                                         









                                          
                      
                                    
                       










                                          
                    

                                   

                        







                                    
                      









                                             
                       

                      



                                          
                    


                                   
                     








                                        
                      















                                          
                      





                                          
                      


















                                          

              
 







































































                                                     











                                          












                                      








                                      



































































































































                                                                            







                                          



















































































































































                                               





























                                             























































































                                                           
                                           




































                                                           






                                    








                                       




                                       



























































































































                                                









                                                






                           


                          
































                                                                
                             







                                                                           






























                                         
                





                                  

                    

                                    


                      

                                    

                      























                                          

                 
           




















                                       












































































                                                                            




                                               




























                                            









                                        















































































































































                                              
                                     

                       





                                           




                            
                                 


                                         




                                               


                        




















                                          









                                               






                                     



































































                                             


















                                  




















































                                                                  



























                                          
                                     











                                       
                          


                                       
                            


















                                             

                                         


                                      

                                         






                                        




                                      








































































                                                                    







































































































                                                                               


                          




























                                                    
                                















                                        
                                     








































                                                

                                 















































                                         
 
                                



































































                                       
                      







                                     

















































                                       


                            














                                 



































































































































































                                      




                                  




                           




                                      



















                                       
















                                       

























































                                            
                        



                                        
                        











































































































                                             



                             

                                
                  


                                   
                               

                    






















                                       


































































                                               


                            































                                                


                            


















































































                                           
 

                              












































                                                                           

              
 

















                                          








                                 













                                              
                                   
                      



                                                               

                                               

                                    

                     





                                           























                                        















                                     









                                                 




























                                                       































                                                  







                                       








                               
                               

                  







































                                             











































                                         































                                                  













                                                    


                            






























                                           
                             

                   






























                                       


                            












































































                                        


                             























                                           








                                        
































































































































































































































































































































                                                                            
                                

                     
                    
                                
                     


















                                  
                                                            










































































































































                                                                               


                                     































































































































































































































































































                                                                         









                                     




























































































                                           









                                   





                               
                                    

                                   






























                                        


                            





















































                                           














                                       





































                                                


                            
















































                                       
























































                                           















                               




                                    




























                                                             




                                                                 
                        



















                                            
                                  



                                            
                        
                        
                                      



                                        



                                  
                    


                                  

                      


                                      

              
 






























































































































































                                                           








                              


                                                 










                                    
                      


                                          
                       
                      


                                          
                       















































































                                                              



































                                         














                                          


































































































































































































































































































                                                                                 












                                                                                






































                                                                             
















































































































                                                                                     
                                                       










































































































































                                                                                       
                                  


























































































































































                                                                     
<?xml version="1.0"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  <!-- domain-related definitions used in multiple grammars -->
  <include href="basictypes.rng"/>
  <include href="storagecommon.rng"/>
  <include href="networkcommon.rng"/>
  <include href="cputypes.rng"/>
  <include href="nwfilter_params.rng"/>
  <include href="privatedata.rng"/>

  <!--
    description and title element, may be placed anywhere under the root
    -->
  <define name="description">
    <element name="description">
      <text/>
    </element>
  </define>

  <define name="title">
    <element name="title">
      <ref name="objectNameWithSlash"/>
    </element>
  </define>

  <define name="createMode">
    <data type="unsignedInt">
      <param name="pattern">0[0-7]{3}|[0-7]{1,3}</param>
    </data>
  </define>

  <!--
      We handle only document defining a domain
    -->
  <define name="domain">
    <element name="domain">
      <ref name="domaincontents"/>
    </element>
  </define>

  <!-- this element is used as a child of a snapshot definition -->
  <define name="inactiveDomain">
    <element name="inactiveDomain">
      <ref name="domaincontents"/>
    </element>
  </define>

  <define name="domaincontents">
    <ref name="hvs"/>
    <interleave>
      <ref name="ids"/>
      <optional>
        <ref name="title"/>
      </optional>
      <optional>
        <ref name="description"/>
      </optional>
      <optional>
        <ref name="metadata"/>
      </optional>
      <optional>
        <ref name="guestcpu"/>
      </optional>
      <zeroOrMore>
        <ref name="sysinfo"/>
      </zeroOrMore>
      <ref name="os"/>
      <ref name="clock"/>
      <ref name="resources"/>
      <ref name="features"/>
      <ref name="events"/>
      <optional>
        <ref name="pm"/>
      </optional>
      <optional>
        <ref name="perf"/>
      </optional>
      <optional>
        <ref name="idmap"/>
      </optional>
      <optional>
        <ref name="devices"/>
      </optional>
      <zeroOrMore>
        <ref name="seclabel"/>
      </zeroOrMore>
      <optional>
        <ref name="qemucmdline"/>
      </optional>
      <optional>
        <ref name="qemucapabilities"/>
      </optional>
      <optional>
        <ref name="qemudeprecation"/>
      </optional>
      <optional>
        <ref name="qemuoverride"/>
      </optional>
      <optional>
        <ref name="lxcsharens"/>
      </optional>
      <optional>
        <ref name="keywrap"/>
      </optional>
      <optional>
        <ref name="launchSecurity"/>
      </optional>
      <optional>
        <ref name="bhyvecmdline"/>
      </optional>
      <optional>
        <ref name="xencmdline"/>
      </optional>
      <optional>
        <ref name="vmwaredatacenterpath"/>
      </optional>
    </interleave>
  </define>

  <define name="seclabel">
    <element name="seclabel">
      <optional>
        <attribute name="model">
          <text/>
        </attribute>
      </optional>
      <choice>
        <group>
          <!-- with dynamic label (default), relabel must be yes, baselabel
               is optional, and label and imagelabel are output-only -->
          <optional>
            <attribute name="type">
              <value>dynamic</value>
            </attribute>
          </optional>
          <optional>
            <attribute name="relabel">
              <value>yes</value>
            </attribute>
          </optional>
          <interleave>
            <optional>
              <element name="label">
                <text/>
              </element>
            </optional>
            <optional>
              <element name="imagelabel">
                <text/>
              </element>
            </optional>
            <optional>
              <element name="baselabel">
                <text/>
              </element>
            </optional>
          </interleave>
        </group>
        <group>
          <!-- with static label, relabel can be either format (default
               no), label is required, imagelabel is output-only, and no
               baselabel is present -->
          <attribute name="type">
            <value>static</value>
          </attribute>
          <optional>
            <attribute name="relabel">
              <ref name="virYesNo"/>
            </attribute>
          </optional>
          <interleave>
            <element name="label">
              <text/>
            </element>
            <optional>
              <element name="imagelabel">
                <text/>
              </element>
            </optional>
          </interleave>
        </group>
        <group>
          <!-- with none, relabel must be no if present -->
          <attribute name="type">
            <value>none</value>
          </attribute>
          <optional>
            <attribute name="relabel">
              <value>no</value>
            </attribute>
          </optional>
        </group>
      </choice>
    </element>
  </define>
  <define name="devSeclabel">
    <element name="seclabel">
      <!-- A per-device seclabel override is more limited, either
           relabel=no or a <label> must be present on input;
           output also can include labelskip=yes.  -->
      <optional>
        <attribute name="model">
          <text/>
        </attribute>
      </optional>
      <choice>
        <group>
          <attribute name="relabel">
            <value>no</value>
          </attribute>
        </group>
        <group>
          <attribute name="labelskip">
            <value>yes</value>
          </attribute>
        </group>
        <group>
          <optional>
            <attribute name="relabel">
              <value>yes</value>
            </attribute>
          </optional>
          <oneOrMore>
            <element name="label">
              <text/>
            </element>
          </oneOrMore>
        </group>
      </choice>
    </element>
  </define>
  <define name="hvs">
    <attribute name="type">
      <choice>
        <value>qemu</value>
        <value>kqemu</value>
        <value>kvm</value>
        <value>xen</value>
        <value>lxc</value>
        <value>uml</value> <!-- NOT USED ANYMORE -->
        <value>openvz</value>
        <value>test</value>
        <value>vmware</value>
        <value>hyperv</value>
        <value>vbox</value>
        <value>phyp</value> <!-- NOT USED ANYMORE -->
        <value>vz</value>
        <value>bhyve</value>
        <value>hvf</value>
      </choice>
    </attribute>
  </define>
  <define name="os">
    <choice>
      <ref name="osxen"/>
      <ref name="oshvm"/>
      <ref name="osexe"/>
    </choice>
  </define>

  <define name="osxen">
    <choice>
      <group>
        <interleave>
          <optional>
            <ref name="bootloader"/>
          </optional>
          <element name="os">
            <interleave>
              <ref name="ostypexen"/>
              <ref name="osbootkernel"/>
            </interleave>
          </element>
        </interleave>
      </group>
      <group>
        <interleave>
          <ref name="bootloader"/>
          <optional>
            <element name="os">
              <interleave>
                <ref name="ostypexen"/>
                <optional>
                  <ref name="osbootkernel"/>
                </optional>
              </interleave>
            </element>
          </optional>
        </interleave>
      </group>
    </choice>
  </define>

  <define name="oshvm">
    <interleave>
      <optional>
        <ref name="bootloader"/>
      </optional>
      <element name="os">
        <interleave>
          <optional>
            <attribute name="firmware">
              <choice>
                <value>bios</value>
                <value>efi</value>
              </choice>
            </attribute>
          </optional>
          <ref name="ostypehvm"/>
          <optional>
            <element name="firmware">
              <oneOrMore>
                <element name="feature">
                  <attribute name="enabled">
                    <ref name="virYesNo"/>
                  </attribute>
                  <attribute name="name">
                    <choice>
                      <value>enrolled-keys</value>
                      <value>secure-boot</value>
                    </choice>
                  </attribute>
                </element>
              </oneOrMore>
            </element>
          </optional>
          <optional>
            <element name="loader">
              <optional>
                <attribute name="readonly">
                  <ref name="virYesNo"/>
                </attribute>
              </optional>
              <optional>
                <attribute name="secure">
                  <ref name="virYesNo"/>
                </attribute>
              </optional>
              <optional>
                <attribute name="type">
                  <choice>
                    <value>rom</value>
                    <value>pflash</value>
                  </choice>
                </attribute>
              </optional>
              <optional>
                <attribute name="stateless">
                  <ref name="virYesNo"/>
                </attribute>
              </optional>
              <optional>
                <ref name="pflashFormat"/>
              </optional>
              <optional>
                <ref name="absFilePath"/>
              </optional>
            </element>
          </optional>
          <optional>
            <element name="nvram">
              <optional>
                <attribute name="template">
                  <ref name="absFilePath"/>
                </attribute>
              </optional>
              <optional>
                <ref name="pflashFormat"/>
              </optional>
              <optional>
                <choice>
                  <group>
                    <ref name="absFilePath"/>
                  </group>
                  <group>
                    <ref name="diskSource"/>
                  </group>
                </choice>
              </optional>
            </element>
          </optional>
          <optional>
            <ref name="osbootkernel"/>
          </optional>
          <zeroOrMore>
            <ref name="osbootdev"/>
          </zeroOrMore>
          <optional>
            <element name="bootmenu">
              <attribute name="enable">
                <ref name="virYesNo"/>
              </attribute>
              <optional>
                <attribute name="timeout">
                  <ref name="unsignedShort"/>
                </attribute>
              </optional>
            </element>
          </optional>
          <optional>
            <ref name="smbios"/>
          </optional>
          <optional>
            <ref name="bios"/>
          </optional>
          <optional>
            <ref name="acpiTable"/>
          </optional>
        </interleave>
      </element>
    </interleave>
  </define>

  <define name="ostypexen">
    <element name="type">
      <optional>
        <attribute name="arch">
          <choice>
            <value>i686</value>
            <value>x86_64</value>
            <value>ia64</value>
          </choice>
        </attribute>
      </optional>
      <optional>
        <attribute name="machine">
          <choice>
            <value>xenpv</value>
            <value>xenfv</value>
            <value>xenpvh</value>
          </choice>
        </attribute>
      </optional>
      <choice>
        <value>xen</value>
        <value>linux</value>
        <value>xenpvh</value>
      </choice>
    </element>
  </define>
  <define name="ostypehvm">
    <element name="type">
      <optional>
        <attribute name="arch">
          <ref name="archnames"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="machine">
          <data type="string">
            <param name="pattern">[a-zA-Z0-9_\.\-]+</param>
          </data>
        </attribute>
      </optional>
      <value>hvm</value>
    </element>
  </define>

  <define name="osexe">
    <element name="os">
      <interleave>
        <element name="type">
          <optional>
            <attribute name="arch">
              <ref name="archnames"/>
            </attribute>
          </optional>
          <value>exe</value>
        </element>
        <optional>
          <element name="init">
            <ref name="absFilePath"/>
          </element>
        </optional>
        <zeroOrMore>
          <element name="initarg">
            <text/>
          </element>
        </zeroOrMore>
        <zeroOrMore>
          <element name="initenv">
            <attribute name="name">
              <data type="string">
                <param name="pattern">[a-zA-Z_]+[a-zA-Z0-9_]*</param>
              </data>
            </attribute>
            <text/>
          </element>
        </zeroOrMore>
        <optional>
          <element name="initdir">
            <ref name="absFilePath"/>
          </element>
        </optional>
        <optional>
          <interleave>
            <element name="inituser">
              <ref name="genericName"/>
            </element>
            <element name="initgroup">
              <ref name="genericName"/>
            </element>
          </interleave>
        </optional>
      </interleave>
    </element>
  </define>

  <define name="keywrap">
    <element name="keywrap">
      <oneOrMore>
        <element name="cipher">
          <attribute name="name">
            <choice>
              <value>aes</value>
              <value>dea</value>
            </choice>
          </attribute>
          <attribute name="state">
            <ref name="virOnOff"/>
          </attribute>
        </element>
      </oneOrMore>
    </element>
  </define>

  <define name="launchSecurity">
    <element name="launchSecurity">
      <choice>
        <group>
          <ref name="launchSecuritySEV"/>
        </group>
        <group>
          <attribute name="type">
            <value>s390-pv</value>
          </attribute>
        </group>
      </choice>
    </element>
  </define>

  <define name="launchSecuritySEV">
    <attribute name="type">
      <value>sev</value>
    </attribute>
    <optional>
      <attribute name="kernelHashes">
        <ref name="virYesNo"/>
      </attribute>
    </optional>
    <interleave>
      <optional>
        <element name="cbitpos">
          <data type="unsignedInt"/>
        </element>
      </optional>
      <optional>
        <element name="reducedPhysBits">
          <data type="unsignedInt"/>
        </element>
      </optional>
      <element name="policy">
        <ref name="hexuint"/>
      </element>
      <optional>
        <element name="handle">
          <ref name="unsignedInt"/>
        </element>
      </optional>
      <optional>
        <element name="dhCert">
          <data type="string"/>
        </element>
      </optional>
      <optional>
        <element name="session">
          <data type="string"/>
        </element>
      </optional>
    </interleave>
  </define>

  <!--
      Enable or disable perf events for the domain. For each
      of the events the following rules apply:
      on: the event will be forcefully enabled
      off: the event will be forcefully disabled
      not specified: the event will be disabled by default
  -->
  <define name="perf">
    <element name="perf">
      <oneOrMore>
        <element name="event">
          <attribute name="name">
            <choice>
              <value>cmt</value>
              <value>mbmt</value>
              <value>mbml</value>
              <value>cpu_cycles</value>
              <value>instructions</value>
              <value>cache_references</value>
              <value>cache_misses</value>
              <value>branch_instructions</value>
              <value>branch_misses</value>
              <value>bus_cycles</value>
              <value>stalled_cycles_frontend</value>
              <value>stalled_cycles_backend</value>
              <value>ref_cpu_cycles</value>
              <value>cpu_clock</value>
              <value>task_clock</value>
              <value>page_faults</value>
              <value>context_switches</value>
              <value>cpu_migrations</value>
              <value>page_faults_min</value>
              <value>page_faults_maj</value>
              <value>alignment_faults</value>
              <value>emulation_faults</value>
            </choice>
          </attribute>
          <attribute name="enabled">
            <ref name="virYesNo"/>
          </attribute>
        </element>
      </oneOrMore>
    </element>
  </define>

  <define name="fibrechannel">
    <element name="fibrechannel">
      <attribute name="appid">
        <data type="string">
          <!-- All printable characters -->
          <param name="pattern">[&#x20;-&#x7E;]{1,128}</param>
        </data>
      </attribute>
    </element>
  </define>

  <!--
      The Identifiers can be:
      - an optional id attribute with a number on the domain element
      - a mandatory name
      - an optional uuid
    -->
  <define name="ids">
    <optional>
      <attribute name="id">
        <ref name="unsignedInt"/>
      </attribute>
    </optional>
    <interleave>
      <element name="name">
        <ref name="objectNameWithSlash"/>
      </element>
      <optional>
        <element name="uuid">
          <ref name="UUID"/>
        </element>
      </optional>
      <optional>
        <element name="genid">
          <choice>
            <ref name="UUID"/>
            <empty/>
          </choice>
        </element>
      </optional>
    </interleave>
  </define>
  <define name="idmap">
    <element name="idmap">
      <interleave>
        <zeroOrMore>
          <element name="uid">
            <attribute name="start">
              <ref name="unsignedInt"/>
            </attribute>
            <attribute name="target">
              <ref name="unsignedInt"/>
            </attribute>
            <attribute name="count">
              <ref name="unsignedInt"/>
            </attribute>
            <empty/>
          </element>
        </zeroOrMore>
        <zeroOrMore>
          <element name="gid">
            <attribute name="start">
              <ref name="unsignedInt"/>
            </attribute>
            <attribute name="target">
              <ref name="unsignedInt"/>
            </attribute>
            <attribute name="count">
              <ref name="unsignedInt"/>
            </attribute>
            <empty/>
          </element>
        </zeroOrMore>
      </interleave>
    </element>
  </define>
  <!--
      Resources usage defines the amount of memory (maximum and possibly
      current usage) and number of virtual CPUs used by that domain.
      We can't check here the rule that currentMemory <= memory
    -->
  <define name="resources">
    <interleave>
      <optional>
        <element name="memory">
          <ref name="scaledInteger"/>
          <optional>
            <attribute name="dumpCore">
              <ref name="virOnOff"/>
            </attribute>
          </optional>
        </element>
      </optional>
      <optional>
        <element name="maxMemory">
          <ref name="scaledInteger"/>
          <attribute name="slots">
            <ref name="unsignedInt"/>
          </attribute>
        </element>
      </optional>
      <optional>
        <element name="currentMemory">
          <ref name="scaledInteger"/>
        </element>
      </optional>
      <optional>
        <element name="memoryBacking">
          <interleave>
            <optional>
              <element name="hugepages">
                <zeroOrMore>
                  <element name="page">
                    <attribute name="size">
                      <ref name="unsignedLong"/>
                    </attribute>
                    <optional>
                      <attribute name="unit">
                        <ref name="unit"/>
                      </attribute>
                    </optional>
                    <optional>
                      <attribute name="nodeset">
                        <ref name="cpuset"/>
                      </attribute>
                    </optional>
                    <empty/>
                  </element>
                </zeroOrMore>
              </element>
            </optional>
            <optional>
              <element name="nosharepages">
                <empty/>
              </element>
            </optional>
            <optional>
              <element name="locked">
                <empty/>
              </element>
            </optional>
            <optional>
              <element name="source">
                <attribute name="type">
                  <choice>
                    <value>file</value>
                    <value>anonymous</value>
                    <value>memfd</value>
                  </choice>
                </attribute>
              </element>
            </optional>
            <optional>
              <element name="access">
                <attribute name="mode">
                  <choice>
                    <value>shared</value>
                    <value>private</value>
                  </choice>
                </attribute>
              </element>
            </optional>
            <optional>
              <element name="allocation">
                <optional>
                  <attribute name="mode">
                    <choice>
                      <value>immediate</value>
                      <value>ondemand</value>
                    </choice>
                  </attribute>
                </optional>
                <optional>
                  <attribute name="threads">
                    <ref name="unsignedInt"/>
                  </attribute>
                </optional>
              </element>
            </optional>
            <optional>
              <element name="discard">
                <empty/>
              </element>
            </optional>
          </interleave>
        </element>
      </optional>

      <optional>
        <element name="vcpu">
          <optional>
            <attribute name="placement">
              <choice>
                <value>static</value>
                <value>auto</value>
              </choice>
            </attribute>
          </optional>
          <optional>
            <attribute name="cpuset">
              <ref name="cpuset"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="current">
              <ref name="countCPU"/>
            </attribute>
          </optional>
          <ref name="countCPU"/>
        </element>
      </optional>

      <optional>
        <element name="vcpus">
          <zeroOrMore>
            <element name="vcpu">
              <attribute name="id">
                <ref name="unsignedInt"/>
              </attribute>
              <attribute name="enabled">
                <ref name="virYesNo"/>
              </attribute>
              <optional>
                <attribute name="hotpluggable">
                  <ref name="virYesNo"/>
                </attribute>
              </optional>
              <optional>
                <attribute name="order">
                  <ref name="unsignedInt"/>
                </attribute>
              </optional>
            </element>
          </zeroOrMore>
        </element>
      </optional>

      <optional>
        <element name="iothreads">
          <ref name="unsignedInt"/>
        </element>
      </optional>

      <optional>
        <element name="iothreadids">
          <zeroOrMore>
            <element name="iothread">
              <attribute name="id">
                <ref name="unsignedInt"/>
              </attribute>
              <optional>
                <attribute name="thread_pool_min">
                  <ref name="unsignedInt"/>
                </attribute>
              </optional>
              <optional>
                <attribute name="thread_pool_max">
                  <ref name="unsignedInt"/>
                </attribute>
              </optional>
            </element>
          </zeroOrMore>
        </element>
      </optional>

      <optional>
        <element name="defaultiothread">
          <optional>
            <attribute name="thread_pool_min">
              <ref name="unsignedInt"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="thread_pool_max">
              <ref name="unsignedInt"/>
            </attribute>
          </optional>
        </element>
      </optional>

      <optional>
        <ref name="blkiotune"/>
      </optional>

      <optional>
        <ref name="memtune"/>
      </optional>

      <optional>
        <ref name="cputune"/>
      </optional>

      <optional>
        <ref name="numatune"/>
      </optional>

      <optional>
        <ref name="respartition"/>
      </optional>
    </interleave>
  </define>

  <!-- The Blkio cgroup related tunables would go in the blkiotune -->
  <define name="blkiotune">
    <element name="blkiotune">
      <interleave>
        <!-- I/O weight the VM can use -->
        <optional>
          <element name="weight">
            <ref name="weight"/>
          </element>
        </optional>
        <zeroOrMore>
          <element name="device">
            <interleave>
              <element name="path">
                <ref name="absFilePath"/>
              </element>
              <optional>
                <element name="weight">
                  <ref name="weight"/>
                </element>
              </optional>
              <optional>
                <element name="read_iops_sec">
                  <data type="unsignedInt"/>
                </element>
              </optional>
              <optional>
                <element name="write_iops_sec">
                  <data type="unsignedInt"/>
                </element>
              </optional>
              <optional>
                <element name="read_bytes_sec">
                  <data type="unsignedLong"/>
                </element>
              </optional>
              <optional>
                <element name="write_bytes_sec">
                  <data type="unsignedLong"/>
                </element>
              </optional>
            </interleave>
          </element>
        </zeroOrMore>
      </interleave>
    </element>
  </define>

  <!-- All the memory/swap related tunables would go in the memtune -->
  <define name="memtune">
    <element name="memtune">
      <interleave>
        <!-- Maximum memory the VM can use -->
        <optional>
          <element name="hard_limit">
            <ref name="scaledInteger"/>
          </element>
        </optional>
        <!-- Minimum memory ascertained for the VM during contention -->
        <optional>
          <element name="soft_limit">
            <ref name="scaledInteger"/>
          </element>
        </optional>
        <!-- Minimum amount of memory required to start the VM -->
        <optional>
          <element name="min_guarantee">
            <ref name="scaledInteger"/>
          </element>
        </optional>
        <!-- Maximum swap area the VM can use -->
        <optional>
          <element name="swap_hard_limit">
            <ref name="scaledInteger"/>
          </element>
        </optional>
      </interleave>
    </element>
  </define>

  <!-- All the cpu related tunables would go in the cputune -->
  <define name="cputune">
    <element name="cputune">
      <interleave>
        <optional>
          <element name="shares">
            <ref name="cpushares"/>
          </element>
        </optional>
        <optional>
          <element name="global_period">
            <ref name="cpuperiod"/>
          </element>
        </optional>
        <optional>
          <element name="global_quota">
            <ref name="cpuquota"/>
          </element>
        </optional>
        <optional>
          <element name="period">
            <ref name="cpuperiod"/>
          </element>
        </optional>
        <optional>
          <element name="quota">
            <ref name="cpuquota"/>
          </element>
        </optional>
        <optional>
          <element name="emulator_period">
            <ref name="cpuperiod"/>
          </element>
        </optional>
        <optional>
          <element name="emulator_quota">
            <ref name="cpuquota"/>
          </element>
        </optional>
        <optional>
          <element name="iothread_period">
            <ref name="cpuperiod"/>
          </element>
        </optional>
        <optional>
          <element name="iothread_quota">
            <ref name="cpuquota"/>
          </element>
        </optional>
        <zeroOrMore>
          <element name="vcpupin">
            <attribute name="vcpu">
              <ref name="vcpuid"/>
            </attribute>
            <attribute name="cpuset">
              <ref name="cpuset"/>
            </attribute>
          </element>
        </zeroOrMore>
        <optional>
          <element name="emulatorpin">
            <attribute name="cpuset">
              <ref name="cpuset"/>
            </attribute>
          </element>
        </optional>
        <zeroOrMore>
          <element name="iothreadpin">
            <attribute name="iothread">
              <ref name="unsignedInt"/>
            </attribute>
            <attribute name="cpuset">
              <ref name="cpuset"/>
            </attribute>
          </element>
        </zeroOrMore>
        <zeroOrMore>
          <element name="vcpusched">
            <optional>
              <attribute name="vcpus">
                <ref name="cpuset"/>
              </attribute>
            </optional>
            <ref name="schedparam"/>
          </element>
        </zeroOrMore>
        <zeroOrMore>
          <element name="iothreadsched">
            <optional>
              <attribute name="iothreads">
                <ref name="cpuset"/>
              </attribute>
            </optional>
            <ref name="schedparam"/>
          </element>
        </zeroOrMore>
        <optional>
          <element name="emulatorsched">
            <ref name="schedparam"/>
          </element>
        </optional>
        <zeroOrMore>
          <element name="cachetune">
            <attribute name="vcpus">
              <ref name="cpuset"/>
            </attribute>
            <optional>
              <attribute name="id">
                <data type="string"/>
              </attribute>
            </optional>
            <oneOrMore>
              <choice>
                <element name="cache">
                  <attribute name="id">
                    <ref name="unsignedInt"/>
                  </attribute>
                  <attribute name="level">
                    <ref name="unsignedInt"/>
                  </attribute>
                  <attribute name="type">
                    <choice>
                      <value>both</value>
                      <value>code</value>
                      <value>data</value>
                    </choice>
                  </attribute>
                  <attribute name="size">
                    <ref name="unsignedLong"/>
                  </attribute>
                  <optional>
                    <attribute name="unit">
                      <ref name="unit"/>
                    </attribute>
                  </optional>
                </element>
                <element name="monitor">
                  <attribute name="level">
                    <ref name="unsignedInt"/>
                  </attribute>
                  <attribute name="vcpus">
                    <ref name="cpuset"/>
                  </attribute>
                </element>
              </choice>
            </oneOrMore>
          </element>
        </zeroOrMore>
        <zeroOrMore>
          <element name="memorytune">
            <attribute name="vcpus">
              <ref name="cpuset"/>
            </attribute>
            <oneOrMore>
              <choice>
                <element name="node">
                  <attribute name="id">
                    <ref name="unsignedInt"/>
                  </attribute>
                  <attribute name="bandwidth">
                    <ref name="unsignedInt"/>
                  </attribute>
                </element>
                <element name="monitor">
                  <attribute name="vcpus">
                    <ref name="cpuset"/>
                  </attribute>
                </element>
              </choice>
            </oneOrMore>
          </element>
        </zeroOrMore>
      </interleave>
    </element>
  </define>

  <define name="schedparam">
    <choice>
      <group>
        <attribute name="scheduler">
          <choice>
            <value>batch</value>
            <value>idle</value>
          </choice>
        </attribute>
      </group>
      <group>
        <attribute name="scheduler">
          <choice>
            <value>fifo</value>
            <value>rr</value>
          </choice>
        </attribute>
        <attribute name="priority">
          <ref name="unsignedShort"/>
        </attribute>
      </group>
    </choice>
  </define>

  <!-- All the NUMA related tunables would go in the numatune -->
  <define name="numatune">
    <element name="numatune">
      <interleave>
        <optional>
          <element name="memory">
            <optional>
              <attribute name="mode">
                <choice>
                  <value>strict</value>
                  <value>preferred</value>
                  <value>interleave</value>
                  <value>restrictive</value>
                </choice>
              </attribute>
            </optional>
            <choice>
              <group>
                <optional>
                  <attribute name="placement">
                    <value>static</value>
                  </attribute>
                </optional>
                <optional>
                  <attribute name="nodeset">
                    <ref name="cpuset"/>
                  </attribute>
                </optional>
              </group>
              <attribute name="placement">
                <value>auto</value>
              </attribute>
            </choice>
          </element>
        </optional>
        <zeroOrMore>
          <element name="memnode">
            <attribute name="cellid">
              <ref name="unsignedInt"/>
            </attribute>
            <attribute name="mode">
              <choice>
                <value>strict</value>
                <value>preferred</value>
                <value>interleave</value>
                <value>restrictive</value>
              </choice>
            </attribute>
            <attribute name="nodeset">
              <ref name="cpuset"/>
            </attribute>
          </element>
        </zeroOrMore>
      </interleave>
    </element>
  </define>

  <define name="respartition">
    <element name="resource">
      <optional>
        <element name="partition">
          <ref name="absFilePath"/>
        </element>
      </optional>
      <optional>
        <ref name="fibrechannel"/>
      </optional>
    </element>
  </define>

  <define name="clock">
    <optional>
      <element name="clock">
        <choice>
          <group>
            <attribute name="offset">
              <choice>
                <value>localtime</value>
                <value>utc</value>
              </choice>
            </attribute>
            <optional>
              <attribute name="adjustment">
                <choice>
                  <ref name="timeDelta"/>
                  <value>reset</value>
                </choice>
              </attribute>
            </optional>
          </group>
          <group>
            <attribute name="offset">
              <value>timezone</value>
            </attribute>
            <optional>
              <attribute name="timezone">
                <ref name="timeZone"/>
              </attribute>
            </optional>
          </group>
          <group>
            <attribute name="offset">
              <value>variable</value>
            </attribute>
            <optional>
              <attribute name="adjustment">
                <ref name="timeDelta"/>
              </attribute>
            </optional>
            <optional>
              <attribute name="basis">
                <choice>
                  <value>utc</value>
                  <value>localtime</value>
                </choice>
              </attribute>
            </optional>
          </group>
          <group>
            <attribute name="offset">
              <value>absolute</value>
            </attribute>
            <attribute name="start">
              <ref name="unsignedLong"/>
            </attribute>
          </group>
        </choice>
        <zeroOrMore>
          <ref name="timer"/>
        </zeroOrMore>
      </element>
    </optional>
  </define>
  <define name="timer">
    <element name="timer">
      <choice>
        <group>
          <attribute name="name">
            <choice>
              <value>platform</value>
              <value>rtc</value>
            </choice>
          </attribute>
          <optional>
            <attribute name="track">
              <choice>
                <value>boot</value>
                <value>guest</value>
                <value>wall</value>
                <value>realtime</value>
              </choice>
            </attribute>
          </optional>
          <optional>
            <ref name="tickpolicy"/>
          </optional>
        </group>
        <group>
          <attribute name="name">
            <value>tsc</value>
          </attribute>
          <optional>
            <ref name="tickpolicy"/>
          </optional>
          <optional>
            <attribute name="frequency">
              <ref name="unsignedLong"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="mode">
              <choice>
                <value>auto</value>
                <value>native</value>
                <value>emulate</value>
                <value>paravirt</value>
                <value>smpsafe</value>
              </choice>
            </attribute>
          </optional>
        </group>
        <group>
          <attribute name="name">
            <choice>
              <value>hpet</value>
              <value>pit</value>
              <value>armvtimer</value>
            </choice>
          </attribute>
          <optional>
            <ref name="tickpolicy"/>
          </optional>
        </group>
        <group>
          <attribute name="name">
            <choice>
              <value>kvmclock</value>
              <value>hypervclock</value>
            </choice>
          </attribute>
        </group>
      </choice>
      <optional>
        <attribute name="present">
          <ref name="virYesNo"/>
        </attribute>
      </optional>
      <empty/>
    </element>
  </define>

  <define name="tickpolicy">
    <choice>
      <group>
        <attribute name="tickpolicy">
          <choice>
            <value>delay</value>
            <value>merge</value>
            <value>discard</value>
          </choice>
        </attribute>
      </group>
      <group>
        <attribute name="tickpolicy">
          <value>catchup</value>
        </attribute>
        <optional>
          <element name="catchup">
            <optional>
              <attribute name="threshold">
                <ref name="unsignedInt"/>
              </attribute>
            </optional>
            <optional>
              <attribute name="slew">
                <ref name="unsignedInt"/>
              </attribute>
            </optional>
            <optional>
              <attribute name="limit">
                <ref name="unsignedInt"/>
              </attribute>
            </optional>
          </element>
        </optional>
      </group>
    </choice>
  </define>
<!--
      A bootloader may be used to extract the OS information instead of
      defining the OS parameter in the instance. It points just to the
      binary or script used to extract the data from the first disk device.
    -->
  <define name="bootloader">
    <interleave>
      <optional>
        <element name="bootloader">
          <choice>
            <text/>
            <empty/>
          </choice>
        </element>
      </optional>
      <optional>
        <element name="bootloader_args">
          <text/>
        </element>
      </optional>
    </interleave>
  </define>
  <define name="osbootkernel">
    <interleave>
      <optional>
        <element name="kernel">
          <ref name="absFilePath"/>
        </element>
      </optional>
      <optional>
        <element name="initrd">
          <ref name="absFilePath"/>
        </element>
      </optional>
      <optional>
        <element name="root">
          <ref name="absFilePath"/>
        </element>
      </optional>
      <optional>
        <element name="cmdline">
          <text/>
        </element>
      </optional>
      <optional>
        <element name="dtb">
          <ref name="absFilePath"/>
        </element>
      </optional>
    </interleave>
  </define>
  <define name="osbootdev">
    <element name="boot">
      <attribute name="dev">
        <choice>
          <value>hd</value>
          <value>fd</value>
          <value>cdrom</value>
          <value>network</value>
        </choice>
      </attribute>
      <empty/>
    </element>
  </define>
  <define name="diskspec">
    <interleave>
      <optional>
        <ref name="diskDriver"/>
      </optional>
      <optional>
        <ref name="diskMirror"/>
      </optional>
      <optional>
        <ref name="diskAuth"/>
      </optional>
      <ref name="diskTarget"/>
      <optional>
        <ref name="deviceBoot"/>
      </optional>
      <optional>
        <element name="backenddomain">
          <attribute name="name">
            <ref name="objectNameWithSlash"/>
          </attribute>
          <empty/>
        </element>
      </optional>
      <optional>
        <element name="readonly">
          <empty/>
        </element>
      </optional>
      <optional>
        <element name="shareable">
          <empty/>
        </element>
      </optional>
      <optional>
        <element name="transient">
          <optional>
            <attribute name="shareBacking">
              <ref name='virYesNo'/>
            </attribute>
          </optional>
          <empty/>
        </element>
      </optional>
      <optional>
        <element name="serial">
          <ref name="diskSerial"/>
        </element>
      </optional>
      <optional>
        <ref name="encryption"/>
      </optional>
      <optional>
        <ref name="diskIoTune"/>
      </optional>
      <optional>
        <ref name="alias"/>
      </optional>
      <optional>
        <ref name="acpi"/>
      </optional>
      <optional>
        <ref name="address"/>
      </optional>
      <optional>
        <ref name="geometry"/>
      </optional>
      <optional>
        <ref name="diskBlockIo"/>
      </optional>
      <optional>
        <element name="wwn">
          <ref name="wwn"/>
        </element>
      </optional>
      <optional>
        <element name="vendor">
          <data type="string">
            <!-- All printable characters -->
            <param name="pattern">[&#x20;-&#x7E;]{0,8}</param>
          </data>
        </element>
      </optional>
      <optional>
        <element name="product">
          <data type="string">
            <!-- All printable characters -->
            <param name="pattern">[&#x20;-&#x7E;]{0,16}</param>
          </data>
        </element>
      </optional>
    </interleave>
  </define>
  <define name="snapshot">
    <attribute name="snapshot">
      <choice>
        <value>no</value>
        <value>internal</value>
        <value>external</value>
        <value>manual</value>
      </choice>
    </attribute>
  </define>

  <define name="lease">
    <element name="lease">
      <interleave>
        <element name="lockspace">
          <text/>
        </element>
        <element name="key">
          <text/>
        </element>
        <element name="target">
          <attribute name="path">
            <text/>
          </attribute>
          <optional>
            <attribute name="offset">
              <ref name="unsignedInt"/>
            </attribute>
          </optional>
        </element>
      </interleave>
    </element>
  </define>

  <define name="startupPolicy">
    <attribute name="startupPolicy">
      <choice>
        <value>mandatory</value>
        <value>requisite</value>
        <value>optional</value>
      </choice>
    </attribute>
  </define>

  <!--
      A disk description can be either of type file or block
      The name of the attribute on the source element depends on the type

    -->
  <define name="disk">
    <element name="disk">
      <choice>
        <group>
          <optional>
            <attribute name="device">
              <choice>
                <value>floppy</value>
                <value>disk</value>
                <value>cdrom</value>
              </choice>
            </attribute>
          </optional>
          <interleave>
            <ref name="diskSource"/>
            <ref name="diskSpecsExtra"/>
          </interleave>
        </group>
        <group>
          <attribute name="device">
            <value>lun</value>
          </attribute>
          <optional>
            <ref name="rawIO"/>
          </optional>
          <optional>
            <ref name="sgIO"/>
          </optional>
          <interleave>
            <choice>
              <ref name="diskSourceNetwork"/>
              <ref name="diskSourceBlock"/>
              <ref name="diskSourceVolume"/>
            </choice>
            <ref name="diskSpecsExtra"/>
          </interleave>
        </group>
      </choice>
      <optional>
        <attribute name="model">
          <choice>
            <value>virtio</value>
            <value>virtio-transitional</value>
            <value>virtio-non-transitional</value>
          </choice>
        </attribute>
      </optional>
      <optional>
        <ref name="snapshot"/>
      </optional>
    </element>
  </define>

  <define name="diskSpecsExtra">
    <interleave>
      <ref name="storageSourceExtra"/>
      <ref name="diskBackingChain"/>
      <ref name="privateDataDeviceDisk"/>
    </interleave>
  </define>

  <define name="diskBackingChain">
    <choice>
      <ref name="diskBackingStore"/>
      <ref name="diskBackingStoreLast"/>
    </choice>
  </define>

  <define name="diskBackingStore">
    <element name="backingStore">
      <optional>
        <attribute name="index">
          <ref name="positiveInteger"/>
        </attribute>
      </optional>
      <interleave>
        <ref name="diskSource"/>
        <ref name="diskBackingChain"/>
        <ref name="diskFormat"/>
      </interleave>
    </element>
  </define>

  <define name="diskFormat">
    <element name="format">
      <attribute name="type">
        <ref name="storageFormat"/>
      </attribute>
      <optional>
        <element name="metadata_cache">
          <optional>
            <element name="max_size">
              <ref name="scaledInteger"/>
            </element>
          </optional>
        </element>
      </optional>
    </element>
  </define>

  <define name="diskBackingStoreLast">
    <optional>
      <element name="backingStore">
        <empty/>
      </element>
    </optional>
  </define>

  <define name="diskSourceSlice">
    <attribute name="offset">
      <ref name="unsignedInt"/>
    </attribute>
    <attribute name="size">
      <ref name="positiveInteger"/>
    </attribute>
  </define>

  <define name="diskSourceCommon">
    <optional>
      <attribute name="index">
        <ref name="positiveInteger"/>
      </attribute>
    </optional>
    <optional>
      <element name="slices">
        <element name="slice">
          <attribute name="type">
            <value>storage</value>
          </attribute>
          <ref name="diskSourceSlice"/>
        </element>
      </element>
    </optional>
    <ref name="privateDataStorageSource"/>
  </define>

  <define name="diskSource">
    <choice>
      <ref name="diskSourceFile"/>
      <ref name="diskSourceBlock"/>
      <ref name="diskSourceDir"/>
      <ref name="diskSourceNetwork"/>
      <ref name="diskSourceVolume"/>
      <ref name="diskSourceNvme"/>
      <ref name="diskSourceVhostUser"/>
    </choice>
  </define>

  <define name="diskSourceFile">
    <optional>
      <attribute name="type">
        <value>file</value>
      </attribute>
    </optional>
    <optional>
      <element name="source">
        <interleave>
          <optional>
            <attribute name="file">
              <choice>
                <ref name="absFilePath"/>
                <ref name="vmwarePath"/>
              </choice>
            </attribute>
            <optional>
              <attribute name="fdgroup"/>
            </optional>
          </optional>
          <ref name="diskSourceCommon"/>
          <optional>
            <ref name="storageStartupPolicy"/>
          </optional>
          <optional>
            <ref name="encryption"/>
          </optional>
          <zeroOrMore>
            <ref name="devSeclabel"/>
          </zeroOrMore>
        </interleave>
      </element>
    </optional>
  </define>

  <define name="diskSourceBlock">
    <attribute name="type">
      <value>block</value>
    </attribute>
    <optional>
      <element name="source">
        <interleave>
          <optional>
            <attribute name="dev">
              <choice>
                <ref name="absFilePath"/>
                <ref name="deviceName"/>
              </choice>
            </attribute>
          </optional>
          <ref name="diskSourceCommon"/>
          <optional>
            <ref name="storageStartupPolicy"/>
          </optional>
          <optional>
            <ref name="encryption"/>
          </optional>
          <optional>
            <ref name="reservations"/>
          </optional>
          <zeroOrMore>
            <ref name="devSeclabel"/>
          </zeroOrMore>
        </interleave>
      </element>
    </optional>
  </define>

  <define name="diskSourceDir">
    <attribute name="type">
      <value>dir</value>
    </attribute>
    <optional>
      <element name="source">
        <interleave>
          <attribute name="dir">
            <ref name="absFilePath"/>
          </attribute>
          <ref name="diskSourceCommon"/>
          <optional>
            <ref name="storageStartupPolicy"/>
          </optional>
          <optional>
            <ref name="encryption"/>
          </optional>
          <empty/>
        </interleave>
      </element>
    </optional>
  </define>

  <define name="diskSourceNetworkHost">
    <element name="host">
      <choice>
        <group>
          <optional>
            <attribute name="transport">
              <choice>
                <value>tcp</value>
                <value>rdma</value>
              </choice>
            </attribute>
          </optional>
          <attribute name="name">
            <choice>
              <ref name="dnsName"/>
              <ref name="ipAddr"/>
            </choice>
          </attribute>
          <optional>
            <attribute name="port">
              <ref name="unsignedInt"/>
            </attribute>
          </optional>
        </group>
        <group>
          <attribute name="transport">
            <value>unix</value>
          </attribute>
          <attribute name="socket">
            <ref name="absFilePath"/>
          </attribute>
        </group>
      </choice>
    </element>
  </define>

  <define name="diskSourceNetworkNFS">
    <element name="identity">
      <optional>
        <attribute name="user">
          <ref name="genericName"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="group">
          <ref name="genericName"/>
        </attribute>
      </optional>
    </element>
  </define>

  <define name="diskSourceNetworkProtocolRBD">
    <element name="source">
      <interleave>
        <attribute name="protocol">
          <value>rbd</value>
        </attribute>
        <ref name="diskSourceCommon"/>
        <optional>
          <attribute name="name"/>
        </optional>
        <zeroOrMore>
          <ref name="diskSourceNetworkHost"/>
        </zeroOrMore>
        <optional>
          <element name="snapshot">
            <attribute name="name">
              <ref name="genericName"/>
            </attribute>
            <empty/>
          </element>
        </optional>
        <optional>
          <element name="config">
            <attribute name="file">
              <ref name="absFilePath"/>
            </attribute>
            <empty/>
          </element>
        </optional>
        <optional>
          <ref name="diskAuth"/>
        </optional>
        <optional>
          <ref name="encryption"/>
        </optional>
        <empty/>
      </interleave>
    </element>
  </define>

  <define name="diskSourceNetworkProtocolISCSI">
    <element name="source">
      <attribute name="protocol">
        <value>iscsi</value>
      </attribute>
      <attribute name="name"/>
      <interleave>
        <ref name="diskSourceCommon"/>
        <ref name="diskSourceNetworkHost"/>
        <optional>
          <ref name="diskAuth"/>
        </optional>
        <optional>
          <ref name="encryption"/>
        </optional>
        <optional>
          <ref name="initiatorinfo"/>
        </optional>
      </interleave>
    </element>
  </define>

  <define name="diskSourceNetworkProtocolPropsCommon">
    <interleave>
      <optional>
        <element name="readahead">
          <attribute name="size">
            <ref name="positiveInteger"/>
          </attribute>
          <empty/>
        </element>
      </optional>
      <optional>
        <element name="timeout">
          <attribute name="seconds">
            <ref name="positiveInteger"/>
          </attribute>
          <empty/>
        </element>
      </optional>
    </interleave>
  </define>

  <define name="diskSourceNetworkProtocolSSLVerify">
    <element name="ssl">
      <attribute name="verify">
        <ref name="virYesNo"/>
      </attribute>
      <empty/>
    </element>
  </define>

  <define name="diskSourceNetworkProtocolHTTPCookies">
    <element name="cookies">
      <oneOrMore>
        <element name="cookie">
          <attribute name="name">
            <data type="string">
              <param name="pattern">[!#$%&amp;'*+\-.0-9A-Z\^_`a-z|~]+</param>
            </data>
          </attribute>
          <data type="string">
            <param name="pattern">"?[!#$%&amp;'()*+\-./0-9:&gt;=&lt;?@A-Z\^_`\[\]a-z|~]+"?</param>
          </data>
        </element>
      </oneOrMore>
      <empty/>
    </element>
  </define>

  <define name="diskSourceNetworkProtocolHTTPS">
    <element name="source">
      <interleave>
        <attribute name="protocol">
          <choice>
            <value>https</value>
          </choice>
        </attribute>
        <attribute name="name"/>
        <optional>
          <attribute name="query"/>
        </optional>
        <ref name="diskSourceCommon"/>
        <ref name="diskSourceNetworkHost"/>
        <optional>
          <ref name="encryption"/>
        </optional>
        <optional>
          <ref name="diskSourceNetworkProtocolSSLVerify"/>
        </optional>
        <optional>
          <ref name="diskSourceNetworkProtocolHTTPCookies"/>
        </optional>
        <ref name="diskSourceNetworkProtocolPropsCommon"/>
        <optional>
          <ref name="diskAuth"/>
        </optional>
      </interleave>
    </element>
  </define>

  <define name="diskSourceNetworkProtocolHTTP">
    <element name="source">
      <interleave>
        <attribute name="protocol">
          <choice>
            <value>http</value>
          </choice>
        </attribute>
        <attribute name="name"/>
        <optional>
          <attribute name="query"/>
        </optional>
        <ref name="diskSourceCommon"/>
        <ref name="diskSourceNetworkHost"/>
        <optional>
          <ref name="encryption"/>
        </optional>
        <optional>
          <ref name="diskSourceNetworkProtocolHTTPCookies"/>
        </optional>
        <ref name="diskSourceNetworkProtocolPropsCommon"/>
        <optional>
          <ref name="diskAuth"/>
        </optional>
      </interleave>
    </element>
  </define>

  <define name="diskSourceNetworkProtocolFTPS">
    <element name="source">
      <interleave>
        <attribute name="protocol">
          <choice>
            <value>ftps</value>
          </choice>
        </attribute>
        <attribute name="name"/>
        <ref name="diskSourceCommon"/>
        <ref name="diskSourceNetworkHost"/>
        <optional>
          <ref name="encryption"/>
        </optional>
        <optional>
          <ref name="diskSourceNetworkProtocolSSLVerify"/>
        </optional>
        <ref name="diskSourceNetworkProtocolPropsCommon"/>
        <optional>
          <ref name="diskAuth"/>
        </optional>
      </interleave>
    </element>
  </define>

  <define name="diskSourceNetworkProtocolFTP">
    <element name="source">
      <interleave>
        <attribute name="protocol">
          <choice>
            <value>ftp</value>
          </choice>
        </attribute>
        <attribute name="name"/>
        <ref name="diskSourceCommon"/>
        <ref name="diskSourceNetworkHost"/>
        <optional>
          <ref name="encryption"/>
        </optional>
        <ref name="diskSourceNetworkProtocolPropsCommon"/>
        <optional>
          <ref name="diskAuth"/>
        </optional>
      </interleave>
    </element>
  </define>

  <define name="diskSourceNetworkProtocolSimple">
    <element name="source">
      <interleave>
        <attribute name="protocol">
          <choice>
            <value>sheepdog</value>
            <value>tftp</value>
          </choice>
        </attribute>
        <attribute name="name"/>
        <ref name="diskSourceCommon"/>
        <ref name="diskSourceNetworkHost"/>
        <optional>
          <ref name="encryption"/>
        </optional>
        <ref name="diskSourceNetworkProtocolPropsCommon"/>
      </interleave>
    </element>
  </define>

  <define name="diskSourceNetworkProtocolNBD">
    <element name="source">
      <interleave>
        <attribute name="protocol">
          <value>nbd</value>
        </attribute>
        <optional>
          <attribute name="name"/>
        </optional>
        <optional>
          <attribute name="tls">
            <ref name="virYesNo"/>
          </attribute>
        </optional>
        <optional>
          <attribute name="tlsHostname"/>
        </optional>
        <ref name="diskSourceCommon"/>
        <ref name="diskSourceNetworkHost"/>
        <optional>
          <ref name="reconnect"/>
        </optional>
        <optional>
          <ref name="encryption"/>
        </optional>
      </interleave>
    </element>
  </define>

  <define name="diskSourceNetworkProtocolGluster">
    <element name="source">
      <interleave>
        <attribute name="protocol">
          <value>gluster</value>
        </attribute>
        <attribute name="name"/>
        <ref name="diskSourceCommon"/>
        <oneOrMore>
          <ref name="diskSourceNetworkHost"/>
        </oneOrMore>
        <optional>
          <ref name="encryption"/>
        </optional>
      </interleave>
    </element>
  </define>

  <define name="diskSourceNetworkProtocolVxHS">
    <element name="source">
      <interleave>
        <attribute name="protocol">
          <choice>
            <value>vxhs</value>
          </choice>
        </attribute>
        <attribute name="name"/>
        <ref name="diskSourceCommon"/>
        <optional>
          <attribute name="tls">
            <ref name="virYesNo"/>
          </attribute>
        </optional>
        <ref name="diskSourceNetworkHost"/>
      </interleave>
    </element>
  </define>

  <define name="diskSourceNetworkProtocolNFS">
    <element name="source">
      <interleave>
        <attribute name="protocol">
          <choice>
            <value>nfs</value>
          </choice>
        </attribute>
        <attribute name="name"/>
        <ref name="diskSourceCommon"/>
        <ref name="diskSourceNetworkHost"/>
        <ref name="diskSourceNetworkNFS"/>
      </interleave>
    </element>
  </define>

  <define name="diskSourceNetwork">
    <attribute name="type">
      <value>network</value>
    </attribute>
    <choice>
      <ref name="diskSourceNetworkProtocolNBD"/>
      <ref name="diskSourceNetworkProtocolGluster"/>
      <ref name="diskSourceNetworkProtocolRBD"/>
      <ref name="diskSourceNetworkProtocolISCSI"/>
      <ref name="diskSourceNetworkProtocolHTTP"/>
      <ref name="diskSourceNetworkProtocolHTTPS"/>
      <ref name="diskSourceNetworkProtocolFTPS"/>
      <ref name="diskSourceNetworkProtocolFTP"/>
      <ref name="diskSourceNetworkProtocolSimple"/>
      <ref name="diskSourceNetworkProtocolVxHS"/>
      <ref name="diskSourceNetworkProtocolNFS"/>
    </choice>
  </define>

  <define name="diskSourceVolume">
    <attribute name="type">
      <value>volume</value>
    </attribute>
    <optional>
      <element name="source">
        <interleave>
          <attribute name="pool">
            <ref name="objectName"/>
          </attribute>
          <attribute name="volume">
            <ref name="volName"/>
          </attribute>
          <optional>
            <attribute name="mode">
              <choice>
                <value>host</value>
                <value>direct</value>
              </choice>
            </attribute>
          </optional>
          <ref name="diskSourceCommon"/>
          <optional>
            <ref name="storageStartupPolicy"/>
          </optional>
          <optional>
            <ref name="encryption"/>
          </optional>
          <zeroOrMore>
            <ref name="devSeclabel"/>
          </zeroOrMore>
        </interleave>
      </element>
    </optional>
  </define>

  <define name="diskSourceNvme">
    <attribute name="type">
      <value>nvme</value>
    </attribute>
    <optional>
      <element name="source">
        <interleave>
          <attribute name="type">
            <value>pci</value>
          </attribute>
          <attribute name="namespace">
            <ref name="uint32"/>
          </attribute>
          <optional>
            <attribute name="managed">
              <ref name="virYesNo"/>
            </attribute>
          </optional>
          <element name="address">
            <ref name="pciaddress"/>
          </element>
          <ref name="diskSourceCommon"/>
          <optional>
            <ref name="storageStartupPolicy"/>
          </optional>
          <optional>
            <ref name="encryption"/>
          </optional>
        </interleave>
      </element>
    </optional>
  </define>

  <define name="diskSourceVhostUser">
    <attribute name="type">
      <value>vhostuser</value>
    </attribute>
    <element name="source">
      <attribute name="type">
        <value>unix</value>
      </attribute>
      <attribute name="path">
        <ref name="absFilePath"/>
      </attribute>
      <optional>
         <ref name="reconnect"/>
      </optional>
      <empty/>
    </element>
  </define>

  <define name="diskTargetDev">
    <data type="string">
      <param name="pattern">(ioemu:)?(fd|hd|sd|vd|xvd|ubd)[a-zA-Z0-9_]+</param>
    </data>
  </define>

  <define name="diskTarget">
    <element name="target">
      <attribute name="dev">
        <ref name="diskTargetDev"/>
      </attribute>
      <optional>
        <attribute name="bus">
          <choice>
            <value>ide</value>
            <value>fdc</value>
            <value>scsi</value>
            <value>virtio</value>
            <value>xen</value>
            <value>usb</value>
            <value>uml</value> <!-- NOT USED ANYMORE -->
            <value>sata</value>
            <value>sd</value>
          </choice>
        </attribute>
      </optional>
      <optional>
        <attribute name="tray">
          <choice>
            <value>open</value>
            <value>closed</value>
          </choice>
        </attribute>
      </optional>
      <optional>
        <attribute name="removable">
          <ref name="virOnOff"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="rotation_rate">
          <ref name="positiveInteger"/>
        </attribute>
      </optional>
    </element>
  </define>
  <define name="geometry">
    <element name="geometry">
      <attribute name="cyls">
        <data type="integer"/>
      </attribute>
      <attribute name="heads">
        <data type="integer"/>
      </attribute>
      <attribute name="secs">
        <data type="integer"/>
      </attribute>
      <optional>
        <attribute name="trans">
          <choice>
            <value>auto</value>
            <value>none</value>
            <value>lba</value>
          </choice>
        </attribute>
      </optional>
    </element>
  </define>
  <define name="diskBlockIo">
    <element name="blockio">
      <optional>
        <attribute name="logical_block_size">
          <data type="integer"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="physical_block_size">
          <data type="integer"/>
        </attribute>
      </optional>
    </element>
  </define>
  <!--
      Disk may use a special driver for access.
    -->
  <define name="diskDriver">
    <element name="driver">
      <optional>
        <ref name="driverFormat"/>
      </optional>
      <optional>
        <ref name="driverCache"/>
      </optional>
      <optional>
        <ref name="driverErrorPolicy"/>
      </optional>
      <optional>
        <ref name="driverRerrorPolicy"/>
      </optional>
      <optional>
        <ref name="driverIO"/>
      </optional>
      <optional>
        <ref name="ioeventfd"/>
      </optional>
      <optional>
        <ref name="event_idx"/>
      </optional>
      <optional>
        <ref name="copy_on_read"/>
      </optional>
      <optional>
        <ref name="discard"/>
      </optional>
      <optional>
        <ref name="driverIOThread"/>
      </optional>
      <optional>
        <ref name="detect_zeroes"/>
      </optional>
      <optional>
        <attribute name="queues">
          <ref name="positiveInteger"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="queue_size">
          <ref name="positiveInteger"/>
        </attribute>
      </optional>
      <ref name="virtioOptions"/>
      <optional>
        <element name="metadata_cache">
          <optional>
            <element name="max_size">
              <ref name="scaledInteger"/>
            </element>
          </optional>
        </element>
      </optional>
    </element>
  </define>
  <define name="driverFormat">
    <optional>
      <attribute name="name">
        <ref name="genericName"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="type">
        <choice>
          <ref name="storageFormat"/>
          <value>aio</value> <!-- back-compat for "raw" -->
        </choice>
      </attribute>
    </optional>
  </define>

  <define name="driverCache">
    <attribute name="cache">
      <choice>
        <value>default</value>
        <value>none</value>
        <value>writeback</value>
        <value>writethrough</value>
        <value>directsync</value>
        <value>unsafe</value>
      </choice>
    </attribute>
  </define>
  <define name="driverErrorPolicy">
    <attribute name="error_policy">
      <choice>
        <value>stop</value>
        <value>report</value>
        <value>ignore</value>
        <value>enospace</value>
      </choice>
    </attribute>
  </define>
  <define name="driverRerrorPolicy">
    <attribute name="rerror_policy">
      <choice>
        <value>stop</value>
        <value>report</value>
        <value>ignore</value>
      </choice>
    </attribute>
  </define>
  <define name="driverIO">
    <attribute name="io">
      <choice>
        <value>threads</value>
        <value>native</value>
        <value>io_uring</value>
      </choice>
    </attribute>
  </define>
  <define name="ioeventfd">
    <attribute name="ioeventfd">
      <ref name="virOnOff"/>
    </attribute>
  </define>
  <define name="event_idx">
    <attribute name="event_idx">
      <ref name="virOnOff"/>
    </attribute>
  </define>
  <define name="copy_on_read">
    <attribute name="copy_on_read">
      <ref name="virOnOff"/>
    </attribute>
  </define>
  <define name="discard">
    <attribute name="discard">
      <choice>
        <value>unmap</value>
        <value>ignore</value>
      </choice>
    </attribute>
  </define>
  <define name="driverIOThread">
    <attribute name="iothread">
      <ref name="unsignedInt"/>
    </attribute>
  </define>
  <define name="detect_zeroes">
    <attribute name="detect_zeroes">
      <choice>
        <value>off</value>
        <value>on</value>
        <value>unmap</value>
      </choice>
    </attribute>
  </define>
  <define name="controller">
    <element name="controller">
      <optional>
        <attribute name="index">
          <ref name="unsignedInt"/>
        </attribute>
      </optional>
      <interleave>
        <optional>
          <ref name="alias"/>
        </optional>
        <optional>
          <ref name="acpi"/>
        </optional>
        <optional>
          <ref name="address"/>
        </optional>
        <choice>
          <!-- fdc/sata/ccid have only the common attributes -->
          <group>
            <attribute name="type">
              <choice>
                <value>fdc</value>
                <value>sata</value>
                <value>ccid</value>
              </choice>
            </attribute>
          </group>
          <!-- scsi has an optional attribute "model" -->
          <group>
            <attribute name="type">
              <value>scsi</value>
            </attribute>
            <optional>
              <attribute name="model">
                <choice>
                  <value>auto</value>
                  <value>buslogic</value>
                  <value>lsilogic</value>
                  <value>lsisas1068</value>
                  <value>vmpvscsi</value>
                  <value>ibmvscsi</value>
                  <value>virtio-scsi</value>
                  <value>lsisas1078</value>
                  <value>virtio-transitional</value>
                  <value>virtio-non-transitional</value>
                  <value>ncr53c90</value>
                  <value>dc390</value>
                  <value>am53c974</value>
                </choice>
              </attribute>
            </optional>
          </group>
          <!-- usb has an optional attribute "model",
               and optional subelements "master" and "ports" -->
          <group>
            <attribute name="type">
              <value>usb</value>
            </attribute>
            <optional>
              <attribute name="model">
                <choice>
                  <value>piix3-uhci</value>
                  <value>piix4-uhci</value>
                  <value>ehci</value>
                  <value>ich9-ehci1</value>
                  <value>ich9-uhci1</value>
                  <value>ich9-uhci2</value>
                  <value>ich9-uhci3</value>
                  <value>vt82c686b-uhci</value>
                  <value>pci-ohci</value>
                  <value>nec-xhci</value>
                  <value>none</value>
                  <value>qusb1</value>
                  <value>qusb2</value>
                  <value>qemu-xhci</value>
                </choice>
              </attribute>
            </optional>
            <optional>
              <ref name="usbmaster"/>
            </optional>
            <optional>
              <attribute name="ports">
                <ref name="unsignedInt"/>
              </attribute>
            </optional>
          </group>
          <!-- ide has an optional attribute "model" -->
          <group>
            <attribute name="type">
              <value>ide</value>
            </attribute>
            <optional>
              <attribute name="model">
                <choice>
                  <value>piix3</value>
                  <value>piix4</value>
                  <value>ich6</value>
                </choice>
              </attribute>
            </optional>
          </group>
          <!-- isa -->
          <group>
            <attribute name="type">
              <value>isa</value>
            </attribute>
          </group>
          <!-- pci has an optional attribute "model" -->
          <group>
            <attribute name="type">
              <value>pci</value>
            </attribute>
            <interleave>
              <optional>
                <element name="model">
                  <attribute name="name">
                    <choice>
                      <!-- implementations of "pci-root" -->
                      <value>spapr-pci-host-bridge</value>
                      <!-- implementations of "pci-bridge" -->
                      <value>pci-bridge</value>
                      <!-- implementations of "dmi-to-pci-bridge" -->
                      <value>i82801b11-bridge</value>
                      <!-- implementations of "pcie-to-pci-bridge" -->
                      <value>pcie-pci-bridge</value>
                      <!-- implementations of "pcie-root-port" -->
                      <value>ioh3420</value>
                      <value>pcie-root-port</value>
                      <!-- implementations of "pcie-switch-upstream-port" -->
                      <value>x3130-upstream</value>
                      <!-- implementations of "pcie-switch-downstream-port" -->
                      <value>xio3130-downstream</value>
                      <!-- implementations of "pci-expander-bus" -->
                      <value>pxb</value>
                      <!-- implementations of "pcie-expander-bus" -->
                      <value>pxb-pcie</value>
                    </choice>
                  </attribute>
                  <empty/>
                </element>
              </optional>
              <optional>
                <element name="target">
                  <optional>
                    <attribute name="chassisNr">
                      <ref name="uint8"/>
                    </attribute>
                  </optional>
                  <optional>
                    <attribute name="chassis">
                      <ref name="uint8"/>
                    </attribute>
                  </optional>
                  <optional>
                    <attribute name="port">
                      <ref name="uint8"/>
                    </attribute>
                  </optional>
                  <optional>
                    <attribute name="busNr">
                      <ref name="uint8"/>
                    </attribute>
                  </optional>
                  <optional>
                    <attribute name="index">
                      <ref name="uint8"/>
                    </attribute>
                  </optional>
                  <optional>
                    <attribute name="hotplug">
                      <ref name="virOnOff"/>
                    </attribute>
                  </optional>
                  <optional>
                    <element name="node">
                      <ref name="unsignedInt"/>
                    </element>
                  </optional>
                </element>
              </optional>
              <!-- *-root controllers have an optional element "pcihole64"-->
              <choice>
                <group>
                  <attribute name="model">
                    <choice>
                      <value>pci-root</value>
                      <value>pcie-root</value>
                    </choice>
                  </attribute>
                  <optional>
                    <element name="pcihole64">
                      <ref name="scaledInteger"/>
                    </element>
                  </optional>
                </group>
                <group>
                  <attribute name="model">
                    <choice>
                      <value>pci-bridge</value>
                      <value>dmi-to-pci-bridge</value>
                      <value>pcie-to-pci-bridge</value>
                      <value>pcie-root-port</value>
                      <value>pcie-switch-upstream-port</value>
                      <value>pcie-switch-downstream-port</value>
                      <value>pci-expander-bus</value>
                      <value>pcie-expander-bus</value>
                    </choice>
                  </attribute>
                </group>
              </choice>
            </interleave>
          </group>
          <!-- virtio-serial has optional "ports" and "vectors" -->
          <group>
            <attribute name="type">
              <value>virtio-serial</value>
            </attribute>
            <optional>
              <attribute name="model">
                <choice>
                  <value>virtio</value>
                  <value>virtio-transitional</value>
                  <value>virtio-non-transitional</value>
                </choice>
              </attribute>
            </optional>
            <optional>
              <attribute name="ports">
                <ref name="unsignedInt"/>
              </attribute>
            </optional>
            <optional>
              <attribute name="vectors">
                <ref name="unsignedInt"/>
              </attribute>
            </optional>
          </group>
          <!-- xenbus has an optional attribute "maxGrantFrames" -->
          <group>
            <attribute name="type">
              <value>xenbus</value>
            </attribute>
            <optional>
              <attribute name="maxGrantFrames">
                <ref name="unsignedInt"/>
              </attribute>
            </optional>
            <optional>
              <attribute name="maxEventChannels">
                <ref name="unsignedInt"/>
              </attribute>
            </optional>
          </group>
        </choice>
        <optional>
          <element name="driver">
            <optional>
              <attribute name="queues">
                <ref name="unsignedInt"/>
              </attribute>
            </optional>
            <optional>
              <attribute name="cmd_per_lun">
                <ref name="unsignedInt"/>
              </attribute>
            </optional>
            <optional>
              <attribute name="max_sectors">
                <ref name="unsignedInt"/>
              </attribute>
            </optional>
            <optional>
              <ref name="ioeventfd"/>
            </optional>
            <optional>
              <ref name="driverIOThread"/>
            </optional>
            <ref name="virtioOptions"/>
          </element>
        </optional>
      </interleave>
    </element>
  </define>

  <define name="filesystemCommon">
    <interleave>
      <element name="target">
        <attribute name="dir"/>
        <empty/>
      </element>
      <optional>
        <attribute name="accessmode">
          <choice>
            <value>passthrough</value>
            <value>mapped</value>
            <value>squash</value>
          </choice>
        </attribute>
      </optional>
      <optional>
        <attribute name="multidevs">
          <choice>
            <value>default</value>
            <value>remap</value>
            <value>forbid</value>
            <value>warn</value>
          </choice>
        </attribute>
      </optional>
      <optional>
        <attribute name="fmode">
          <ref name="createMode"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="dmode">
          <ref name="createMode"/>
        </attribute>
      </optional>
      <optional>
        <element name="readonly">
          <empty/>
        </element>
      </optional>
      <optional>
        <ref name="deviceBoot"/>
      </optional>
      <optional>
        <ref name="alias"/>
      </optional>
      <optional>
        <ref name="acpi"/>
      </optional>
      <optional>
        <ref name="address"/>
      </optional>
      <optional>
        <element name="space_hard_limit">
          <ref name="scaledInteger"/>
        </element>
      </optional>
      <optional>
        <element name="space_soft_limit">
          <ref name="scaledInteger"/>
        </element>
      </optional>
    </interleave>
  </define>

  <define name="filesystem">
    <element name="filesystem">
      <optional>
        <attribute name="model">
          <choice>
            <value>virtio</value>
            <value>virtio-transitional</value>
            <value>virtio-non-transitional</value>
          </choice>
        </attribute>
      </optional>
      <choice>
        <group>
          <attribute name="type">
            <value>file</value>
          </attribute>
          <interleave>
            <optional>
              <ref name="fsDriver"/>
            </optional>
            <element name="source">
              <attribute name="file">
                <ref name="absFilePath"/>
              </attribute>
              <empty/>
            </element>
            <ref name="filesystemCommon"/>
          </interleave>
        </group>
        <group>
          <attribute name="type">
            <value>block</value>
          </attribute>
          <interleave>
            <optional>
              <ref name="fsDriver"/>
            </optional>
            <element name="source">
              <attribute name="dev">
                <ref name="absFilePath"/>
              </attribute>
              <empty/>
            </element>
            <ref name="filesystemCommon"/>
          </interleave>
        </group>
        <group>
          <!-- type="mount" is default -->
          <optional>
            <attribute name="type">
              <value>mount</value>
            </attribute>
          </optional>
          <interleave>
            <optional>
              <ref name="fsDriver"/>
            </optional>
            <optional>
              <ref name="fsBinary"/>
            </optional>
            <element name="source">
              <choice>
                <group>
                  <attribute name="dir">
                    <ref name="absDirPath"/>
                  </attribute>
                </group>
                <group>
                  <attribute name="socket">
                    <ref name="absFilePath"/>
                  </attribute>
                </group>
              </choice>
              <empty/>
            </element>
            <ref name="filesystemCommon"/>
          </interleave>
        </group>
        <group>
          <optional>
            <attribute name="type">
              <value>bind</value>
            </attribute>
          </optional>
          <interleave>
            <optional>
              <ref name="fsDriver"/>
            </optional>
            <element name="source">
              <attribute name="dir">
                <ref name="absDirPath"/>
              </attribute>
              <empty/>
            </element>
            <ref name="filesystemCommon"/>
          </interleave>
        </group>
        <group>
          <attribute name="type">
            <value>template</value>
          </attribute>
          <interleave>
            <optional>
              <ref name="fsDriver"/>
            </optional>
            <element name="source">
              <attribute name="name">
                <ref name="genericName"/>
              </attribute>
              <empty/>
            </element>
            <ref name="filesystemCommon"/>
          </interleave>
        </group>
        <group>
          <attribute name="type">
            <value>ram</value>
          </attribute>
          <interleave>
            <optional>
              <ref name="fsDriver"/>
            </optional>
            <element name="source">
              <attribute name="usage">
                <ref name="unsignedLong"/>
              </attribute>
              <optional>
                <attribute name="units">
                  <ref name="unit"/>
                </attribute>
              </optional>
              <empty/>
            </element>
            <ref name="filesystemCommon"/>
          </interleave>
        </group>
      </choice>
    </element>
  </define>

  <define name="fsDriver">
    <element name="driver">
      <!-- Annoying inconsistency. "disk" uses "name"
           for this kind of info, and "type" for the
           storage format. We need the latter too, so
           had to invent a new attribute name -->
      <choice>
        <group>
          <optional>
            <attribute name="type">
              <choice>
                <value>path</value>
                <value>handle</value>
                <value>loop</value>
                <value>nbd</value>
                <value>ploop</value>
              </choice>
            </attribute>
          </optional>
          <optional>
            <attribute name="format">
              <ref name="storageFormat"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="wrpolicy">
              <value>immediate</value>
            </attribute>
          </optional>
          <ref name="virtioOptions"/>
        </group>
        <group>
          <attribute name="type">
            <value>virtiofs</value>
          </attribute>
          <optional>
            <attribute name="queue">
              <ref name="unsignedInt"/>
            </attribute>
          </optional>
          <ref name="virtioOptions"/>
        </group>
        <empty/>
      </choice>
    </element>
  </define>
  <define name="fsBinary">
    <element name="binary">
      <optional>
        <attribute name="path">
          <ref name="absFilePath"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="xattr">
          <ref name="virOnOff"/>
        </attribute>
      </optional>
      <interleave>
        <optional>
          <element name="cache">
            <optional>
              <attribute name="mode">
                <choice>
                  <value>none</value>
                  <value>always</value>
                </choice>
              </attribute>
            </optional>
          </element>
        </optional>
        <optional>
          <element name="sandbox">
            <optional>
              <attribute name="mode">
                <choice>
                  <value>namespace</value>
                  <value>chroot</value>
                </choice>
              </attribute>
            </optional>
          </element>
        </optional>
        <optional>
          <element name="lock">
            <optional>
              <attribute name="posix">
                <ref name="virOnOff"/>
              </attribute>
            </optional>
            <optional>
              <attribute name="flock">
                <ref name="virOnOff"/>
              </attribute>
            </optional>
          </element>
        </optional>
        <optional>
          <element name="thread_pool">
            <optional>
              <attribute name="size">
                <data type="integer"/>
              </attribute>
            </optional>
          </element>
        </optional>
      </interleave>
    </element>
  </define>

  <define name="interface-network-attributes">
    <attribute name="network">
      <text/>
    </attribute>
    <optional>
      <attribute name="portgroup">
        <ref name="deviceName"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="portid">
        <ref name="UUID"/>
      </attribute>
    </optional>
  </define>

  <define name="interface-bridge-attributes">
    <attribute name="bridge">
      <data type="string">
        <param name="pattern">[a-zA-Z0-9_\.\-\\:/ ]*</param>
      </data>
    </attribute>
    <optional>
      <attribute name="macTableManager">
        <ref name="macTableManager"/>
      </attribute>
    </optional>
  </define>

  <!--
      An interface description can either be of type bridge in which case
      it will use a bridging source, or of type ethernet which uses a device
      source and a device target instead. They both share a set of interface
      options. FIXME
    -->
  <define name="interface">
    <element name="interface">
      <choice>
        <group>
          <attribute name="type">
            <value>bridge</value>
          </attribute>
          <interleave>
            <optional>
              <element name="source">
                <ref name="interface-bridge-attributes"/>
                <optional>
                  <ref name="interface-network-attributes"/>
                </optional>
                <empty/>
              </element>
            </optional>
            <optional>
              <ref name="virtualPortProfile"/>
            </optional>
            <ref name="interface-options"/>
          </interleave>
        </group>
        <group>
          <attribute name="type">
            <value>ethernet</value>
          </attribute>
          <interleave>
            <optional>
              <element name="source">
                <ref name="interface-ip-info"/>
              </element>
            </optional>
            <ref name="interface-options"/>
          </interleave>
        </group>
        <group>
          <attribute name="type">
            <value>vhostuser</value>
          </attribute>
          <interleave>
            <ref name="unixSocketSource"/>
            <ref name="interface-options"/>
          </interleave>
        </group>
        <group>
          <attribute name="type">
            <value>network</value>
          </attribute>
          <interleave>
            <element name="source">
              <ref name="interface-network-attributes"/>
              <optional>
                <ref name="interface-bridge-attributes"/>
              </optional>
              <empty/>
            </element>
            <optional>
              <ref name="virtualPortProfile"/>
            </optional>
            <ref name="interface-options"/>
          </interleave>
        </group>
        <group>
          <attribute name="type">
            <value>direct</value>
          </attribute>
          <interleave>
            <element name="source">
              <attribute name="dev">
                <ref name="deviceName"/>
              </attribute>
              <optional>
                <attribute name="mode">
                  <ref name="bridgeMode"/>
                </attribute>
              </optional>
              <optional>
                <ref name="interface-network-attributes"/>
              </optional>
              <empty/>
            </element>
            <optional>
              <ref name="virtualPortProfile"/>
            </optional>
            <ref name="interface-options"/>
          </interleave>
        </group>
        <group>
          <attribute name="type">
            <value>user</value>
          </attribute>
          <interleave>
            <optional>
              <element name="source">
                <attribute name="dev">
                  <ref name="deviceName"/>
                </attribute>
                <empty/>
              </element>
            </optional>
            <ref name="interface-options"/>
          </interleave>
        </group>
        <group>
          <attribute name="type">
            <value>internal</value>
          </attribute>
          <interleave>
            <element name="source">
              <attribute name="name">
                <ref name="deviceName"/>
              </attribute>
              <empty/>
            </element>
            <ref name="interface-options"/>
          </interleave>
        </group>
        <group>
          <attribute name="type">
            <choice>
              <value>mcast</value>
              <value>client</value>
            </choice>
          </attribute>
          <interleave>
            <element name="source">
              <attribute name="address">
                <ref name="ipv4Addr"/>
              </attribute>
              <attribute name="port">
                <ref name="PortNumber"/>
              </attribute>
              <empty/>
            </element>
            <ref name="interface-options"/>
          </interleave>
        </group>
        <group>
          <attribute name="type">
            <value>udp</value>
          </attribute>
          <interleave>
            <element name="source">
              <attribute name="address">
                <ref name="ipv4Addr"/>
              </attribute>
              <attribute name="port">
                <ref name="PortNumber"/>
              </attribute>
              <element name="local">
                <attribute name="address">
                  <ref name="ipv4Addr"/>
                </attribute>
                <attribute name="port">
                  <ref name="PortNumber"/>
                </attribute>
                <empty/>
              </element>
            </element>
            <ref name="interface-options"/>
          </interleave>
        </group>
        <group>
          <attribute name="type">
            <value>server</value>
          </attribute>
          <interleave>
            <element name="source">
              <optional>
                <attribute name="address">
                  <ref name="ipv4Addr"/>
                </attribute>
              </optional>
              <attribute name="port">
                <ref name="PortNumber"/>
              </attribute>
              <empty/>
            </element>
            <ref name="interface-options"/>
          </interleave>
        </group>
        <group>
          <attribute name="type">
            <value>hostdev</value>
          </attribute>
          <optional>
            <attribute name="managed">
              <ref name="virYesNo"/>
            </attribute>
          </optional>
          <interleave>
            <element name="source">
              <optional>
                <attribute name="missing">
                  <ref name="virYesNo"/>
                </attribute>
              </optional>
              <choice>
                <group>
                  <ref name="usbproduct"/>
                  <optional>
                    <ref name="usbaddress"/>
                  </optional>
                </group>
                <element name="address">
                  <choice>
                    <group>
                      <attribute name="type">
                        <value>pci</value>
                      </attribute>
                      <ref name="pciaddress"/>
                    </group>
                    <group>
                      <attribute name="type">
                        <value>usb</value>
                      </attribute>
                      <attribute name="bus">
                        <ref name="usbAddr"/>
                      </attribute>
                      <attribute name="device">
                        <ref name="usbAddr"/>
                      </attribute>
                    </group>
                  </choice>
                </element>
              </choice>
            </element>
            <optional>
              <ref name="virtualPortProfile"/>
            </optional>
            <ref name="interface-options"/>
          </interleave>
        </group>

        <group>
          <attribute name="type">
            <value>vdpa</value>
          </attribute>
          <interleave>
            <element name="source">
              <attribute name="dev">
                <ref name="deviceName"/>
              </attribute>
            </element>
            <ref name="interface-options"/>
          </interleave>
        </group>

        <group>
          <attribute name="type">
            <value>null</value>
          </attribute>
          <ref name="interface-options"/>
        </group>

        <group>
          <attribute name="type">
            <value>vds</value>
          </attribute>
          <interleave>
            <element name="source">
              <attribute name="switchid">
                <ref name="UUID"/>
              </attribute>
              <attribute name="portid">
                <data type="long"/>
              </attribute>
              <attribute name="portgroupid">
                <data type="string"/>
              </attribute>
              <attribute name="connectionid">
                <data type="long"/>
              </attribute>
            </element>
            <ref name="interface-options"/>
          </interleave>
        </group>

      </choice>
      <optional>
        <attribute name="trustGuestRxFilters">
          <ref name="virYesNo"/>
        </attribute>
      </optional>
    </element>
  </define>
  <!--
      The interface options possible are:
        - the MAC address
        - the IP address bound to the interface
        - the name of the script used to set up the binding
        - the target device used
        - boot order
        - link state
    -->
  <define name="interface-options">
    <interleave>
      <optional>
        <element name="link">
          <attribute name="state">
            <choice>
              <value>up</value>
              <value>down</value>
            </choice>
          </attribute>
          <empty/>
        </element>
      </optional>
      <optional>
        <ref name="mtu"/>
      </optional>
      <optional>
        <ref name="coalesce"/>
      </optional>
      <optional>
        <element name="target">
          <attribute name="dev">
            <ref name="deviceName"/>
          </attribute>
          <optional>
            <attribute name="managed">
              <ref name="virYesNo"/>
            </attribute>
          </optional>
          <empty/>
        </element>
      </optional>
      <optional>
        <element name="guest">
          <interleave>
            <optional>
              <attribute name="dev">
                <ref name="deviceName"/>
              </attribute>
            </optional>
            <optional>
              <attribute name="actual">
                <ref name="deviceName"/>
              </attribute>
            </optional>
          </interleave>
          <empty/>
        </element>
      </optional>
      <optional>
        <element name="mac">
          <attribute name="address">
            <ref name="uniMacAddr"/>
          </attribute>
          <optional>
            <attribute name="type">
              <choice>
                <value>generated</value>
                <value>static</value>
              </choice>
            </attribute>
          </optional>
          <optional>
            <attribute name="check">
              <ref name="virYesNo"/>
            </attribute>
          </optional>
          <empty/>
        </element>
      </optional>
      <ref name="interface-ip-info"/>
      <ref name="interface-port-forwards"/>
      <optional>
        <element name="script">
          <attribute name="path">
            <ref name="filePath"/>
          </attribute>
          <empty/>
        </element>
      </optional>
      <optional>
        <element name="downscript">
          <attribute name="path">
            <ref name="filePath"/>
          </attribute>
          <empty/>
        </element>
      </optional>
      <optional>
        <element name="backenddomain">
          <attribute name="name">
            <ref name="objectNameWithSlash"/>
          </attribute>
          <empty/>
        </element>
      </optional>
      <optional>
        <element name="model">
          <attribute name="type">
            <data type="string">
              <param name="pattern">[a-zA-Z0-9\-_]+</param>
            </data>
          </attribute>
          <empty/>
        </element>
      </optional>
      <optional>
        <element name="backend">
          <optional>
            <attribute name="type">
              <choice>
                <value>passt</value>
              </choice>
            </attribute>
          </optional>
          <optional>
            <attribute name="tap">
              <ref name="absFilePath"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="vhost">
              <ref name="absFilePath"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="logFile">
              <ref name="absFilePath"/>
            </attribute>
          </optional>
        </element>
      </optional>
      <optional>
        <element name="driver">
          <choice>
            <group>
              <attribute name="name">
                <choice>
                  <value>kvm</value>
                  <value>vfio</value>
                  <value>xen</value>
                </choice>
              </attribute>
            </group>
            <group>
              <optional>
                <attribute name="name">
                  <choice>
                    <value>qemu</value>
                    <value>vhost</value>
                  </choice>
                </attribute>
              </optional>
              <optional>
                <attribute name="queues">
                  <ref name="positiveInteger"/>
                </attribute>
              </optional>
              <optional>
                <attribute name="rx_queue_size">
                  <ref name="positiveInteger"/>
                </attribute>
              </optional>
              <optional>
                <attribute name="tx_queue_size">
                  <ref name="positiveInteger"/>
                </attribute>
              </optional>
              <optional>
                <attribute name="txmode">
                  <choice>
                    <value>iothread</value>
                    <value>timer</value>
                  </choice>
                </attribute>
              </optional>
              <optional>
                <ref name="ioeventfd"/>
              </optional>
              <optional>
                <ref name="event_idx"/>
              </optional>
            </group>
          </choice>
          <ref name="virtioOptions"/>
          <interleave>
            <optional>
              <element name="host">
                <optional>
                  <attribute name="csum">
                    <ref name="virOnOff"/>
                  </attribute>
                </optional>
                <optional>
                  <attribute name="gso">
                    <ref name="virOnOff"/>
                  </attribute>
                </optional>
                <optional>
                  <attribute name="tso4">
                    <ref name="virOnOff"/>
                  </attribute>
                </optional>
                <optional>
                  <attribute name="tso6">
                    <ref name="virOnOff"/>
                  </attribute>
                </optional>
                <optional>
                  <attribute name="ecn">
                    <ref name="virOnOff"/>
                  </attribute>
                </optional>
                <optional>
                  <attribute name="ufo">
                    <ref name="virOnOff"/>
                  </attribute>
                </optional>
                <optional>
                  <attribute name="mrg_rxbuf">
                    <ref name="virOnOff"/>
                  </attribute>
                </optional>
              </element>
            </optional>
            <optional>
              <element name="guest">
                <optional>
                  <attribute name="csum">
                    <ref name="virOnOff"/>
                  </attribute>
                </optional>
                <optional>
                  <attribute name="tso4">
                    <ref name="virOnOff"/>
                  </attribute>
                </optional>
                <optional>
                  <attribute name="tso6">
                    <ref name="virOnOff"/>
                  </attribute>
                </optional>
                <optional>
                  <attribute name="ecn">
                    <ref name="virOnOff"/>
                  </attribute>
                </optional>
                <optional>
                  <attribute name="ufo">
                    <ref name="virOnOff"/>
                  </attribute>
                </optional>
              </element>
            </optional>
            <optional>
              <attribute name="rss">
                <ref name="virOnOff"/>
              </attribute>
            </optional>
            <optional>
              <attribute name="rss_hash_report">
                <ref name="virOnOff"/>
              </attribute>
            </optional>
          </interleave>
        </element>
      </optional>
      <optional>
        <ref name="alias"/>
      </optional>
      <optional>
        <ref name="acpi"/>
      </optional>
      <optional>
        <ref name="address"/>
      </optional>
      <optional>
        <element name="filterref">
          <ref name="filterref-node-attributes"/>
        </element>
      </optional>
      <optional>
        <element name="tune">
          <optional>
            <!-- size of send buffer for network tap devices -->
            <element name="sndbuf">
              <ref name="unsignedInt"/>
            </element>
          </optional>
        </element>
      </optional>
      <optional>
        <ref name="deviceBoot"/>
      </optional>
      <optional>
        <ref name="rom"/>
      </optional>
      <optional>
        <ref name="bandwidth"/>
      </optional>
      <optional>
        <ref name="vlan"/>
      </optional>
      <optional>
        <ref name="portOptions"/>
      </optional>
      <optional>
        <ref name="teaming"/>
      </optional>
    </interleave>
  </define>

  <!--
      All ip-related info for either the host or guest side of an interface
  -->
  <define name="interface-ip-info">
    <interleave>
      <zeroOrMore>
        <element name="ip">
          <attribute name="address">
            <ref name="ipAddr"/>
          </attribute>
          <optional>
            <attribute name="family">
              <ref name="addr-family"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="prefix">
              <ref name="ipPrefix"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="peer">
              <ref name="ipAddr"/>
            </attribute>
          </optional>
          <empty/>
        </element>
      </zeroOrMore>
      <zeroOrMore>
        <ref name="route"/>
      </zeroOrMore>
    </interleave>
  </define>

  <define name="interface-port-forwards">
    <zeroOrMore>
      <element name="portForward">
        <attribute name="proto">
          <choice>
            <value>tcp</value>
            <value>udp</value>
          </choice>
        </attribute>
        <optional>
          <attribute name="address">
            <ref name="ipAddr"/>
          </attribute>
        </optional>
        <optional>
          <attribute name="dev">
            <ref name="deviceName"/>
          </attribute>
        </optional>
        <interleave>
          <zeroOrMore>
            <element name="range">
              <attribute name="start">
                <ref name="PortNumber"/>
              </attribute>
              <optional>
                <attribute name="end">
                  <ref name="PortNumber"/>
                </attribute>
              </optional>
              <optional>
                <attribute name="to">
                  <ref name="PortNumber"/>
                </attribute>
              </optional>
              <optional>
                <attribute name="exclude">
                  <ref name="virYesNo"/>
                </attribute>
              </optional>
            </element>
          </zeroOrMore>
        </interleave>
      </element>
    </zeroOrMore>
  </define>

  <define name="teaming">
    <element name="teaming">
      <choice>
        <group>
          <attribute name="type">
            <value>persistent</value>
          </attribute>
        </group>
        <group>
          <attribute name="type">
            <value>transient</value>
          </attribute>
          <attribute name="persistent">
            <ref name="aliasName"/>
          </attribute>
        </group>
      </choice>
    </element>
  </define>

  <!--
      An emulator description is just a path to the binary used for the task
    -->
  <define name="emulator">
    <element name="emulator">
      <ref name="absFilePath"/>
    </element>
  </define>
  <!--
      A graphic description (SPICE, VNC, SDL, ...)
    -->
  <define name="graphic">
    <element name="graphics">
      <choice>
        <group>
          <attribute name="type">
            <value>sdl</value>
          </attribute>
          <optional>
            <attribute name="display">
              <text/>
            </attribute>
          </optional>
          <optional>
            <attribute name="xauth">
              <text/>
            </attribute>
          </optional>
          <optional>
            <attribute name="fullscreen">
              <ref name="virYesNo"/>
            </attribute>
          </optional>
          <optional>
            <element name="gl">
              <attribute name="enable">
                <ref name="virYesNo"/>
              </attribute>
              <empty/>
            </element>
          </optional>
        </group>
        <group>
          <attribute name="type">
            <value>vnc</value>
          </attribute>
          <choice>
            <group>
              <optional>
                <attribute name="port">
                  <ref name="PortNumber"/>
                </attribute>
              </optional>
              <optional>
                <attribute name="autoport">
                  <ref name="virYesNo"/>
                </attribute>
              </optional>
              <optional>
                <attribute name="websocket">
                  <ref name="PortNumber"/>
                </attribute>
              </optional>
              <optional>
                <attribute name="listen">
                  <ref name="addrIPorName"/>
                </attribute>
              </optional>
              <optional>
                <attribute name="sharePolicy">
                  <choice>
                    <value>allow-exclusive</value>
                    <value>force-shared</value>
                    <value>ignore</value>
                  </choice>
                </attribute>
              </optional>
              <optional>
                <attribute name="powerControl">
                  <ref name="virYesNo"/>
                </attribute>
              </optional>
            </group>
            <group>
              <optional>
                <attribute name="socket">
                  <ref name="absFilePath"/>
                </attribute>
              </optional>
            </group>
          </choice>
          <optional>
            <attribute name="passwd">
              <text/>
            </attribute>
          </optional>
          <optional>
            <attribute name="keymap">
              <text/>
            </attribute>
          </optional>
          <optional>
            <attribute name="passwdValidTo">
              <data type="dateTime"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="connected">
              <value>keep</value>
            </attribute>
          </optional>
          <interleave>
            <optional>
              <element name="audio">
                <attribute name="id">
                  <ref name="uint8"/>
                </attribute>
              </element>
            </optional>
            <ref name="listenElements"/>
          </interleave>
        </group>
        <group>
          <attribute name="type">
            <value>spice</value>
          </attribute>
          <optional>
            <attribute name="port">
              <ref name="PortNumber"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="tlsPort">
              <ref name="PortNumber"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="autoport">
              <ref name="virYesNo"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="listen">
              <ref name="addrIPorName"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="passwd">
              <text/>
            </attribute>
          </optional>
          <optional>
            <attribute name="keymap">
              <text/>
            </attribute>
          </optional>
          <optional>
            <attribute name="passwdValidTo">
              <data type="dateTime"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="connected">
              <choice>
                <value>fail</value>
                <value>disconnect</value>
                <value>keep</value>
              </choice>
            </attribute>
          </optional>
          <optional>
            <attribute name="defaultMode">
              <choice>
                <value>any</value>
                <value>secure</value>
                <value>insecure</value>
              </choice>
            </attribute>
          </optional>
          <interleave>
            <ref name="listenElements"/>
            <zeroOrMore>
              <element name="channel">
                <attribute name="name">
                  <choice>
                    <value>main</value>
                    <value>display</value>
                    <value>inputs</value>
                    <value>cursor</value>
                    <value>playback</value>
                    <value>record</value>
                    <value>smartcard</value>
                    <value>usbredir</value>
                  </choice>
                </attribute>
                <attribute name="mode">
                  <choice>
                    <value>any</value>
                    <value>secure</value>
                    <value>insecure</value>
                  </choice>
                </attribute>
                <empty/>
              </element>
            </zeroOrMore>
            <optional>
              <element name="image">
                <attribute name="compression">
                  <choice>
                    <value>auto_glz</value>
                    <value>auto_lz</value>
                    <value>quic</value>
                    <value>glz</value>
                    <value>lz</value>
                    <value>off</value>
                  </choice>
                </attribute>
                <empty/>
              </element>
            </optional>
            <optional>
              <element name="jpeg">
                <attribute name="compression">
                  <choice>
                    <value>auto</value>
                    <value>never</value>
                    <value>always</value>
                  </choice>
                </attribute>
                <empty/>
              </element>
            </optional>
            <optional>
              <element name="zlib">
                <attribute name="compression">
                  <choice>
                    <value>auto</value>
                    <value>never</value>
                    <value>always</value>
                  </choice>
                </attribute>
                <empty/>
              </element>
            </optional>
            <optional>
              <element name="playback">
                <attribute name="compression">
                  <ref name="virOnOff"/>
                </attribute>
                <empty/>
              </element>
            </optional>
            <optional>
              <element name="streaming">
                <attribute name="mode">
                  <choice>
                    <value>filter</value>
                    <value>all</value>
                    <value>off</value>
                  </choice>
                </attribute>
                <empty/>
              </element>
            </optional>
            <optional>
              <ref name="clipboard"/>
            </optional>
            <optional>
              <ref name="mousemode"/>
            </optional>
            <optional>
              <element name="filetransfer">
                <attribute name="enable">
                  <ref name="virYesNo"/>
                </attribute>
                <empty/>
              </element>
            </optional>
            <optional>
              <element name="gl">
                <attribute name="enable">
                  <ref name="virYesNo"/>
                </attribute>
                <optional>
                  <attribute name="rendernode">
                    <ref name="absFilePath"/>
                  </attribute>
                </optional>
                <empty/>
              </element>
            </optional>
          </interleave>
        </group>
        <group>
          <attribute name="type">
            <value>dbus</value>
          </attribute>
          <optional>
            <choice>
              <group>
                <attribute name="address">
                  <ref name="dbusAddr"/>
                </attribute>
              </group>
              <group>
                <attribute name="p2p">
                  <ref name="virYesNo"/>
                </attribute>
              </group>
            </choice>
          </optional>
          <interleave>
            <optional>
              <element name="gl">
                <attribute name="enable">
                  <ref name="virYesNo"/>
                </attribute>
                <optional>
                  <attribute name="rendernode">
                    <ref name="absFilePath"/>
                  </attribute>
                </optional>
              </element>
            </optional>
            <optional>
              <element name="audio">
                <attribute name="id">
                  <ref name="uint8"/>
                </attribute>
              </element>
            </optional>
          </interleave>
        </group>
        <group>
          <attribute name="type">
            <value>rdp</value>
          </attribute>
          <optional>
            <attribute name="port">
              <ref name="PortNumber"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="autoport">
              <ref name="virYesNo"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="replaceUser">
              <ref name="virYesNo"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="multiUser">
              <ref name="virYesNo"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="listen">
              <ref name="addrIPorName"/>
            </attribute>
          </optional>
          <ref name="listenElements"/>
        </group>
        <group>
          <attribute name="type">
            <value>desktop</value>
          </attribute>
          <optional>
            <attribute name="display">
              <text/>
            </attribute>
          </optional>
          <optional>
            <attribute name="fullscreen">
              <ref name="virYesNo"/>
            </attribute>
          </optional>
        </group>
        <group>
          <attribute name="type">
            <value>egl-headless</value>
          </attribute>
          <optional>
            <element name="gl">
              <optional>
                <attribute name="rendernode">
                  <ref name="absFilePath"/>
                </attribute>
              </optional>
            </element>
          </optional>
        </group>
      </choice>
    </element>
  </define>

  <define name="clipboard">
    <element name="clipboard">
      <attribute name="copypaste">
        <ref name="virYesNo"/>
      </attribute>
      <empty/>
    </element>
  </define>
  <define name="mousemode">
    <element name="mouse">
      <attribute name="mode">
        <choice>
          <value>server</value>
          <value>client</value>
        </choice>
      </attribute>
      <empty/>
    </element>
  </define>
  <define name="listenElements">
    <zeroOrMore>
      <element name="listen">
        <choice>
          <group>
            <attribute name="type">
              <value>address</value>
            </attribute>
            <optional>
              <attribute name="address">
                <ref name="addrIPorName"/>
              </attribute>
            </optional>
          </group>
          <group>
            <attribute name="type">
              <value>network</value>
            </attribute>
            <attribute name="network">
              <text/>
            </attribute>
            <optional>
              <attribute name="address">
                <ref name="addrIPorName"/>
              </attribute>
            </optional>
          </group>
          <group>
            <attribute name="type">
              <value>socket</value>
            </attribute>
            <optional>
              <attribute name="socket">
                <ref name="absFilePath"/>
              </attribute>
            </optional>
          </group>
          <group>
            <attribute name="type">
              <value>none</value>
            </attribute>
          </group>
        </choice>
      </element>
    </zeroOrMore>
  </define>
  <!--
     A video adapter description, allowing configuration of device
     model, number of virtual heads, video ram size, and for qxl
     both ram bar sizes.
   -->
  <define name="video">
    <element name="video">
      <interleave>
        <optional>
          <element name="driver">
            <optional>
              <ref name="virtioOptions"/>
            </optional>
            <optional>
              <attribute name="name">
                <choice>
                  <value>qemu</value>
                  <value>vhostuser</value>
                </choice>
              </attribute>
            </optional>
            <optional>
              <attribute name="vgaconf">
                <choice>
                  <value>io</value>
                  <value>on</value>
                  <value>off</value>
                </choice>
              </attribute>
            </optional>
          </element>
        </optional>
        <optional>
          <element name="model">
            <choice>
              <attribute name="type">
                <choice>
                  <value>vga</value>
                  <value>cirrus</value>
                  <value>vmvga</value>
                  <value>xen</value>
                  <value>vbox</value>
                  <value>virtio</value>
                  <value>gop</value>
                  <value>none</value>
                  <value>bochs</value>
                  <value>ramfb</value>
                </choice>
              </attribute>
              <group>
                <attribute name="type">
                  <value>qxl</value>
                </attribute>
                <optional>
                  <attribute name="ram">
                    <ref name="unsignedInt"/>
                  </attribute>
                </optional>
                <optional>
                  <attribute name="vgamem">
                    <ref name="unsignedInt"/>
                  </attribute>
                </optional>
                <optional>
                  <attribute name="vram64">
                    <ref name="unsignedInt"/>
                  </attribute>
                </optional>
              </group>
            </choice>
            <optional>
              <attribute name="vram">
                <ref name="unsignedInt"/>
              </attribute>
            </optional>
            <optional>
              <attribute name="heads">
                <ref name="unsignedInt"/>
              </attribute>
            </optional>
            <optional>
              <attribute name="primary">
                <ref name="virYesNo"/>
              </attribute>
            </optional>
            <optional>
              <attribute name="blob">
                <ref name="virOnOff"/>
              </attribute>
            </optional>
            <optional>
              <element name="acceleration">
                <optional>
                  <attribute name="accel3d">
                    <ref name="virYesNo"/>
                  </attribute>
                </optional>
                <optional>
                  <attribute name="accel2d">
                    <ref name="virYesNo"/>
                  </attribute>
                </optional>
                <optional>
                  <attribute name="rendernode">
                    <ref name="absFilePath"/>
                  </attribute>
                </optional>
              </element>
            </optional>
            <optional>
              <element name="resolution">
                <attribute name="x">
                  <ref name="unsignedInt"/>
                </attribute>
                <attribute name="y">
                  <ref name="unsignedInt"/>
                </attribute>
              </element>
            </optional>
          </element>
        </optional>
        <optional>
          <ref name="alias"/>
        </optional>
        <optional>
          <ref name="acpi"/>
        </optional>
        <optional>
          <ref name="address"/>
        </optional>
      </interleave>
    </element>
  </define>
  <!--
      When a certain event happens, multiple policies can be applied
      depends on what happened:
    -->
  <define name="events">
    <interleave>
      <optional>
        <element name="on_reboot">
          <ref name="offOptions"/>
        </element>
      </optional>
      <optional>
        <element name="on_poweroff">
          <ref name="offOptions"/>
        </element>
      </optional>
      <optional>
        <element name="on_crash">
          <ref name="crashOptions"/>
        </element>
      </optional>
      <optional>
        <element name="on_lockfailure">
          <ref name="lockfailureOptions"/>
        </element>
      </optional>
    </interleave>
  </define>
  <!--
      Options when a domain terminates:
      destroy: The domain is cleaned up
      restart: A new domain is started in place of the old one
      preserve: The domain will remain in memory until it is destroyed manually
      rename-restart: a variant of the previous one but where the old domain is
                      renamed before being saved to allow a restart
    -->
  <define name="offOptions">
    <choice>
      <value>destroy</value>
      <value>restart</value>
      <value>preserve</value>
      <value>rename-restart</value>
    </choice>
  </define>
  <!--
      Options when a domain crashes:
      destroy: The domain is cleaned up
      restart: A new domain is started in place of the old one
      preserve: The domain will remain in memory until it is destroyed manually
      rename-restart: a variant of the previous one but where the old domain is
                      renamed before being saved to allow a restart
      coredump-destroy: The crashed domain's core will be dumped, and then the
                        domain will be terminated completely and all resources
                        released
      coredump-restart: The crashed domain's core will be dumped, and then the
                        domain will be restarted with the same configuration
    -->
  <define name="crashOptions">
    <choice>
      <value>destroy</value>
      <value>restart</value>
      <value>preserve</value>
      <value>rename-restart</value>
      <value>coredump-destroy</value>
      <value>coredump-restart</value>
    </choice>
  </define>
  <!--
      Options when resource locks are lost:
      poweroff: power off the domain
      restart: power off the domain and start it up again to reacquire the
               locks
      pause: pause the execution of the domain so that it can be manually
             resumed when lock issues are solved
      ignore: keep the domain running
  -->
  <define name="lockfailureOptions">
    <choice>
      <value>poweroff</value>
      <value>restart</value>
      <value>pause</value>
      <value>ignore</value>
    </choice>
  </define>
  <!--
      Control ACPI sleep states (dis)allowed for the domain
      For each of the states the following rules apply:
      on: the state will be forcefully enabled
      off: the state will be forcefully disabled
      not specified: hypervisor will be left to decide its defaults
  -->
  <define name="pm">
    <element name="pm">
      <interleave>
        <optional>
          <element name="suspend-to-mem">
            <ref name="suspendChoices"/>
          </element>
        </optional>
        <optional>
          <element name="suspend-to-disk">
            <ref name="suspendChoices"/>
          </element>
        </optional>
      </interleave>
      <empty/>
    </element>
  </define>
  <define name="suspendChoices">
    <optional>
      <attribute name="enabled">
        <ref name="virYesNo"/>
      </attribute>
    </optional>
  </define>
  <!--
      Specific setup for a qemu emulated character device.  Note: this
      definition doesn't fully specify the constraints on this node.
    -->
  <define name="qemucdev">
    <ref name="qemucdevSrcType"/>
    <optional>
      <attribute name="tty">
        <ref name="absFilePath"/>
      </attribute>
    </optional>
    <interleave>
      <ref name="qemucdevSrcDef"/>
      <optional>
        <ref name="qemucdevTgtDef"/>
      </optional>
      <optional>
        <ref name="alias"/>
      </optional>
      <optional>
        <ref name="acpi"/>
      </optional>
      <optional>
        <ref name="address"/>
      </optional>
    </interleave>
  </define>

  <define name="qemucdevConsoleTgtType">
    <attribute name="type">
      <choice>
        <value>xen</value>
        <value>serial</value>
        <value>uml</value> <!-- NOT USED ANYMORE -->
        <value>virtio</value>
        <value>lxc</value>
        <value>openvz</value>
        <value>sclp</value>
        <value>sclplm</value>
      </choice>
    </attribute>
  </define>

  <define name="qemucdevSerialTgtType">
    <attribute name="type">
      <choice>
        <value>isa-serial</value>
        <value>usb-serial</value>
        <value>pci-serial</value>
        <value>spapr-vio-serial</value>
        <value>system-serial</value>
        <value>sclp-serial</value>
        <value>isa-debug</value>
      </choice>
    </attribute>
  </define>

  <define name="qemucdevSerialTgtModel">
    <element name="model">
      <attribute name="name">
        <choice>
          <value>isa-serial</value>
          <value>usb-serial</value>
          <value>pci-serial</value>
          <value>spapr-vty</value>
          <value>pl011</value>
          <value>16550a</value>
          <value>sclpconsole</value>
          <value>sclplmconsole</value>
          <value>isa-debugcon</value>
        </choice>
      </attribute>
    </element>
  </define>

  <define  name="qemucdevTgtDef">
    <element name="target">
      <interleave>
        <choice>
          <optional>
            <ref name="qemucdevConsoleTgtType"/>
          </optional>
          <optional>
            <ref name="qemucdevSerialTgtType"/>
          </optional>
        </choice>
        <optional>
          <attribute name="port"/>
        </optional>
        <optional>
          <ref name="qemucdevSerialTgtModel"/>
        </optional>
      </interleave>
    </element>
  </define>

  <define name="qemucdevSrcTypeChoice">
    <choice>
      <value>dev</value>
      <value>file</value>
      <value>pipe</value>
      <value>unix</value>
      <value>tcp</value>
      <value>udp</value>
      <value>null</value>
      <value>stdio</value>
      <value>vc</value>
      <value>pty</value>
      <value>spicevmc</value>
      <value>spiceport</value>
      <value>nmdm</value>
      <value>qemu-vdagent</value>
      <value>dbus</value>
    </choice>
  </define>

  <define name="usbdevfilter">
    <element name="usbdev">
      <attribute name="allow">
        <ref name="virYesNo"/>
      </attribute>
      <optional>
        <attribute name="class">
          <choice>
            <ref name="usbClass"/>
            <ref name="usbIdDefault"/>
          </choice>
        </attribute>
      </optional>
      <optional>
        <attribute name="vendor">
          <choice>
            <ref name="usbId"/>
            <ref name="usbIdDefault"/>
          </choice>
        </attribute>
      </optional>
      <optional>
        <attribute name="product">
          <choice>
            <ref name="usbId"/>
            <ref name="usbIdDefault"/>
          </choice>
        </attribute>
      </optional>
      <optional>
        <attribute name="version">
          <choice>
            <ref name="usbVersion"/>
            <ref name="usbIdDefault"/>
          </choice>
        </attribute>
      </optional>
    </element>
  </define>

  <define name="qemucdevSrcType">
    <attribute name="type">
      <ref name="qemucdevSrcTypeChoice"/>
    </attribute>
  </define>

  <define name="qemucdevSrcDef">
    <interleave>
      <zeroOrMore>
        <element name="source">
          <optional>
            <attribute name="mode"/>
          </optional>
          <optional>
            <attribute name="path"/>
          </optional>
          <optional>
            <attribute name="host"/>
          </optional>
          <optional>
            <attribute name="service"/>
          </optional>
          <optional>
            <attribute name="channel"/>
          </optional>
          <optional>
            <attribute name="master"/>
          </optional>
          <optional>
            <attribute name="slave"/>
          </optional>
          <optional>
            <attribute name="append">
              <ref name="virOnOff"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="tls">
              <ref name="virYesNo"/>
            </attribute>
          </optional>
          <optional>
            <ref name="reconnect"/>
          </optional>
          <interleave>
            <zeroOrMore>
              <ref name="devSeclabel"/>
            </zeroOrMore>
            <optional>
              <ref name="clipboard"/>
            </optional>
            <optional>
              <ref name="mousemode"/>
            </optional>
          </interleave>
        </element>
      </zeroOrMore>
      <optional>
        <element name="protocol">
          <optional>
            <attribute name="type">
              <choice>
                <value>raw</value>
                <value>telnet</value>
                <value>telnets</value>
                <value>tls</value>
              </choice>
            </attribute>
          </optional>
        </element>
      </optional>
      <optional>
        <element name="log">
          <attribute name="file">
            <ref name="absFilePath"/>
          </attribute>
          <optional>
            <attribute name="append">
              <ref name="virOnOff"/>
            </attribute>
          </optional>
        </element>
      </optional>
    </interleave>
  </define>
  <!--
      The description for a console
      just a tty device
    -->
  <define name="console">
    <element name="console">
      <choice>
        <group>
          <optional>
            <attribute name="tty">
              <ref name="absFilePath"/>
            </attribute>
          </optional>
          <empty/>
        </group>
        <ref name="qemucdev"/>
      </choice>
    </element>
  </define>
  <define name="codec">
    <element name="codec">
      <attribute name="type">
        <choice>
          <value>duplex</value>
          <value>micro</value>
          <value>output</value>
        </choice>
      </attribute>
    </element>
  </define>
  <define name="sound">
    <element name="sound">
      <attribute name="model">
        <choice>
          <value>sb16</value>
          <value>es1370</value>
          <value>pcspk</value>
          <value>ac97</value>
          <value>ich6</value>
          <value>ich7</value>
          <value>ich9</value>
          <value>usb</value>
        </choice>
      </attribute>
      <interleave>
        <optional>
          <ref name="alias"/>
        </optional>
        <optional>
          <ref name="acpi"/>
        </optional>
        <optional>
          <ref name="address"/>
        </optional>
        <optional>
          <element name="audio">
            <attribute name="id">
              <ref name="uint8"/>
            </attribute>
          </element>
        </optional>
        <zeroOrMore>
          <ref name="codec"/>
        </zeroOrMore>
      </interleave>
    </element>
  </define>

  <define name="audiocommonattr">
    <optional>
      <attribute name="mixingEngine">
        <ref name="virYesNo"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="fixedSettings">
        <ref name="virYesNo"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="voices">
        <ref name="uint32"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="bufferLength">
        <ref name="uint32"/>
      </attribute>
    </optional>
  </define>

  <define name="audiocommonchild">
    <optional>
      <element name="settings">
        <optional>
          <attribute name="frequency">
            <ref name="uint32"/>
          </attribute>
        </optional>
        <optional>
          <attribute name="channels">
            <ref name="uint32"/>
          </attribute>
        </optional>
        <optional>
          <attribute name="format">
            <choice>
              <value>s8</value>
              <value>u8</value>
              <value>s16</value>
              <value>u16</value>
              <value>s32</value>
              <value>u32</value>
              <value>f32</value>
            </choice>
          </attribute>
        </optional>
      </element>
    </optional>
  </define>

  <define name="audionone">
    <ref name="audiocommonattr"/>
    <ref name="audiocommonchild"/>
  </define>

  <define name="audioalsa">
    <ref name="audiocommonattr"/>
    <optional>
      <attribute name="dev">
        <ref name="filePath"/>
      </attribute>
    </optional>
    <ref name="audiocommonchild"/>
  </define>

  <define name="audiocoreaudio">
    <ref name="audiocommonattr"/>
    <optional>
      <attribute name="bufferCount">
        <ref name="uint32"/>
      </attribute>
    </optional>
    <ref name="audiocommonchild"/>
  </define>

  <define name="audiojack">
    <ref name="audiocommonattr"/>
    <optional>
      <attribute name="serverName">
        <data type="string"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="clientName">
        <data type="string"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="connectPorts">
        <data type="string"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="exactName">
        <ref name="virYesNo"/>
      </attribute>
    </optional>
    <ref name="audiocommonchild"/>
  </define>

  <define name="audiooss">
    <ref name="audiocommonattr"/>
    <optional>
      <attribute name="dev">
        <ref name="deviceName"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="bufferCount">
        <ref name="uint32"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="tryPoll">
        <ref name="virYesNo"/>
      </attribute>
    </optional>
    <ref name="audiocommonchild"/>
  </define>

  <define name="audiopulseaudio">
    <ref name="audiocommonattr"/>
    <optional>
      <attribute name="name">
        <data type="string"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="streamName">
        <data type="string"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="latency">
        <ref name="uint32"/>
      </attribute>
    </optional>
    <ref name="audiocommonchild"/>
  </define>

  <define name="audiosdl">
    <ref name="audiocommonattr"/>
    <optional>
      <attribute name="bufferCount">
        <ref name="uint32"/>
      </attribute>
    </optional>
    <ref name="audiocommonchild"/>
  </define>

  <define name="audiospice">
    <ref name="audiocommonattr"/>
    <ref name="audiocommonchild"/>
  </define>

  <define name="audiofile">
    <ref name="audiocommonattr"/>
    <ref name="audiocommonchild"/>
  </define>

  <define name="audiodbus">
    <ref name="audiocommonattr"/>
    <ref name="audiocommonchild"/>
  </define>

  <define name="audio">
    <element name="audio">
      <attribute name="id">
        <ref name="uint8"/>
      </attribute>
      <optional>
        <attribute name="timerPeriod">
          <ref name="uint32"/>
        </attribute>
      </optional>
      <choice>
        <group>
          <attribute name="type">
            <value>none</value>
          </attribute>
          <interleave>
            <optional>
              <element name="input">
                <ref name="audionone"/>
              </element>
            </optional>
            <optional>
              <element name="output">
                <ref name="audionone"/>
              </element>
            </optional>
          </interleave>
        </group>
        <group>
          <attribute name="type">
            <value>dbus</value>
          </attribute>
          <interleave>
            <optional>
              <element name="input">
                <ref name="audiodbus"/>
              </element>
            </optional>
            <optional>
              <element name="output">
                <ref name="audiodbus"/>
              </element>
            </optional>
          </interleave>
        </group>
        <group>
          <attribute name="type">
            <value>alsa</value>
          </attribute>
          <interleave>
            <optional>
              <element name="input">
                <ref name="audioalsa"/>
              </element>
            </optional>
            <optional>
              <element name="output">
                <ref name="audioalsa"/>
              </element>
            </optional>
          </interleave>
        </group>
        <group>
          <attribute name="type">
            <value>coreaudio</value>
          </attribute>
          <interleave>
            <optional>
              <element name="input">
                <ref name="audiocoreaudio"/>
              </element>
            </optional>
            <optional>
              <element name="output">
                <ref name="audiocoreaudio"/>
              </element>
            </optional>
          </interleave>
        </group>
        <group>
          <attribute name="type">
            <value>jack</value>
          </attribute>
          <interleave>
            <optional>
              <element name="input">
                <ref name="audiojack"/>
              </element>
            </optional>
            <optional>
              <element name="output">
                <ref name="audiojack"/>
              </element>
            </optional>
          </interleave>
        </group>
        <group>
          <attribute name="type">
            <choice>
              <value>oss</value>
            </choice>
          </attribute>
          <optional>
            <attribute name="tryMMap">
              <ref name="virYesNo"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="exclusive">
              <ref name="virYesNo"/>
            </attribute>
          </optional>
          <optional>
            <attribute name="dspPolicy">
              <data type="int"/>
            </attribute>
          </optional>
          <interleave>
            <optional>
              <element name="input">
                <ref name="audiooss"/>
              </element>
            </optional>
            <optional>
              <element name="output">
                <ref name="audiooss"/>
              </element>
            </optional>
          </interleave>
        </group>
        <group>
          <attribute name="type">
            <value>pulseaudio</value>
          </attribute>
          <optional>
            <attribute name="serverName">
              <data type="string"/>
            </attribute>
          </optional>
          <interleave>
            <optional>
              <element name="input">
                <ref name="audiopulseaudio"/>
              </element>
            </optional>
            <optional>
              <element name="output">
                <ref name="audiopulseaudio"/>
              </element>
            </optional>
          </interleave>
        </group>
        <group>
          <attribute name="type">
            <value>sdl</value>
          </attribute>
          <optional>
            <attribute name="driver">
              <choice>
                <value>esd</value>
                <value>alsa</value>
                <value>arts</value>
                <value>pulseaudio</value>
              </choice>
            </attribute>
          </optional>
          <interleave>
            <optional>
              <element name="input">
                <ref name="audiosdl"/>
              </element>
            </optional>
            <optional>
              <element name="output">
                <ref name="audiosdl"/>
              </element>
            </optional>
          </interleave>
        </group>
        <group>
          <attribute name="type">
            <value>spice</value>
          </attribute>
          <interleave>
            <optional>
              <element name="input">
                <ref name="audiospice"/>
              </element>
            </optional>
            <optional>
              <element name="output">
                <ref name="audiospice"/>
              </element>
            </optional>
          </interleave>
        </group>
        <group>
          <attribute name="type">
            <value>file</value>
          </attribute>
          <optional>
            <attribute name="path">
              <ref name="filePath"/>
            </attribute>
          </optional>
          <interleave>
            <optional>
              <element name="input">
                <ref name="audiofile"/>
              </element>
            </optional>
            <optional>
              <element name="output">
                <ref name="audiofile"/>
              </element>
            </optional>
          </interleave>
        </group>
      </choice>
    </element>
  </define>
  <define name="watchdog">
    <element name="watchdog">
      <interleave>
        <attribute name="model">
          <choice>
            <value>i6300esb</value>
            <value>ib700</value>
            <value>diag288</value>
            <value>itco</value>
          </choice>
        </attribute>
        <optional>
          <attribute name="action">
            <choice>
              <value>reset</value>
              <value>shutdown</value>
              <value>poweroff</value>
              <value>pause</value>
              <value>none</value>
              <value>dump</value>
              <value>inject-nmi</value>
            </choice>
          </attribute>
        </optional>
        <optional>
          <ref name="alias"/>
        </optional>
        <optional>
          <ref name="acpi"/>
        </optional>
        <optional>
          <ref name="address"/>
        </optional>
      </interleave>
    </element>
  </define>
  <define name="nvram">
    <element name="nvram">
      <optional>
        <ref name="address"/>
      </optional>
    </element>
  </define>

  <define name="shmem">
    <element name="shmem">
      <attribute name="name">
        <data type="string">
          <param name="pattern">[^/]*</param>
        </data>
      </attribute>
      <optional>
        <attribute name="role">
          <choice>
            <value>master</value>
            <value>peer</value>
          </choice>
        </attribute>
      </optional>
      <interleave>
        <optional>
          <element name="model">
            <attribute name="type">
              <choice>
                <value>ivshmem</value>
                <value>ivshmem-plain</value>
                <value>ivshmem-doorbell</value>
              </choice>
            </attribute>
          </element>
        </optional>
        <optional>
          <element name="size">
            <ref name="scaledInteger"/>
          </element>
        </optional>
        <optional>
          <element name="server">
            <optional>
              <attribute name="path">
                <ref name="absFilePath"/>
              </attribute>
            </optional>
          </element>
        </optional>
        <optional>
          <element name="msi">
            <optional>
              <ref name="ioeventfd"/>
            </optional>
            <optional>
              <attribute name="vectors">
                <ref name="unsignedInt"/>
              </attribute>
            </optional>
          </element>
        </optional>
        <optional>
          <ref name="alias"/>
        </optional>
        <optional>
          <ref name="acpi"/>
        </optional>
        <optional>
          <ref name="address"/>
        </optional>
      </interleave>
    </element>
  </define>

  <define name="memballoon">
    <element name="memballoon">
      <attribute name="model">
        <choice>
          <value>virtio</value>
          <value>virtio-transitional</value>
          <value>virtio-non-transitional</value>
          <value>xen</value>
          <value>none</value>
        </choice>
      </attribute>
      <optional>
        <attribute name="autodeflate">
          <ref name="virOnOff"/>
        </attribute>
      </optional>
      <optional>
         <attribute name="freePageReporting">
           <ref name="virOnOff"/>
         </attribute>
       </optional>
      <interleave>
        <optional>
          <ref name="alias"/>
        </optional>
        <optional>
          <ref name="acpi"/>
        </optional>
        <optional>
          <ref name="address"/>
        </optional>
        <optional>
          <element name="stats">
            <attribute name="period">
              <ref name="positiveInteger"/>
            </attribute>
          </element>
        </optional>
        <optional>
          <element name="driver">
            <ref name="virtioOptions"/>
          </element>
        </optional>
      </interleave>
    </element>
  </define>
  <define name="parallel">
    <element name="parallel">
      <ref name="qemucdev"/>
    </element>
  </define>
  <define name="serial">
    <element name="serial">
      <ref name="qemucdev"/>
    </element>
  </define>
  <define name="guestfwdTarget">
    <element name="target">
      <attribute name="type">
        <value>guestfwd</value>
      </attribute>
      <attribute name="address"/>
      <attribute name="port"/>
    </element>
  </define>
  <define name="virtioTarget">
    <element name="target">
      <attribute name="type">
        <value>virtio</value>
      </attribute>
      <optional>
        <attribute name="name"/>
      </optional>
      <optional>
        <attribute name="state">
          <choice>
            <value>connected</value>
            <value>disconnected</value>
          </choice>
        </attribute>
      </optional>
    </element>
  </define>
  <define name="xenTarget">
    <element name="target">
      <attribute name="type">
        <value>xen</value>
      </attribute>
      <optional>
        <attribute name="name"/>
      </optional>
    </element>
  </define>
  <define name="channel">
    <element name="channel">
      <ref name="qemucdevSrcType"/>
      <interleave>
        <ref name="qemucdevSrcDef"/>
        <choice>
          <ref name="guestfwdTarget"/>
          <ref name="virtioTarget"/>
          <ref name="xenTarget"/>
        </choice>
        <optional>
          <ref name="alias"/>
        </optional>
        <optional>
          <ref name="address"/>
        </optional>
      </interleave>
    </element>
  </define>

  <define name="smartcard">
    <element name="smartcard">
      <interleave>
        <choice>
          <group>
            <attribute name="mode">
              <value>host</value>
            </attribute>
            <!-- might need to add optional database element here later -->
          </group>
          <group>
            <interleave>
              <attribute name="mode">
                <value>host-certificates</value>
              </attribute>
              <group>
                <ref name="certificate"/>
                <ref name="certificate"/>
                <ref name="certificate"/>
              </group>
              <optional>
                <element name="database">
                  <ref name="absDirPath"/>
                </element>
              </optional>
            </interleave>
          </group>
          <group>
            <attribute name="mode">
              <value>passthrough</value>
            </attribute>
            <ref name="qemucdevSrcType"/>
            <interleave>
              <ref name="qemucdevSrcDef"/>
              <optional>
                <ref name="qemucdevTgtDef"/>
              </optional>
            </interleave>
          </group>
        </choice>
        <optional>
          <ref name="acpi"/>
        </optional>
        <optional>
          <ref name="address"/>
        </optional>
      </interleave>
    </element>
  </define>

  <define name="certificate">
    <element name="certificate">
      <text/>
    </element>
  </define>

  <define name="tpm">
    <element name="tpm">
      <optional>
        <attribute name="model">
          <choice>
            <value>tpm-tis</value>
            <value>tpm-crb</value>
            <value>tpm-spapr</value>
            <value>spapr-tpm-proxy</value>
          </choice>
        </attribute>
      </optional>
      <interleave>
        <ref name="tpm-backend"/>
        <optional>
          <ref name="alias"/>
        </optional>
        <optional>
          <ref name="address"/>
        </optional>
      </interleave>
    </element>
  </define>

  <define name="tpm-backend">
    <element name="backend">
      <choice>
        <group>
          <attribute name="type">
            <value>passthrough</value>
          </attribute>
          <ref name="tpm-passthrough-device"/>
        </group>
        <group>
          <attribute name="type">
            <value>emulator</value>
          </attribute>
          <interleave>
            <ref name="tpm-backend-emulator-encryption"/>
            <ref name="tpm-backend-emulator-active-pcr-banks"/>
          </interleave>
          <optional>
            <attribute name="persistent_state">
              <ref name="virYesNo"/>
            </attribute>
          </optional>
        </group>
        <group>
          <attribute name="type">
            <value>external</value>
          </attribute>
          <ref name="tpm-external-source"/>
        </group>
      </choice>
      <optional>
        <attribute name="version">
          <choice>
            <value>1.2</value>
            <value>2.0</value>
          </choice>
       </attribute>
      </optional>
    </element>
  </define>

  <define name="tpm-passthrough-device">
    <optional>
      <element name="device">
        <optional>
          <attribute name="path">
            <ref name="filePath"/>
          </attribute>
        </optional>
      </element>
    </optional>
  </define>

  <define name="tpm-external-source">
    <optional>
      <element name="source">
        <attribute name="type">
          <value>unix</value>
        </attribute>
        <attribute name="path">
          <ref name="filePath"/>
        </attribute>
        <attribute name="mode">
          <value>connect</value>
        </attribute>
      </element>
    </optional>
  </define>

  <define name="tpm-backend-emulator-encryption">
    <optional>
      <element name="encryption">
        <attribute name="secret">
          <ref name="UUID"/>
        </attribute>
      </element>
    </optional>
  </define>

  <define name="tpm-backend-emulator-active-pcr-banks">
    <optional>
      <element name="active_pcr_banks">
        <interleave>
          <optional>
            <element name="sha1">
              <empty/>
            </element>
          </optional>
          <optional>
            <element name="sha256">
              <empty/>
            </element>
          </optional>
          <optional>
            <element name="sha384">
              <empty/>
            </element>
          </optional>
          <optional>
            <element name="sha512">
              <empty/>
            </element>
          </optional>
        </interleave>
      </element>
    </optional>
  </define>

  <define name="vsock">
    <element name="vsock">
      <optional>
        <attribute name="model">
          <choice>
            <value>virtio</value>
            <value>virtio-transitional</value>
            <value>virtio-non-transitional</value>
          </choice>
        </attribute>
      </optional>
      <interleave>
        <optional>
          <element name="cid">
            <optional>
              <attribute name="auto">
                <ref name="virYesNo"/>
              </attribute>
            </optional>
            <optional>
              <attribute name="address">
                <ref name="unsignedInt"/>
              </attribute>
            </optional>
          </element>
        </optional>
        <optional>
          <ref name="address"/>
        </optional>
        <optional>
          <ref name="alias"/>
        </optional>
        <optional>
          <ref name="acpi"/>
        </optional>
        <optional>
          <element name="driver">
            <ref name="virtioOptions"/>
          </element>
        </optional>
      </interleave>
    </element>
  </define>
  <define name="iommu">
    <element name="iommu">
      <attribute name="model">
        <choice>
          <value>intel</value>
          <value>smmuv3</value>
          <value>virtio</value>
        </choice>
      </attribute>
      <interleave>
        <optional>
          <element name="driver">
            <optional>
              <attribute name="intremap">
                <ref name="virOnOff"/>
              </attribute>
            </optional>
            <optional>
              <attribute name="caching_mode">
                <ref name="virOnOff"/>
              </attribute>
            </optional>
            <optional>
              <attribute name="eim">
                <ref name="virOnOff"/>
              </attribute>
            </optional>
            <optional>
              <attribute name="iotlb">
                <ref name="virOnOff"/>
              </attribute>
            </optional>
            <optional>
              <attribute name="aw_bits">
                <ref name="uint8"/>
              </attribute>
            </optional>
          </element>
        </optional>
        <optional>
          <ref name="acpi"/>
        </optional>
        <optional>
          <ref name="address"/>
        </optional>
        <optional>
          <ref name="alias"/>
        </optional>
      </interleave>
    </element>
  </define>

  <define name="input">
    <element name="input">
      <interleave>
        <optional>
          <element name="driver">
            <ref name="virtioOptions"/>
          </element>
        </optional>
        <choice>
          <group>
            <attribute name="type">
              <choice>
                <value>tablet</value>
                <value>mouse</value>
                <value>keyboard</value>
              </choice>
            </attribute>
            <optional>
              <attribute name="bus">
                <choice>
                  <value>ps2</value>
                  <value>usb</value>
                  <value>xen</value>
                  <value>virtio</value>
                </choice>
              </attribute>
            </optional>
          </group>
          <group>
            <attribute name="type">
              <value>passthrough</value>
            </attribute>
            <attribute name="bus">
              <value>virtio</value>
            </attribute>
            <element name="source">
              <attribute name="evdev">
                <ref name="absFilePath"/>
              </attribute>
            </element>
          </group>
          <group>
            <attribute name="type">
              <value>evdev</value>
            </attribute>
            <element name="source">
              <attribute name="dev">
                <ref name="absFilePath"/>
              </attribute>
              <optional>
                <attribute name="grab">
                  <value>all</value>
                </attribute>
              </optional>
              <optional>
                <attribute name="grabToggle">
                  <choice>
                    <value>ctrl-ctrl</value>
                    <value>alt-alt</value>
                    <value>shift-shift</value>
                    <value>meta-meta</value>
                    <value>scrolllock</value>
                    <value>ctrl-scrolllock</value>
                  </choice>
                </attribute>
              </optional>
              <optional>
                <attribute name="repeat">
                  <ref name="virOnOff"/>
                </attribute>
              </optional>
            </element>
          </group>
        </choice>
        <optional>
          <attribute name="model">
            <choice>
              <value>virtio</value>
              <value>virtio-transitional</value>
              <value>virtio-non-transitional</value>
            </choice>
          </attribute>
        </optional>
        <optional>
          <ref name="alias"/>
        </optional>
        <optional>
          <ref name="acpi"/>
        </optional>
        <optional>
          <ref name="address"/>
        </optional>
      </interleave>
    </element>
  </define>
  <define name="hub">
    <element name="hub">
      <attribute name="type">
        <value>usb</value>
      </attribute>
      <interleave>
        <optional>
          <ref name="alias"/>
        </optional>
        <optional>
          <ref name="address"/>
        </optional>
      </interleave>
    </element>
  </define>
  <define name="redirdev">
    <element name="redirdev">
      <attribute name="bus">
        <value>usb</value>
      </attribute>
      <attribute name="type">
        <ref name="qemucdevSrcTypeChoice"/>
      </attribute>
      <interleave>
        <ref name="qemucdevSrcDef"/>
        <optional>
          <ref name="alias"/>
        </optional>
        <optional>
          <ref name="address"/>
        </optional>
        <optional>
          <ref name="deviceBoot"/>
        </optional>
      </interleave>
    </element>
  </define>
  <define name="redirfilter">
    <element name="redirfilter">
      <zeroOrMore>
        <ref name="usbdevfilter"/>
      </zeroOrMore>
    </element>
  </define>

  <define name="hostdev">
    <element name="hostdev">
      <interleave>
        <choice>
          <group>
            <ref name="hostdevsubsys"/>
          </group>
          <group>
            <ref name="hostdevcaps"/>
          </group>
        </choice>
        <optional>
          <ref name="alias"/>
        </optional>
        <optional>
          <ref name="acpi"/>
        </optional>
        <optional>
          <ref name="deviceBoot"/>
        </optional>
        <optional>
          <ref name="rom"/>
        </optional>
        <optional>
          <ref name="address"/>
        </optional>
        <optional>
          <element name="readonly">
            <empty/>
          </element>
        </optional>
        <optional>
          <element name="shareable">
            <empty/>
          </element>
        </optional>
      </interleave>
    </element>
  </define>

  <define name="hostdevsubsys">
    <optional>
      <attribute name="mode">
        <value>subsystem</value>
      </attribute>
    </optional>
    <optional>
      <attribute name="managed">
        <ref name="virYesNo"/>
      </attribute>
    </optional>
    <choice>
      <ref name="hostdevsubsyspci"/>
      <ref name="hostdevsubsysusb"/>
      <ref name="hostdevsubsysscsi"/>
      <ref name="hostdevsubsyshost"/>
      <ref name="hostdevsubsysmdev"/>
    </choice>
  </define>

  <define name="hostdevcaps">
    <attribute name="mode">
      <value>capabilities</value>
    </attribute>
    <choice>
      <group>
        <ref name="hostdevcapsstorage"/>
      </group>
      <group>
        <ref name="hostdevcapsmisc"/>
      </group>
      <group>
        <ref name="hostdevcapsnet"/>
      </group>
    </choice>
  </define>


  <define name="hostdevsubsyspci">
    <attribute name="type">
      <value>pci</value>
    </attribute>
    <interleave>
      <optional>
        <element name="driver">
          <attribute name="name">
            <choice>
              <value>kvm</value>
              <value>vfio</value>
              <value>xen</value>
            </choice>
          </attribute>
          <empty/>
        </element>
      </optional>
      <optional>
        <ref name="teaming"/>
      </optional>
      <element name="source">
        <optional>
          <ref name="startupPolicy"/>
        </optional>
        <optional>
          <attribute name="writeFiltering">
            <ref name="virYesNo"/>
          </attribute>
        </optional>
        <element name="address">
          <ref name="pciaddress"/>
        </element>
      </element>
    </interleave>
  </define>

  <define name="hostdevsubsysusb">
    <attribute name="type">
      <value>usb</value>
    </attribute>
    <element name="source">
      <optional>
        <ref name="startupPolicy"/>
      </optional>
      <optional>
        <attribute name="guestReset">
          <choice>
            <value>off</value>
            <value>uninitialized</value>
            <value>on</value>
          </choice>
        </attribute>
      </optional>
      <choice>
        <group>
          <ref name="usbproduct"/>
          <optional>
            <ref name="usbaddress"/>
          </optional>
        </group>
        <ref name="usbaddress"/>
      </choice>
    </element>
  </define>

  <define name="hostdevsubsysscsi">
    <attribute name="type">
      <value>scsi</value>
    </attribute>
    <optional>
      <ref name="sgIO"/>
    </optional>
    <optional>
      <ref name="rawIO"/>
    </optional>
    <element name="source">
      <choice>
        <group>  <!-- scsi_host adapter -->
          <optional>
            <attribute name="protocol">
              <value>adapter</value>   <!-- scsi_host, default, optional -->
            </attribute>
          </optional>
          <interleave>
            <ref name="sourceinfoadapter"/>
            <element name="address">
              <ref name="scsiaddress"/>
            </element>
          </interleave>
        </group>
        <group>  <!-- iscsi adapter -->
          <attribute name="protocol">
            <value>iscsi</value>     <!-- iscsi, required -->
          </attribute>
          <attribute name="name">
            <text/>
          </attribute>
          <interleave>
            <oneOrMore>
              <element name="host">
                <attribute name="name">
                  <text/>
                </attribute>
                <optional>
                  <attribute name="port">
                    <ref name="PortNumber"/>
                  </attribute>
                </optional>
                <empty/>
              </element>
            </oneOrMore>
            <optional>
              <ref name="diskAuth"/>
            </optional>
            <optional>
              <ref name="initiatorinfo"/>
            </optional>
          </interleave>
        </group>
      </choice>
    </element>
  </define>

  <define name="hostdevsubsyshost">
    <attribute name="type">
      <value>scsi_host</value>
    </attribute>
    <optional>
      <attribute name="model">
        <choice>
          <value>virtio</value>
          <value>virtio-transitional</value>
          <value>virtio-non-transitional</value>
        </choice>
      </attribute>
    </optional>
    <element name="source">
      <choice>
        <group>
          <attribute name="protocol">
            <value>vhost</value>     <!-- vhost, required -->
          </attribute>
          <attribute name="wwpn">
            <data type="string">
              <param name="pattern">(naa\.)[0-9a-fA-F]{16}</param>
            </data>
          </attribute>
        </group>
      </choice>
    </element>
  </define>

  <define name="hostdevsubsysmdev">
    <attribute name="type">
      <value>mdev</value>
    </attribute>
    <attribute name="model">
      <choice>
        <value>vfio-pci</value>
        <value>vfio-ccw</value>
        <value>vfio-ap</value>
      </choice>
    </attribute>
    <optional>
      <attribute name="ramfb">
        <ref name="virOnOff"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="display">
        <ref name="virOnOff"/>
      </attribute>
    </optional>
    <element name="source">
      <ref name="mdevaddress"/>
    </element>
  </define>

  <define name="hostdevcapsstorage">
    <attribute name="type">
      <value>storage</value>
    </attribute>
    <element name="source">
      <element name="block">
        <ref name="absFilePath"/>
      </element>
    </element>
  </define>

  <define name="hostdevcapsmisc">
    <attribute name="type">
      <value>misc</value>
    </attribute>
    <element name="source">
      <element name="char">
        <ref name="absFilePath"/>
      </element>
    </element>
  </define>

  <define name="hostdevcapsnet">
    <attribute name="type">
      <value>net</value>
    </attribute>
    <interleave>
      <element name="source">
        <element name="interface">
          <ref name="deviceName"/>
        </element>
      </element>
      <ref name="interface-ip-info"/>
    </interleave>
  </define>

  <define name="usbproduct">
    <element name="vendor">
      <attribute name="id">
        <ref name="usbId"/>
      </attribute>
    </element>
    <element name="product">
      <attribute name="id">
        <ref name="usbId"/>
      </attribute>
    </element>
  </define>
  <define name="usbaddress">
    <element name="address">
      <attribute name="bus">
        <ref name="usbAddr"/>
      </attribute>
      <attribute name="device">
        <ref name="usbAddr"/>
      </attribute>
    </element>
  </define>
  <define name="scsiaddress">
    <attribute name="bus">
      <ref name="driveBus"/>
    </attribute>
    <attribute name="target">
      <ref name="driveSCSITarget"/>
    </attribute>
    <attribute name="unit">
      <ref name="driveSCSIUnit"/>
    </attribute>
  </define>
  <define name="usbportaddress">
    <attribute name="bus">
      <ref name="usbAddr"/>
    </attribute>
    <optional>
      <attribute name="port">
        <ref name="usbPort"/>
      </attribute>
    </optional>
  </define>
  <define name="spaprvioaddress">
    <optional>
      <attribute name="reg">
        <ref name="spaprvioReg"/>
      </attribute>
    </optional>
  </define>
  <define name="ccwaddress">
    <optional>
      <attribute name="cssid">
        <ref name="ccwCssidRange"/>
      </attribute>
      <attribute name="ssid">
        <ref name="ccwSsidRange"/>
      </attribute>
      <attribute name="devno">
        <ref name="ccwDevnoRange"/>
      </attribute>
    </optional>
  </define>
  <define name="driveaddress">
    <optional>
      <attribute name="controller">
        <ref name="driveController"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="bus">
        <ref name="driveBus"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="target">
        <ref name="driveTarget"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="unit">
        <ref name="driveUnit"/>
      </attribute>
    </optional>
  </define>
  <define name="virtioserialaddress">
    <attribute name="controller">
      <ref name="driveController"/>
    </attribute>
    <optional>
      <attribute name="bus">
        <ref name="driveBus"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="port">
        <ref name="virtioserialPort"/>
      </attribute>
    </optional>
  </define>
  <define name="ccidaddress">
    <attribute name="controller">
      <ref name="driveController"/>
    </attribute>
    <optional>
      <attribute name="slot">
        <ref name="ccidSlot"/>
      </attribute>
    </optional>
  </define>
  <define name="dimmaddress">
    <optional>
      <attribute name="slot">
        <ref name="unsignedInt"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="base">
        <ref name="hexuint"/>
      </attribute>
    </optional>
  </define>
  <define name="mdevaddress">
    <element name="address">
      <attribute name="uuid">
        <ref name="UUID"/>
      </attribute>
    </element>
  </define>
  <define name="devices">
    <element name="devices">
      <interleave>
        <optional>
          <ref name="emulator"/>
        </optional>
        <zeroOrMore>
          <choice>
            <ref name="disk"/>
            <ref name="controller"/>
            <ref name="lease"/>
            <ref name="filesystem"/>
            <ref name="interface"/>
            <ref name="input"/>
            <ref name="sound"/>
            <ref name="audio"/>
            <ref name="hostdev"/>
            <ref name="graphic"/>
            <ref name="video"/>
            <ref name="console"/>
            <ref name="parallel"/>
            <ref name="serial"/>
            <ref name="channel"/>
            <ref name="smartcard"/>
            <ref name="hub"/>
            <ref name="redirdev"/>
            <ref name="redirfilter"/>
            <ref name="rng"/>
            <ref name="tpm"/>
            <ref name="shmem"/>
            <ref name="memorydev"/>
            <ref name="crypto"/>
          </choice>
        </zeroOrMore>
        <zeroOrMore>
          <ref name="watchdog"/>
        </zeroOrMore>
        <optional>
          <ref name="memballoon"/>
        </optional>
        <optional>
          <ref name="nvram"/>
        </optional>
        <zeroOrMore>
          <ref name="panic"/>
        </zeroOrMore>
        <optional>
          <ref name="iommu"/>
        </optional>
        <optional>
          <ref name="vsock"/>
        </optional>
      </interleave>
    </element>
  </define>
  <!--
      A set of optional features: PAE, APIC, ACPI, GIC, TCG,
      HyperV Enlightenment, KVM features, paravirtual spinlocks and HAP support
    -->
  <define name="features">
    <optional>
      <element name="features">
        <interleave>
          <optional>
            <element name="pae">
              <empty/>
            </element>
          </optional>
          <optional>
            <element name="apic">
              <optional>
                <attribute name="eoi">
                  <ref name="virOnOff"/>
                </attribute>
              </optional>
            </element>
          </optional>
          <optional>
            <element name="acpi">
              <empty/>
            </element>
          </optional>
          <optional>
            <element name="hap">
              <optional>
                <attribute name="state">
                  <ref name="virOnOff"/>
                </attribute>
              </optional>
            </element>
          </optional>
          <optional>
            <ref name="hyperv"/>
          </optional>
          <optional>
            <element name="viridian">
              <empty/>
            </element>
          </optional>
          <optional>
            <ref name="kvm"/>
          </optional>
          <optional>
            <ref name="xen"/>
          </optional>
          <optional>
            <element name="privnet">
              <empty/>
            </element>
          </optional>
          <optional>
            <element name="pvspinlock">
              <optional>
                <ref name="featurestate"/>
              </optional>
              <empty/>
            </element>
          </optional>
          <optional>
            <ref name="capabilities"/>
          </optional>
          <optional>
            <ref name="pmu"/>
          </optional>
          <optional>
            <element name="vmport">
              <optional>
                <attribute name="state">
                  <ref name="virOnOff"/>
                </attribute>
              </optional>
            </element>
          </optional>
          <optional>
            <element name="gic">
              <optional>
                <attribute name="version">
                  <choice>
                    <value>host</value>
                    <value>2</value>
                    <value>3</value>
                  </choice>
                </attribute>
              </optional>
            </element>
          </optional>
          <optional>
            <element name="smm">
              <optional>
                <attribute name="state">
                  <ref name="virOnOff"/>
                </attribute>
                <optional>
                  <element name="tseg">
                    <ref name="scaledInteger"/>
                  </element>
                </optional>
              </optional>
            </element>
          </optional>
          <optional>
            <ref name="ioapic"/>
          </optional>
          <optional>
            <ref name="hpt"/>
          </optional>
          <optional>
            <ref name="vmcoreinfo"/>
          </optional>
          <optional>
            <element name="htm">
              <ref name="featurestate"/>
            </element>
          </optional>
          <optional>
            <element name="nested-hv">
              <ref name="featurestate"/>
            </element>
          </optional>
          <optional>
            <ref name="msrs"/>
          </optional>
          <optional>
            <element name="ccf-assist">
              <ref name="featurestate"/>
            </element>
          </optional>
          <optional>
            <ref name="cfpc"/>
          </optional>
          <optional>
            <ref name="sbbc"/>
          </optional>
          <optional>
            <ref name="ibs"/>
          </optional>
          <optional>
            <ref name="tcgfeatures"/>
          </optional>
        </interleave>
      </element>
    </optional>
  </define>

  <!--
      System information specification:
       Placeholder for system specific information likes the ones
       contained in the SMBIOS area.
       Only a limited subset of entries can be modified there, so we
       fully enumerate each case here.
       The DMTF spec doesn't specify any string subset, just 0 terminated
       byte strings, but better be safe and restrict at least the names
       to avoid problems with space normalization in attribute values,
       the value is kept as the element body for maximum flexibility.
       A priori we allow only type 0 and type 1 string updates
      -->
  <define name="sysinfo">
    <element name="sysinfo">
      <choice>
        <group>
          <attribute name="type">
            <value>smbios</value>
          </attribute>
          <interleave>
            <optional>
              <element name="bios">
                <oneOrMore>
                  <element name="entry">
                    <attribute name="name">
                      <ref name="sysinfo-bios-name"/>
                    </attribute>
                    <ref name="sysinfo-value"/>
                  </element>
                </oneOrMore>
              </element>
            </optional>
            <optional>
              <element name="system">
                <oneOrMore>
                  <element name="entry">
                    <attribute name="name">
                      <ref name="sysinfo-system-name"/>
                    </attribute>
                    <ref name="sysinfo-value"/>
                  </element>
                </oneOrMore>
              </element>
            </optional>
            <zeroOrMore>
              <element name="baseBoard">
                <oneOrMore>
                  <element name="entry">
                    <attribute name="name">
                      <ref name="sysinfo-baseBoard-name"/>
                    </attribute>
                    <ref name="sysinfo-value"/>
                  </element>
                </oneOrMore>
              </element>
            </zeroOrMore>
            <optional>
              <element name="chassis">
                <oneOrMore>
                  <element name="entry">
                    <attribute name="name">
                      <ref name="sysinfo-chassis-name"/>
                    </attribute>
                    <ref name="sysinfo-value"/>
                  </element>
                </oneOrMore>
              </element>
            </optional>
            <optional>
              <element name="oemStrings">
                <oneOrMore>
                  <element name="entry">
                    <ref name="sysinfo-value"/>
                  </element>
                </oneOrMore>
              </element>
            </optional>
          </interleave>
        </group>
        <group>
          <attribute name="type">
            <value>fwcfg</value>
          </attribute>
          <zeroOrMore>
            <element name="entry">
              <attribute name="name">
                <data type="string"/>
              </attribute>
              <choice>
                <group>
                  <attribute name="file">
                    <data type="string"/>
                  </attribute>
                  <empty/>
                </group>
                <group>
                  <ref name="sysinfo-value"/>
                </group>
              </choice>
            </element>
          </zeroOrMore>
        </group>
      </choice>
    </element>
  </define>

  <define name="sysinfo-bios-name">
    <choice>
      <value>vendor</value>
      <value>version</value>
      <value>date</value>
      <value>release</value>
    </choice>
  </define>

  <define name="sysinfo-system-name">
    <choice>
      <value>manufacturer</value>
      <value>product</value>
      <value>version</value>
      <value>serial</value>
      <value>uuid</value>
      <value>sku</value>
      <value>family</value>
    </choice>
  </define>

  <define name="sysinfo-baseBoard-name">
    <choice>
      <value>manufacturer</value>
      <value>product</value>
      <value>version</value>
      <value>serial</value>
      <value>asset</value>
      <value>location</value>
    </choice>
  </define>

  <define name="sysinfo-chassis-name">
    <choice>
      <value>manufacturer</value>
      <value>version</value>
      <value>serial</value>
      <value>asset</value>
      <value>sku</value>
    </choice>
  </define>

  <define name="sysinfo-value">
    <data type="string"/>
  </define>

  <define name="acpiTable">
    <element name="acpi">
      <zeroOrMore>
        <element name="table">
          <attribute name="type">
            <value>slic</value>
          </attribute>
          <ref name="absFilePath"/>
        </element>
      </zeroOrMore>
    </element>
  </define>

  <define name="smbios">
    <element name="smbios">
      <attribute name="mode">
        <choice>
          <value>emulate</value>
          <value>host</value>
          <value>sysinfo</value>
        </choice>
      </attribute>
      <empty/>
    </element>
  </define>

  <define name="bios">
    <element name="bios">
      <optional>
        <attribute name="useserial">
          <ref name="virYesNo"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="rebootTimeout">
          <ref name="rebootTimeoutDelay"/>
        </attribute>
      </optional>
    </element>
  </define>

  <define name="ioapic">
    <element name="ioapic">
      <attribute name="driver">
        <choice>
          <value>qemu</value>
          <value>kvm</value>
        </choice>
      </attribute>
      <empty/>
    </element>
  </define>

  <define name="hpt">
    <element name="hpt">
      <optional>
        <attribute name="resizing">
          <choice>
            <value>enabled</value>
            <value>disabled</value>
            <value>required</value>
          </choice>
        </attribute>
      </optional>
      <optional>
        <element name="maxpagesize">
          <ref name="scaledInteger"/>
        </element>
      </optional>
    </element>
  </define>

  <define name="vmcoreinfo">
    <element name="vmcoreinfo">
      <optional>
        <attribute name="state">
          <ref name="virOnOff"/>
        </attribute>
      </optional>
    </element>
  </define>

  <define name="msrs">
    <element name="msrs">
      <attribute name="unknown">
        <choice>
          <value>ignore</value>
          <value>fault</value>
        </choice>
      </attribute>
    </element>
  </define>

  <define name="cfpc">
    <element name="cfpc">
      <attribute name="value">
        <choice>
          <value>broken</value>
          <value>workaround</value>
          <value>fixed</value>
        </choice>
      </attribute>
    </element>
  </define>

  <define name="sbbc">
    <element name="sbbc">
      <attribute name="value">
        <choice>
          <value>broken</value>
          <value>workaround</value>
          <value>fixed</value>
        </choice>
      </attribute>
    </element>
  </define>

  <define name="ibs">
    <element name="ibs">
      <attribute name="value">
        <choice>
          <value>broken</value>
          <value>workaround</value>
          <value>fixed-ibs</value>
          <value>fixed-ccd</value>
          <value>fixed-na</value>
        </choice>
      </attribute>
    </element>
  </define>

  <define name="tcgfeatures">
    <element name="tcg">
      <optional>
        <element name="tb-cache">
          <ref name="scaledInteger"/>
        </element>
      </optional>
    </element>
  </define>

  <define name="address">
    <element name="address">
      <choice>
        <group>
          <attribute name="type">
            <value>pci</value>
          </attribute>
          <ref name="pciaddress"/>
          <ref name="zpciaddress"/>
        </group>
        <group>
          <attribute name="type">
            <value>drive</value>
          </attribute>
          <ref name="driveaddress"/>
        </group>
        <group>
          <attribute name="type">
            <value>virtio-serial</value>
          </attribute>
          <ref name="virtioserialaddress"/>
        </group>
        <group>
          <attribute name="type">
            <value>ccid</value>
          </attribute>
          <ref name="ccidaddress"/>
        </group>
        <group>
          <attribute name="type">
            <value>usb</value>
          </attribute>
          <ref name="usbportaddress"/>
        </group>
        <group>
          <attribute name="type">
            <value>spapr-vio</value>
          </attribute>
          <ref name="spaprvioaddress"/>
        </group>
        <group>
          <attribute name="type">
            <value>ccw</value>
          </attribute>
          <ref name="ccwaddress"/>
        </group>
        <group>
          <attribute name="type">
            <value>isa</value>
          </attribute>
          <ref name="isaaddress"/>
        </group>
        <group>
          <attribute name="type">
            <value>virtio-mmio</value>
          </attribute>
        </group>
        <group>
          <attribute name="type">
            <value>dimm</value>
          </attribute>
          <ref name="dimmaddress"/>
        </group>
        <group>
          <attribute name="type">
            <value>unassigned</value>
          </attribute>
        </group>
      </choice>
    </element>
  </define>

  <define name="rom">
    <element name="rom">
      <optional>
        <attribute name="enabled">
          <ref name="virYesNo"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="bar">
          <ref name="virOnOff"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="file">
          <ref name="absFilePath"/>
        </attribute>
      </optional>
      <empty/>
    </element>
  </define>

  <define name="acpi">
    <element name="acpi">
      <optional>
        <attribute name="index">
          <ref name="unsignedInt"/>
        </attribute>
      </optional>
    </element>
  </define>

  <define name="memorydev">
    <element name="memory">
      <attribute name="model">
        <choice>
          <value>dimm</value>
          <value>nvdimm</value>
          <value>virtio-pmem</value>
          <value>virtio-mem</value>
          <value>sgx-epc</value>
        </choice>
      </attribute>
      <optional>
        <attribute name="access">
          <choice>
            <value>shared</value>
            <value>private</value>
          </choice>
        </attribute>
      </optional>
      <optional>
        <attribute name="discard">
          <ref name="virYesNo"/>
        </attribute>
      </optional>
      <interleave>
        <optional>
          <element name="uuid">
            <ref name="UUID"/>
          </element>
        </optional>
        <optional>
          <ref name="memorydev-source"/>
        </optional>
        <ref name="memorydev-target"/>
        <optional>
          <ref name="address"/>
        </optional>
        <optional>
          <ref name="alias"/>
        </optional>
        <optional>
          <ref name="acpi"/>
        </optional>
      </interleave>
    </element>
  </define>

  <define name="memorydev-source">
    <element name="source">
      <choice>
        <group>
          <interleave>
            <optional>
              <element name="pagesize">
                <ref name="scaledInteger"/>
              </element>
            </optional>
            <optional>
              <element name="nodemask">
                <ref name="cpuset"/>
              </element>
            </optional>
          </interleave>
        </group>
        <group>
          <interleave>
            <element name="path">
              <ref name="absFilePath"/>
            </element>
            <optional>
              <element name="alignsize">
                <ref name="scaledInteger"/>
              </element>
            </optional>
            <optional>
              <element name="pmem">
                <empty/>
              </element>
            </optional>
          </interleave>
        </group>
      </choice>
    </element>
  </define>

  <define name="memorydev-target">
    <element name="target">
      <interleave>
        <element name="size">
          <ref name="scaledInteger"/>
        </element>
        <optional>
          <element name="node">
            <ref name="unsignedInt"/>
          </element>
        </optional>
        <optional>
          <element name="block">
            <ref name="scaledInteger"/>
          </element>
        </optional>
        <optional>
          <element name="requested">
            <ref name="scaledInteger"/>
          </element>
        </optional>
        <optional>
          <element name="current">
            <ref name="scaledInteger"/>
          </element>
        </optional>
        <optional>
          <element name="label">
            <element name="size">
              <ref name="scaledInteger"/>
            </element>
          </element>
        </optional>
        <optional>
          <element name="readonly">
            <empty/>
          </element>
        </optional>
      </interleave>
    </element>
  </define>

  <define name="rng">
    <element name="rng">
      <attribute name="model">
        <choice>
          <value>virtio</value>
          <value>virtio-transitional</value>
          <value>virtio-non-transitional</value>
        </choice>
      </attribute>
      <interleave>
        <ref name="rng-backend"/>
        <optional>
          <element name="driver">
            <ref name="virtioOptions"/>
          </element>
        </optional>
        <optional>
          <ref name="rng-rate"/>
        </optional>
        <optional>
          <ref name="alias"/>
        </optional>
        <optional>
          <ref name="acpi"/>
        </optional>
        <optional>
          <ref name="address"/>
        </optional>
      </interleave>
    </element>
  </define>

  <define name="rng-backend">
    <element name="backend">
      <choice>
        <group>
          <attribute name="model">
            <value>random</value>
          </attribute>
          <choice>
            <ref name="absFilePath"/>
            <empty/>
          </choice>
        </group>
        <group>
          <attribute name="model">
            <value>egd</value>
          </attribute>
          <ref name="qemucdevSrcType"/>
          <ref name="qemucdevSrcDef"/>
        </group>
        <group>
          <attribute name="model">
            <value>builtin</value>
          </attribute>
          <empty/>
        </group>
      </choice>
    </element>
  </define>

  <define name="rng-rate">
    <element name="rate">
      <attribute name="bytes">
        <ref name="positiveInteger"/>
      </attribute>
      <optional>
        <attribute name="period">
          <ref name="positiveInteger"/>
        </attribute>
      </optional>
      <empty/>
    </element>
  </define>

  <define name="crypto">
    <element name="crypto">
      <attribute name="model">
        <choice>
          <value>virtio</value>
        </choice>
      </attribute>
      <attribute name="type">
        <choice>
          <value>qemu</value>
        </choice>
      </attribute>
      <interleave>
        <ref name="crypto-backend"/>
        <optional>
          <element name="driver">
            <ref name="virtioOptions"/>
          </element>
        </optional>
        <optional>
          <ref name="alias"/>
        </optional>
        <optional>
          <ref name="address"/>
        </optional>
      </interleave>
    </element>
  </define>

  <define name="crypto-backend">
    <element name="backend">
      <choice>
        <group>
          <attribute name="model">
            <value>builtin</value>
          </attribute>
          <optional>
            <attribute name="queues">
              <ref name="positiveInteger"/>
            </attribute>
          </optional>
        </group>
        <group>
          <attribute name="model">
            <value>lkcf</value>
          </attribute>
          <optional>
            <attribute name="queues">
              <ref name="positiveInteger"/>
            </attribute>
          </optional>
        </group>
      </choice>
    </element>
  </define>


  <define name="virtioOptions">
    <optional>
      <attribute name="iommu">
        <ref name="virOnOff"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="ats">
        <ref name="virOnOff"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="packed">
        <ref name="virOnOff"/>
      </attribute>
    </optional>
    <optional>
      <attribute name="page_per_vq">
        <ref name="virOnOff"/>
      </attribute>
    </optional>
  </define>

  <define name="usbmaster">
    <element name="master">
      <attribute name="startport">
        <ref name="usbPort"/>
      </attribute>
      <empty/>
    </element>
  </define>

  <define name="deviceBoot">
    <element name="boot">
      <attribute name="order">
        <ref name="positiveInteger"/>
      </attribute>
      <optional>
        <attribute name="loadparm">
          <data type="string">
            <param name="pattern">[a-zA-Z0-9.\s]{1,8}</param>
          </data>
        </attribute>
      </optional>
      <empty/>
    </element>
  </define>

  <define name="diskMirror">
    <element name="mirror">
      <interleave>
        <choice>
          <group> <!-- old format, for block copy back-compat -->
            <attribute name="file">
              <ref name="absFilePath"/>
            </attribute>
            <optional>
              <attribute name="format">
                <ref name="storageFormat"/>
              </attribute>
            </optional>
            <optional>
              <attribute name="job">
                <value>copy</value>
              </attribute>
            </optional>
            <optional>
              <interleave>
                <ref name="diskSourceFile"/>
                <optional>
                  <ref name="diskFormat"/>
                </optional>
              </interleave>
            </optional>
          </group>
          <group> <!-- preferred format -->
            <attribute name="job">
              <choice>
                <value>copy</value>
                <value>active-commit</value>
              </choice>
            </attribute>
            <interleave>
              <ref name="diskSource"/>
              <optional>
                <ref name="diskFormat"/>
              </optional>
            </interleave>
          </group>
        </choice>
        <optional>
          <attribute name="ready">
            <choice>
              <value>yes</value>
              <value>abort</value>
              <value>pivot</value>
            </choice>
          </attribute>
        </optional>
        <ref name="diskBackingChain"/>
      </interleave>
    </element>
  </define>

  <define name="diskAuth">
    <element name="auth">
      <attribute name="username">
        <ref name="genericName"/>
      </attribute>
      <ref name="diskAuthSecret"/>
    </element>
  </define>

  <define name="diskAuthSecret">
    <element name="secret">
      <attribute name="type">
        <choice>
          <value>ceph</value>
          <value>iscsi</value>
        </choice>
      </attribute>
      <choice>
        <attribute name="uuid">
          <ref name="UUID"/>
        </attribute>
        <attribute name="usage">
          <ref name="objectName"/>
        </attribute>
      </choice>
    </element>
  </define>

  <define name="diskIoTune">
    <element name="iotune">
      <interleave>
        <choice>
          <element name="total_bytes_sec">
            <data type="unsignedLong"/>
          </element>
          <group>
            <interleave>
              <optional>
                <element name="read_bytes_sec">
                  <data type="unsignedLong"/>
                </element>
              </optional>
              <optional>
                <element name="write_bytes_sec">
                  <data type="unsignedLong"/>
                </element>
              </optional>
            </interleave>
          </group>
        </choice>
        <choice>
          <element name="total_iops_sec">
            <data type="unsignedLong"/>
          </element>
          <group>
            <interleave>
              <optional>
                <element name="read_iops_sec">
                  <data type="unsignedLong"/>
                </element>
              </optional>
              <optional>
                <element name="write_iops_sec">
                  <data type="unsignedLong"/>
                </element>
              </optional>
            </interleave>
          </group>
        </choice>
        <choice>
          <element name="total_bytes_sec_max">
            <data type="unsignedLong"/>
          </element>
          <group>
            <interleave>
              <optional>
                <element name="read_bytes_sec_max">
                  <data type="unsignedLong"/>
                </element>
              </optional>
              <optional>
                <element name="write_bytes_sec_max">
                  <data type="unsignedLong"/>
                </element>
              </optional>
            </interleave>
          </group>
        </choice>
        <choice>
          <element name="total_iops_sec_max">
            <data type="unsignedLong"/>
          </element>
          <group>
            <interleave>
              <optional>
                <element name="read_iops_sec_max">
                  <data type="unsignedLong"/>
                </element>
              </optional>
              <optional>
                <element name="write_iops_sec_max">
                  <data type="unsignedLong"/>
                </element>
              </optional>
            </interleave>
          </group>
        </choice>
        <optional>
          <element name="size_iops_sec">
            <data type="unsignedLong"/>
          </element>
        </optional>
        <optional>
          <element name="group_name">
            <text/>
          </element>
        </optional>
        <choice>
          <element name="total_bytes_sec_max_length">
            <data type="unsignedLong"/>
          </element>
          <group>
            <interleave>
              <optional>
                <element name="read_bytes_sec_max_length">
                  <data type="unsignedLong"/>
                </element>
              </optional>
              <optional>
                <element name="write_bytes_sec_max_length">
                  <data type="unsignedLong"/>
                </element>
              </optional>
            </interleave>
          </group>
        </choice>
        <choice>
          <element name="total_iops_sec_max_length">
            <data type="unsignedLong"/>
          </element>
          <group>
            <interleave>
              <optional>
                <element name="read_iops_sec_max_length">
                  <data type="unsignedLong"/>
                </element>
              </optional>
              <optional>
                <element name="write_iops_sec_max_length">
                  <data type="unsignedLong"/>
                </element>
              </optional>
            </interleave>
          </group>
        </choice>
      </interleave>
    </element>
  </define>

  <define name="pflashFormat">
    <attribute name="format">
      <choice>
        <value>raw</value>
        <value>qcow2</value>
      </choice>
    </attribute>
  </define>

  <!-- Optional HyperV Enlightenment features -->
  <define name="hyperv">
    <element name="hyperv">
      <choice>
        <attribute name="mode">
          <value>passthrough</value>
        </attribute>
        <group>
          <optional>
            <attribute name="mode">
              <value>custom</value>
            </attribute>
          </optional>
          <interleave>
            <optional>
              <element name="relaxed">
                <ref name="featurestate"/>
              </element>
            </optional>
            <optional>
              <element name="vapic">
                <ref name="featurestate"/>
              </element>
            </optional>
            <optional>
              <element name="spinlocks">
                <ref name="featurestate"/>
                <optional>
                  <attribute name="retries">
                    <data type="unsignedInt"/>
                  </attribute>
                </optional>
              </element>
            </optional>
            <optional>
              <element name="vpindex">
                <ref name="featurestate"/>
              </element>
            </optional>
            <optional>
              <element name="runtime">
                <ref name="featurestate"/>
              </element>
            </optional>
            <optional>
              <element name="synic">
                <ref name="featurestate"/>
              </element>
            </optional>
            <optional>
              <element name="stimer">
                <ref name="stimer"/>
              </element>
            </optional>
            <optional>
              <element name="reset">
                <ref name="featurestate"/>
              </element>
            </optional>
            <optional>
              <element name="vendor_id">
                <ref name="featurestate"/>
                <optional>
                  <attribute name="value">
                    <data type="string">
                      <param name="pattern">[^,]{0,12}</param>
                    </data>
                  </attribute>
                </optional>
              </element>
            </optional>
            <optional>
              <element name="frequencies">
                <ref name="featurestate"/>
              </element>
            </optional>
            <optional>
              <element name="reenlightenment">
                <ref name="featurestate"/>
              </element>
            </optional>
            <optional>
              <element name="tlbflush">
                <ref name="featurestate"/>
              </element>
            </optional>
            <optional>
              <element name="ipi">
                <ref name="featurestate"/>
              </element>
            </optional>
            <optional>
              <element name="evmcs">
                <ref name="featurestate"/>
              </element>
            </optional>
            <optional>
              <element name="avic">
                <ref name="featurestate"/>
              </element>
            </optional>
          </interleave>
        </group>
      </choice>
    </element>
  </define>

  <!-- Hyper-V stimer features -->
  <define name="stimer">
    <interleave>
      <optional>
        <ref name="featurestate"/>
      </optional>
      <optional>
        <element name="direct">
          <ref name="featurestate"/>
        </element>
      </optional>
    </interleave>
  </define>

  <!-- Optional KVM features -->
  <define name="kvm">
    <element name="kvm">
      <interleave>
        <optional>
          <element name="hidden">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="hint-dedicated">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="poll-control">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="pv-ipi">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="dirty-ring">
            <ref name="featurestate"/>
            <optional>
              <attribute name="size">
                <data type="unsignedInt"/>
              </attribute>
            </optional>
          </element>
        </optional>
      </interleave>
    </element>
  </define>

  <!-- Optional Xen features -->
  <define name="xen">
    <element name="xen">
      <interleave>
        <optional>
          <element name="e820_host">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="passthrough">
            <ref name="featurestate"/>
            <optional>
              <attribute name="mode">
                <data type="string">
                  <param name="pattern">(sync_pt|share_pt)</param>
                </data>
              </attribute>
            </optional>
          </element>
        </optional>
      </interleave>
    </element>
  </define>

  <!-- Optional capabilities features -->
  <define name="capabilities">
    <element name="capabilities">
      <ref name="capabilitiespolicy"/>
      <interleave>
        <optional>
          <element name="audit_control">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="audit_write">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="block_suspend">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="chown">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="dac_override">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="dac_read_search">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="fowner">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="fsetid">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="ipc_lock">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="ipc_owner">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="kill">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="lease">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="linux_immutable">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="mac_admin">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="mac_override">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="mknod">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="net_admin">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="net_bind_service">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="net_broadcast">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="net_raw">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="setgid">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="setfcap">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="setpcap">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="setuid">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="sys_admin">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="sys_boot">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="sys_chroot">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="sys_module">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="sys_nice">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="sys_pacct">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="sys_ptrace">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="sys_rawio">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="sys_resource">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="sys_time">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="sys_tty_config">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="syslog">
            <ref name="featurestate"/>
          </element>
        </optional>
        <optional>
          <element name="wake_alarm">
            <ref name="featurestate"/>
          </element>
        </optional>
      </interleave>
    </element>
  </define>

  <define name="pmu">
    <element name="pmu">
      <optional>
        <ref name="featurestate"/>
      </optional>
    </element>
  </define>

  <define name="featurestate">
    <attribute name="state">
      <ref name="virOnOff"/>
    </attribute>
  </define>

  <define name="capabilitiespolicy">
    <attribute name="policy">
      <choice>
        <value>default</value>
        <value>allow</value>
        <value>deny</value>
      </choice>
    </attribute>
  </define>

  <!--
       Optional hypervisor extensions in their own namespace:
         QEMU
    -->
  <define name="qemucmdline">
    <element name="commandline" ns="http://libvirt.org/schemas/domain/qemu/1.0">
      <interleave>
        <zeroOrMore>
          <element name="arg">
            <attribute name="value"/>
          </element>
        </zeroOrMore>
        <zeroOrMore>
          <element name="env">
            <attribute name="name">
              <ref name="filter-param-name"/>
            </attribute>
            <optional>
              <attribute name="value"/>
            </optional>
            <empty/>
          </element>
        </zeroOrMore>
      </interleave>
    </element>
  </define>

  <define name="qemucapabilities">
    <element name="capabilities" ns="http://libvirt.org/schemas/domain/qemu/1.0">
      <interleave>
        <zeroOrMore>
          <element name="add">
            <attribute name="capability"/>
          </element>
        </zeroOrMore>
        <zeroOrMore>
          <element name="del">
            <attribute name="capability"/>
          </element>
        </zeroOrMore>
      </interleave>
    </element>
  </define>

  <define name="qemudeprecation">
    <element name="deprecation" ns="http://libvirt.org/schemas/domain/qemu/1.0">
      <attribute name="behavior">
        <choice>
          <value>none</value>
          <value>omit</value>
          <value>reject</value>
          <value>crash</value>
        </choice>
      </attribute>
    </element>
  </define>

  <define name="qemuoverrideproperty">
    <element name="property" ns="http://libvirt.org/schemas/domain/qemu/1.0">
      <attribute name="name"/>
      <attribute name="type">
        <choice>
          <value>string</value>
          <value>signed</value>
          <value>unsigned</value>
          <value>bool</value>
          <value>remove</value>
        </choice>
      </attribute>
      <optional>
        <attribute name="value"/>
      </optional>
    </element>
  </define>

  <define name="qemuoverride">
    <element name="override" ns="http://libvirt.org/schemas/domain/qemu/1.0">
      <interleave>
        <zeroOrMore>
          <element name="device">
            <attribute name="alias"/>
            <interleave>
              <optional>
                <element name="frontend">
                  <zeroOrMore>
                    <ref name="qemuoverrideproperty"/>
                  </zeroOrMore>
                </element>
              </optional>
            </interleave>
          </element>
        </zeroOrMore>
      </interleave>
    </element>
  </define>


  <!--
       Optional hypervisor extensions in their own namespace:
       LXC
    -->
  <define name="lxcsharens">
    <element name="namespace" ns="http://libvirt.org/schemas/domain/lxc/1.0">
      <interleave>
        <optional>
          <element name="sharenet">
            <attribute name="type">
              <choice>
                <value>netns</value>
                <value>name</value>
                <value>pid</value>
              </choice>
            </attribute>
            <attribute name="value"/>
          </element>
        </optional>
        <optional>
          <element name="shareipc">
            <attribute name="type">
              <choice>
                <value>name</value>
                <value>pid</value>
              </choice>
            </attribute>
            <attribute name="value"/>
          </element>
        </optional>
        <optional>
          <element name="shareuts">
            <attribute name="type">
              <choice>
                <value>name</value>
                <value>pid</value>
              </choice>
            </attribute>
            <attribute name="value"/>
          </element>
        </optional>
      </interleave>
    </element>
  </define>

  <!--
       Optional hypervisor extensions in their own namespace:
         Bhyve
    -->
  <define name="bhyvecmdline">
    <element name="commandline" ns="http://libvirt.org/schemas/domain/bhyve/1.0">
      <zeroOrMore>
        <element name="arg">
          <attribute name="value"/>
        </element>
      </zeroOrMore>
    </element>
  </define>

  <!--
       Optional hypervisor extensions in their own namespace:
         Xen
    -->
  <define name="xencmdline">
    <element name="commandline" ns="http://libvirt.org/schemas/domain/xen/1.0">
      <zeroOrMore>
        <element name="arg">
          <attribute name="value"/>
        </element>
      </zeroOrMore>
    </element>
  </define>

  <!--
       Optional hypervisor extensions in their own namespace:
         vmware
    -->
  <define name="vmwaredatacenterpath">
    <element name="datacenterpath" ns="http://libvirt.org/schemas/domain/vmware/1.0">
      <text/>
    </element>
  </define>

  <!--
       Type library
    -->
  <define name="countCPU">
    <data type="unsignedShort">
      <param name="pattern">[0-9]+</param>
      <param name="minInclusive">1</param>
    </data>
  </define>
  <define name="vcpuid">
    <data type="unsignedShort">
      <param name="pattern">[0-9]+</param>
    </data>
  </define>
  <define name="cpushares">
    <data type="unsignedInt">
      <param name="pattern">[0-9]+</param>
    </data>
  </define>
  <define name="cpuperiod">
    <data type="unsignedLong">
      <param name="pattern">[0-9]+</param>
      <param name="minInclusive">1000</param>
      <param name="maxInclusive">1000000</param>
    </data>
  </define>
  <define name="cpuquota">
    <data type="long">
      <param name="pattern">-?[0-9]+</param>
      <param name="maxInclusive">17592186044415</param>
      <param name="minInclusive">-1</param>
    </data>
  </define>
  <define name="rebootTimeoutDelay">
    <data type="short">
      <param name="minInclusive">-1</param>
    </data>
  </define>
  <!-- weight currently is in range [100, 1000] -->
  <define name="weight">
    <data type="unsignedInt">
      <param name="pattern">[0-9]+</param>
      <param name="minInclusive">100</param>
      <param name="maxInclusive">1000</param>
    </data>
  </define>
  <define name="diskSerial">
    <data type="string">
      <param name="pattern">[A-Za-z0-9_\.\+\- ]+</param>
    </data>
  </define>
  <define name="bridgeMode">
    <data type="string">
      <param name="pattern">(vepa|bridge|private|passthrough)</param>
    </data>
  </define>
  <define name="addrIPorName">
    <choice>
      <ref name="ipAddr"/>
      <ref name="dnsName"/>
    </choice>
  </define>
  <define name="usbIdDefault">
    <data type="string">
      <param name="pattern">-1</param>
    </data>
  </define>
  <define name="usbId">
    <data type="string">
      <param name="pattern">(0x)?[0-9a-fA-F]{1,4}</param>
    </data>
  </define>
  <define name="usbVersion">
    <data type="string">
      <param name="pattern">[0-9]{1,2}.[0-9]{1,2}</param>
    </data>
  </define>
  <define name="usbAddr">
    <data type="string">
      <param name="pattern">(0x)?[0-9a-fA-F]{1,3}</param>
    </data>
  </define>
  <define name="usbClass">
    <data type="string">
      <param name="pattern">(0x)?[0-9a-fA-F]{1,2}</param>
    </data>
  </define>
  <define name="usbPort">
    <data type="string">
      <param name="pattern">((0x)?[0-9a-fA-F]{1,3}\.){0,3}(0x)?[0-9a-fA-F]{1,3}</param>
    </data>
  </define>
  <define name="driveController">
    <data type="string">
      <param name="pattern">[0-9]{1,2}</param>
    </data>
  </define>
  <define name="driveBus">
    <data type="string">
      <param name="pattern">[0-9]{1,2}</param>
    </data>
  </define>
  <define name="driveTarget">
    <data type="string">
      <param name="pattern">[0-9]{1,2}</param>
    </data>
  </define>
  <define name="driveSCSITarget">
    <data type="string">
      <param name="pattern">[0-9]{1,10}</param>
    </data>
  </define>
  <define name="driveUnit">
    <data type="string">
      <param name="pattern">[0-9]{1,5}</param>
    </data>
  </define>
  <define name="driveSCSIUnit">
    <data type="string">
      <param name="pattern">[0-9]{1,20}</param>
    </data>
  </define>
  <define name="timeDelta">
    <data type="string">
      <param name="pattern">(-|\+)?[0-9]+</param>
    </data>
  </define>
  <define name="timeZone">
    <data type="string">
      <param name="pattern">[a-zA-Z0-9_\.\+\-/]+</param>
    </data>
  </define>
  <define name="spaprvioReg">
    <data type="string">
      <param name="pattern">(0x)?[0-9a-fA-F]{1,8}</param>
    </data>
  </define>
  <define name="aliasName">
    <data type="string">
      <param name="pattern">[a-zA-Z0-9_\-.]+</param>
    </data>
  </define>
  <define name="virtioserialPort">
    <data type="string">
      <param name="pattern">[0-9]{1,2}</param>
    </data>
  </define>
  <define name="ccidSlot">
    <data type="string">
      <param name="pattern">[0-9]{1,2}</param>
    </data>
  </define>
  <define name="alias">
    <element name="alias">
      <attribute name="name">
        <ref name="aliasName"/>
      </attribute>
    </element>
    <empty/>
  </define>
  <define name="panic">
    <element name="panic">
      <optional>
        <attribute name="model">
          <choice>
            <value>isa</value>
            <value>pseries</value>
            <value>hyperv</value>
            <value>s390</value>
            <value>pvpanic</value>
          </choice>
        </attribute>
      </optional>
      <interleave>
        <optional>
          <ref name="alias"/>
        </optional>
        <optional>
          <ref name="address"/>
        </optional>
      </interleave>
    </element>
  </define>
  <define name="rawIO">
    <attribute name="rawio">
      <ref name="virYesNo"/>
    </attribute>
  </define>
  <define name="sgIO">
    <attribute name="sgio">
      <choice>
        <value>filtered</value>
        <value>unfiltered</value>
      </choice>
    </attribute>
  </define>

  <define name="coalesce">
    <element name="coalesce">
      <interleave>
        <optional>
          <element name="rx">
            <optional>
              <element name="frames">
                <optional>
                  <attribute name="max">
                    <ref name="unsignedInt"/>
                  </attribute>
                </optional>
                <!--
                    This is how we'd add more Rx-related settings for
                    frames, like irq, high, and low

                <optional>
                  <attribute name="irq">
                    <ref name="unsignedInt"/>
                  </attribute>
                </optional>
                <optional>
                  <attribute name="high">
                    <ref name="unsignedInt"/>
                  </attribute>
                </optional>
                <optional>
                  <attribute name="low">
                    <ref name="unsignedInt"/>
                  </attribute>
                </optional>

              -->
              </element>
            </optional>
            <!--
                This is how we'd add more Rx-related settings, like
                usecs

            <optional>
              <element name="usecs">
                <optional>
                  <attribute name="max">
                    <ref name="unsignedInt"/>
                  </attribute>
                </optional>
                <optional>
                  <attribute name="irq">
                    <ref name="unsignedInt"/>
                  </attribute>
                </optional>
                <optional>
                  <attribute name="high">
                    <ref name="unsignedInt"/>
                  </attribute>
                </optional>
                <optional>
                  <attribute name="low">
                    <ref name="unsignedInt"/>
                  </attribute>
                </optional>
              </element>
            </optional>
              -->
          </element>
        </optional>
        <!--
            This is how you would add more coalesce settings, like
            Tx-related ones

        <optional>
          <element name="tx">
            <optional>
              <element name="frames">
                <optional>
                  <attribute name="max">
                    <ref name="unsignedInt"/>
                  </attribute>
                </optional>
                <optional>
                  <attribute name="irq">
                    <ref name="unsignedInt"/>
                  </attribute>
                </optional>
                <optional>
                  <attribute name="high">
                    <ref name="unsignedInt"/>
                  </attribute>
                </optional>
                <optional>
                  <attribute name="low">
                    <ref name="unsignedInt"/>
                  </attribute>
                </optional>
              </element>
            </optional>
            <optional>
              <element name="usecs">
                <optional>
                  <attribute name="max">
                    <ref name="unsignedInt"/>
                  </attribute>
                </optional>
                <optional>
                  <attribute name="irq">
                    <ref name="unsignedInt"/>
                  </attribute>
                </optional>
                <optional>
                  <attribute name="high">
                    <ref name="unsignedInt"/>
                  </attribute>
                </optional>
                <optional>
                  <attribute name="low">
                    <ref name="unsignedInt"/>
                  </attribute>
                </optional>
              </element>
            </optional>
          </element>
        </optional>
        -->
      </interleave>
    </element>
  </define>

</grammar>