<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  <!--
    Schema for VIB Extensibility Rule Checks
    NOTE: This is not a general check for the VIB 2.0
     descriptor schema, but for specific things pertaining
     to extensibility rules such as file paths and
     userworld resource pool settings.
    
    RELAX NG Compact Schema
    http://www.relaxng.org/
    
  -->
  <start>
    <choice>
      <ref name="PartnerVib"/>
      <ref name="CommunityVib"/>
    </choice>
  </start>
  <define name="PartnerVib">
    <element name="vib">
      <interleave>
        <zeroOrMore>
          <attribute>
            <anyName/>
          </attribute>
        </zeroOrMore>
        <zeroOrMore>
          <element>
            <anyName>
              <except>
                <name>acceptance-level</name>
                <name>file-list</name>
              </except>
            </anyName>
            <zeroOrMore>
              <ref name="AnyNode"/>
            </zeroOrMore>
          </element>
        </zeroOrMore>
        <element name="acceptance-level">
          <choice>
            <value>partner</value>
            <value>signed</value>
          </choice>
        </element>
        <optional>
          <ref name="PartnerFileList"/>
        </optional>
      </interleave>
    </element>
  </define>
  <define name="CommunityVib">
    <element name="vib">
      <interleave>
        <zeroOrMore>
          <attribute>
            <anyName/>
          </attribute>
        </zeroOrMore>
        <zeroOrMore>
          <element>
            <anyName>
              <except>
                <name>acceptance-level</name>
                <name>file-list</name>
                <name>overlay</name>
              </except>
            </anyName>
            <zeroOrMore>
              <ref name="AnyNode"/>
            </zeroOrMore>
          </element>
        </zeroOrMore>
        <optional>
          <element name="overlay">
            <value type="boolean">false</value>
          </element>
        </optional>
        <optional>
          <element name="acceptance-level">
            <choice>
              <value>community</value>
              <value>unsigned</value>
            </choice>
          </element>
        </optional>
        <optional>
          <ref name="CommunityFileList"/>
        </optional>
      </interleave>
    </element>
  </define>
  <!-- Matches the insides of any well-formed XML element -->
  <define name="AnyNode">
    <choice>
      <attribute>
        <anyName/>
      </attribute>
      <text/>
      <element>
        <anyName/>
        <zeroOrMore>
          <ref name="AnyNode"/>
        </zeroOrMore>
      </element>
    </choice>
  </define>
  <define name="PartnerFileList">
    <element name="file-list">
      <zeroOrMore>
        <ref name="PartnerFile"/>
      </zeroOrMore>
    </element>
  </define>
  <define name="CommunityFileList">
    <element name="file-list">
      <zeroOrMore>
        <ref name="CommunityFile"/>
      </zeroOrMore>
    </element>
  </define>
  <define name="PartnerFile">
    <choice>
      <ref name="CommunityFile"/>
      <element name="file">
        <choice>
          <value>etc/vmware/vmware.lic</value>
          <value>etc/vmware/support</value>
          <value>etc/vmware/oem.xml</value>
          <value>etc/vmware/backup.conf</value>
          <value>usr/lib/vmware/hostd/docroot/client/customLinks.xml</value>
          <data type="string">
            <param name="pattern">etc/init\.d/.+</param>
          </data>
          <data type="string">
            <param name="pattern">etc/rc\.local\.d/.+</param>
          </data>
        </choice>
      </element>
    </choice>
  </define>
  <!-- This defines a valid <file> element for community VIBs. -->
  <define name="CommunityFile">
    <element name="file">
      <choice>
        <data type="string">
          <param name="pattern">etc/vmware/shutdown/shutdown\.d/.+</param>
        </data>
        <data type="string">
          <param name="pattern">etc/vmware/pciid/.+</param>
        </data>
        <data type="string">
          <param name="pattern">etc/vmware/vm-support/.+</param>
        </data>
        <data type="string">
          <param name="pattern">etc/vmware/firewall/.+</param>
        </data>
        <data type="string">
          <param name="pattern">etc/vmware/service/.+</param>
        </data>
        <data type="string">
          <param name="pattern">etc/vmware/driver.map.d/.+</param>
        </data>
        <data type="string">
          <param name="pattern">etc/vmware/fallback.map.d/.+</param>
        </data>
        <data type="string">
          <param name="pattern">etc/vmware/default.map.d/.+</param>
        </data>
        <data type="string">
          <param name="pattern">etc/vmware/ihv.map.d/.+</param>
        </data>
        <data type="string">
          <param name="pattern">etc/vmware/oem.map.d/.+</param>
        </data>
        <data type="string">
          <param name="pattern">etc/cim/.+</param>
        </data>
        <data type="string">
          <param name="pattern">etc/config/.+</param>
        </data>
        <data type="string">
          <param name="pattern">etc/init.d/.+</param>
        </data>
        <data type="string">
          <param name="pattern">etc/shutdown.d/.+</param>
        </data>
        <!--
          We really want people to put their binaries in /opt/<vendor>
          as much as possible.
        -->
        <data type="string">
          <param name="pattern">opt/.+</param>
        </data>
        <data type="string">
          <param name="pattern">usr/lib/cim/.+</param>
        </data>
        <data type="string">
          <param name="pattern">usr/lib/pycim/.+</param>
        </data>
        <data type="string">
          <param name="pattern">usr/lib/hostprofiles/plugins/.+</param>
        </data>
        <data type="string">
          <param name="pattern">usr/lib/hostprofiles/locale/.+</param>
        </data>
        <data type="string">
          <param name="pattern">usr/lib/vmware/.+</param>
        </data>
        <data type="string">
          <param name="pattern">usr/lib/vmware-debug/.+</param>
        </data>
        <data type="string">
          <param name="pattern">usr/libexec/jumpstart/plugins/.+</param>
        </data>
        <data type="string">
          <param name="pattern">usr/lib64/vmware/plugin/.+</param>
        </data>
        <data type="string">
          <param name="pattern">usr/share/hwdata/driver.pciids.d/.+</param>
        </data>
        <data type="string">
          <param name="pattern">usr/share/hwdata/fallback.pciids.d/.+</param>
        </data>
        <data type="string">
          <param name="pattern">usr/share/hwdata/default.pciids.d/.+</param>
        </data>
        <data type="string">
          <param name="pattern">usr/share/hwdata/ihv.pciids.d/.+</param>
        </data>
        <data type="string">
          <param name="pattern">usr/share/hwdata/oem.pciids.d/.+</param>
        </data>
        <data type="string">
          <param name="pattern">var/lib/sfcb/registration/.+</param>
        </data>
        <data type="string">
          <param name="pattern">usr/lib64/vmware/.+</param>
        </data>
      </choice>
    </element>
  </define>
</grammar>
