<?xml version="1.0"?>
<!-- A Relax NG schema for the libvirt domain snapshot properties XML format -->
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
  <start>
    <ref name="domainsnapshot"/>
  </start>

  <include href="domaincommon.rng"/>

  <define name="domainsnapshot">
    <element name="domainsnapshot">
      <interleave>
        <optional>
          <element name="name">
            <text/>
          </element>
        </optional>
        <optional>
          <element name="description">
            <text/>
          </element>
        </optional>
        <optional>
          <element name="state">
            <ref name="state"/>
          </element>
        </optional>
        <optional>
          <element name="creationTime">
            <text/>
          </element>
        </optional>
        <optional>
          <element name="memory">
            <choice>
              <attribute name="snapshot">
                <choice>
                  <value>no</value>
                  <value>internal</value>
                </choice>
              </attribute>
              <group>
                <optional>
                  <attribute name="snapshot">
                    <value>external</value>
                  </attribute>
                </optional>
                <attribute name="file">
                  <ref name="absFilePath"/>
                </attribute>
              </group>
            </choice>
            <empty/>
          </element>
        </optional>
        <optional>
          <element name="disks">
            <zeroOrMore>
              <ref name="disksnapshot"/>
            </zeroOrMore>
          </element>
        </optional>
        <optional>
          <element name="active">
            <choice>
              <value>0</value>
              <value>1</value>
            </choice>
          </element>
        </optional>
        <optional>
          <choice>
            <element name="domain">
              <element name="uuid">
                <ref name="UUID"/>
              </element>
            </element>
            <!-- Nested grammar ensures that any of our overrides of
                 storagecommon/domaincommon defines do not conflict
                 with any domain.rng overrides.  -->
            <grammar>
              <include href="domain.rng"/>
            </grammar>
          </choice>
        </optional>
        <optional>
          <element name="parent">
            <element name="name">
              <text/>
            </element>
          </element>
        </optional>
        <optional>
          <element name="cookie">
            <zeroOrMore>
              <ref name="customElement"/>
            </zeroOrMore>
          </element>
        </optional>
      </interleave>
    </element>
  </define>

  <define name="state">
    <choice>
      <value>running</value>
      <value>blocked</value>
      <value>paused</value>
      <value>shutdown</value>
      <value>shutoff</value>
      <value>crashed</value>
      <value>disk-snapshot</value>
    </choice>
  </define>

  <define name="storageSourceExtra" combine="choice">
    <!-- overrides the no-op version in storagecommon.rng -->
    <ref name="disksnapshotdriver"/>
  </define>

  <define name="disksnapshot">
    <element name="disk">
      <attribute name="name">
        <choice>
          <ref name="diskTarget"/>
          <ref name="absFilePath"/>
        </choice>
      </attribute>
      <choice>
        <attribute name="snapshot">
          <value>no</value>
        </attribute>
        <attribute name="snapshot">
          <value>internal</value>
        </attribute>
        <group>
          <optional>
            <attribute name="snapshot">
              <value>external</value>
            </attribute>
          </optional>
          <choice>
            <group>
              <optional>
                <attribute name="type">
                  <value>file</value>
                </attribute>
              </optional>
              <interleave>
                <optional>
                  <element name="source">
                    <optional>
                      <attribute name="file">
                        <ref name="absFilePath"/>
                      </attribute>
                    </optional>
                    <optional>
                      <ref name="storageStartupPolicy"/>
                    </optional>
                    <zeroOrMore>
                      <ref name="devSeclabel"/>
                    </zeroOrMore>
                    <optional>
                      <ref name="diskSourceCommon"/>
                    </optional>
                    <optional>
                      <ref name="encryption"/>
                    </optional>
                    <empty/>
                  </element>
                </optional>
                <ref name="storageSourceExtra"/>
              </interleave>
            </group>
            <group>
              <attribute name="type">
                <value>block</value>
              </attribute>
              <interleave>
                <optional>
                  <element name="source">
                    <attribute name="dev">
                      <ref name="absFilePath"/>
                    </attribute>
                    <zeroOrMore>
                      <ref name="devSeclabel"/>
                    </zeroOrMore>
                    <optional>
                      <ref name="diskSourceCommon"/>
                    </optional>
                    <optional>
                      <ref name="encryption"/>
                    </optional>
                    <empty/>
                  </element>
                </optional>
                <ref name="storageSourceExtra"/>
              </interleave>
            </group>
            <ref name="diskSourceNetwork"/>
          </choice>
        </group>
      </choice>
    </element>
  </define>

  <define name="disksnapshotdriver">
    <optional>
      <element name="driver">
        <optional>
          <attribute name="type">
            <ref name="storageFormatBacking"/>
          </attribute>
        </optional>
        <empty/>
      </element>
    </optional>
  </define>

</grammar>
