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

  <include href="domaincommon.rng"/>

  <define name="backupEncryption">
    <element name="encryption">
      <attribute name="format">
        <choice>
          <value>luks</value>
        </choice>
      </attribute>
      <optional>
        <attribute name="engine">
          <choice>
            <value>qemu</value>
          </choice>
        </attribute>
      </optional>
      <interleave>
        <ref name="secret"/>
        <optional>
          <element name="cipher">
            <ref name="keycipher"/>
          </element>
          <element name="ivgen">
            <ref name="keyivgen"/>
          </element>
        </optional>
      </interleave>
    </element>
  </define>

  <define name="domainbackup">
    <element name="domainbackup">
      <interleave>
        <optional>
          <element name="incremental">
            <text/>
          </element>
        </optional>
        <choice>
          <group>
            <optional>
              <attribute name="mode">
                <value>push</value>
              </attribute>
            </optional>
            <ref name="backupDisksPush"/>
          </group>
          <group>
            <attribute name="mode">
              <value>pull</value>
            </attribute>
            <interleave>
              <element name="server">
                <optional>
                  <attribute name="tls">
                    <ref name="virYesNo"/>
                  </attribute>
                </optional>
                <choice>
                  <group>
                    <optional>
                      <attribute name="transport">
                        <value>tcp</value>
                      </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>
                  <group>
                    <attribute name="transport">
                      <value>fd</value>
                    </attribute>
                    <attribute name="fdgroup"/>
                  </group>
                </choice>
              </element>
              <ref name="backupDisksPull"/>
            </interleave>
          </group>
        </choice>
      </interleave>
    </element>
  </define>


  <define name="backupDiskMode">
    <optional>
      <choice>
        <attribute name="backupmode">
          <value>full</value>
        </attribute>
        <group>
          <optional>
            <attribute name="backupmode">
              <value>incremental</value>
            </attribute>
          </optional>
          <optional>
            <attribute name="incremental"/>
          </optional>
        </group>
      </choice>
    </optional>
  </define>

  <define name="backupPushDriver">
    <optional>
      <element name="driver">
        <attribute name="type">
          <ref name="storageFormat"/>
        </attribute>
      </element>
    </optional>
  </define>

  <define name="backupPullDriver">
    <optional>
      <element name="driver">
        <attribute name="type">
          <value>qcow2</value>
        </attribute>
      </element>
    </optional>
  </define>

  <define name="backupAttr">
    <optional>
      <attribute name="backup">
        <choice>
          <value>yes</value>
        </choice>
      </attribute>
    </optional>
  </define>

  <define name="backupDisksPush">
    <optional>
      <element name="disks">
        <oneOrMore>
          <element name="disk">
            <attribute name="name">
              <ref name="diskTargetDev"/>
            </attribute>
            <ref name="backupDiskMode"/>
            <choice>
              <group>
                <attribute name="backup">
                  <value>no</value>
                </attribute>
              </group>
              <!-- Allow to plainly select a disk for backup without any other config -->
              <group>
                <ref name="backupAttr"/>
              </group>
              <group>
                <ref name="backupAttr"/>
                <attribute name="type">
                  <value>file</value>
                </attribute>
                <interleave>
                  <optional>
                    <element name="target">
                      <attribute name="file">
                        <ref name="absFilePath"/>
                      </attribute>
                      <interleave>
                        <zeroOrMore>
                          <ref name="devSeclabel"/>
                        </zeroOrMore>
                        <optional>
                          <ref name="backupEncryption"/>
                        </optional>
                      </interleave>
                    </element>
                  </optional>
                  <ref name="backupPushDriver"/>
                </interleave>
              </group>
              <group>
                <ref name="backupAttr"/>
                <attribute name="type">
                  <value>block</value>
                </attribute>
                <interleave>
                  <optional>
                    <element name="target">
                      <attribute name="dev">
                        <ref name="absFilePath"/>
                      </attribute>
                      <interleave>
                        <zeroOrMore>
                          <ref name="devSeclabel"/>
                        </zeroOrMore>
                        <optional>
                          <ref name="backupEncryption"/>
                        </optional>
                      </interleave>
                    </element>
                  </optional>
                  <ref name="backupPushDriver"/>
                </interleave>
              </group>
            </choice>
          </element>
        </oneOrMore>
      </element>
    </optional>
  </define>

  <define name="backupDisksPull">
    <optional>
      <element name="disks">
        <oneOrMore>
          <element name="disk">
            <attribute name="name">
              <ref name="diskTargetDev"/>
            </attribute>
            <ref name="backupDiskMode"/>
            <optional>
              <attribute name="exportname">
                <text/>
              </attribute>
            </optional>
            <optional>
              <attribute name="exportbitmap">
                <text/>
              </attribute>
            </optional>
            <choice>
              <group>
                <attribute name="backup">
                  <value>no</value>
                </attribute>
              </group>
              <group>
                <optional>
                  <ref name="backupAttr"/>
                  <attribute name="type">
                    <value>file</value>
                  </attribute>
                </optional>
                <optional>
                  <interleave>
                    <element name="scratch">
                      <attribute name="file">
                        <ref name="absFilePath"/>
                      </attribute>
                      <interleave>
                        <zeroOrMore>
                          <ref name="devSeclabel"/>
                        </zeroOrMore>
                        <optional>
                          <ref name="backupEncryption"/>
                        </optional>
                      </interleave>
                    </element>
                    <ref name="backupPullDriver"/>
                  </interleave>
                </optional>
              </group>
              <group>
                <ref name="backupAttr"/>
                <attribute name="type">
                  <value>block</value>
                </attribute>
                <interleave>
                  <element name="scratch">
                    <attribute name="dev">
                      <ref name="absFilePath"/>
                    </attribute>
                    <interleave>
                      <zeroOrMore>
                        <ref name="devSeclabel"/>
                      </zeroOrMore>
                      <optional>
                        <ref name="backupEncryption"/>
                      </optional>
                    </interleave>
                  </element>
                  <ref name="backupPullDriver"/>
                </interleave>
              </group>
            </choice>
          </element>
        </oneOrMore>
      </element>
    </optional>
  </define>

</grammar>
