<?xml version="1.0"?>
<interfaceDefinition>
  <node name="service">
    <children>
      <node name="dhcpv6-server" owner="${vyos_conf_scripts_dir}/dhcpv6_server.py">
        <properties>
          <help>DHCP for IPv6 (DHCPv6) server</help>
          <priority>900</priority>
        </properties>
        <children>
          #include <include/generic-disable-node.xml.i>
          <node name="global-parameters">
            <properties>
              <help>Additional global parameters for DHCPv6 server</help>
            </properties>
            <children>
              #include <include/name-server-ipv6.xml.i>
            </children>
          </node>
          <leafNode name="preference">
            <properties>
              <help>Preference of this DHCPv6 server compared with others</help>
              <valueHelp>
                <format>u32:0-255</format>
                <description>DHCPv6 server preference (0-255)</description>
              </valueHelp>
              <constraint>
                <validator name="numeric" argument="--range 0-255"/>
              </constraint>
              <constraintErrorMessage>Preference must be between 0 and 255</constraintErrorMessage>
            </properties>
          </leafNode>
          <tagNode name="shared-network-name">
            <properties>
              <help>DHCPv6 shared network name [REQUIRED]</help>
              <constraint>
                <regex>[-_a-zA-Z0-9.]+</regex>
              </constraint>
              <constraintErrorMessage>Invalid DHCPv6 shared network name. May only contain letters, numbers and .-_</constraintErrorMessage>
            </properties>
            <children>
              #include <include/generic-disable-node.xml.i>
              <node name="common-options">
                <properties>
                  <help>Common options to distribute to all clients, including stateless clients</help>
                </properties>
                <children>
                  <leafNode name="info-refresh-time">
                    <properties>
                      <help>Time (in seconds) that stateless clients should wait between refreshing the information they were given</help>
                      <valueHelp>
                        <format>u32:1-4294967295</format>
                        <description>DHCPv6 information refresh time</description>
                      </valueHelp>
                      <constraint>
                        <validator name="numeric" argument="--range 1-4294967295"/>
                      </constraint>
                    </properties>
                  </leafNode>
                  #include <include/dhcp-server-domain-search.xml.i>
                  #include <include/name-server-ipv6.xml.i>
                </children>
              </node>
              <tagNode name="subnet">
                <properties>
                  <help>IPv6 DHCP subnet for this shared network [REQUIRED]</help>
                  <valueHelp>
                    <format>ipv6net</format>
                    <description>IPv6 address and prefix length</description>
                  </valueHelp>
                  <constraint>
                    <validator name="ipv6-prefix"/>
                  </constraint>
                </properties>
                <children>
                  <node name="address-range">
                    <properties>
                      <help>Parameters setting ranges for assigning IPv6 addresses</help>
                    </properties>
                    <children>
                      <tagNode name="prefix">
                        <properties>
                          <help>IPv6 prefix defining range of addresses to assign</help>
                          <valueHelp>
                            <format>ipv6net</format>
                            <description>IPv6 address and prefix length</description>
                          </valueHelp>
                          <constraint>
                            <validator name="ipv6-prefix"/>
                          </constraint>
                        </properties>
                        <children>
                          <leafNode name="temporary">
                            <properties>
                              <help>Address range will be used for temporary addresses</help>
                              <valueless/>
                            </properties>
                          </leafNode>
                        </children>
                      </tagNode>
                      <tagNode name="start">
                        <properties>
                          <help>First in range of consecutive IPv6 addresses to assign</help>
                          <valueHelp>
                            <format>ipv6</format>
                            <description>IPv6 address</description>
                          </valueHelp>
                          <constraint>
                            <validator name="ipv6-address"/>
                          </constraint>
                        </properties>
                        <children>
                          <leafNode name="stop">
                            <properties>
                              <help>Last in range of consecutive IPv6 addresses</help>
                              <valueHelp>
                                <format>ipv6</format>
                                <description>IPv6 address</description>
                              </valueHelp>
                              <constraint>
                                <validator name="ipv6-address"/>
                              </constraint>
                            </properties>
                          </leafNode>
                        </children>
                      </tagNode>
                    </children>
                  </node>
                  #include <include/dhcp-server-domain-search.xml.i>
                  <node name="lease-time">
                    <properties>
                      <help>Parameters relating to the lease time</help>
                    </properties>
                    <children>
                      <leafNode name="default">
                        <properties>
                          <help>Default time (in seconds) that will be assigned to a lease</help>
                          <valueHelp>
                            <format>u32:1-4294967295</format>
                            <description>DHCPv6 valid lifetime</description>
                          </valueHelp>
                          <constraint>
                            <validator name="numeric" argument="--range 1-4294967295"/>
                          </constraint>
                        </properties>
                      </leafNode>
                      <leafNode name="maximum">
                        <properties>
                          <help>Maximum time (in seconds) that will be assigned to a lease</help>
                          <valueHelp>
                            <format>u32:1-4294967295</format>
                            <description>Maximum lease time in seconds</description>
                          </valueHelp>
                          <constraint>
                            <validator name="numeric" argument="--range 1-4294967295"/>
                          </constraint>
                        </properties>
                      </leafNode>
                      <leafNode name="minimum">
                        <properties>
                          <help>Minimum time (in seconds) that will be assigned to a lease</help>
                          <valueHelp>
                            <format>u32:1-4294967295</format>
                            <description>Minimum lease time in seconds</description>
                          </valueHelp>
                          <constraint>
                            <validator name="numeric" argument="--range 1-4294967295"/>
                          </constraint>
                        </properties>
                      </leafNode>
                    </children>
                  </node>
                  #include <include/name-server-ipv6.xml.i>
                  <leafNode name="nis-domain">
                    <properties>
                      <help>NIS domain name for client to use</help>
                      <constraint>
                        <regex>[-_a-zA-Z0-9.]+</regex>
                      </constraint>
                      <constraintErrorMessage>Invalid NIS domain name</constraintErrorMessage>
                    </properties>
                  </leafNode>
                  <leafNode name="nis-server">
                    <properties>
                      <help>IPv6 address of a NIS Server</help>
                      <valueHelp>
                        <format>ipv6</format>
                        <description>IPv6 address of NIS server</description>
                      </valueHelp>
                      <constraint>
                        <validator name="ipv6-address"/>
                      </constraint>
                      <multi/>
                    </properties>
                  </leafNode>
                  <leafNode name="nisplus-domain">
                    <properties>
                      <help>NIS+ domain name for client to use</help>
                      <constraint>
                        <regex>[-_a-zA-Z0-9.]+</regex>
                      </constraint>
                      <constraintErrorMessage>Invalid NIS+ domain name. May only contain letters, numbers and .-_</constraintErrorMessage>
                    </properties>
                  </leafNode>
                  <leafNode name="nisplus-server">
                    <properties>
                      <help>IPv6 address of a NIS+ Server</help>
                      <valueHelp>
                        <format>ipv6</format>
                        <description>IPv6 address of NIS+ server</description>
                      </valueHelp>
                      <constraint>
                        <validator name="ipv6-address"/>
                      </constraint>
                      <multi/>
                    </properties>
                  </leafNode>
                  <node name="prefix-delegation">
                    <properties>
                      <help>Parameters relating to IPv6 prefix delegation</help>
                    </properties>
                    <children>
                      <tagNode name="start">
                        <properties>
                          <help>First in range of IPv6 addresses to be used in prefix delegation</help>
                          <valueHelp>
                            <format>ipv6</format>
                            <description>IPv6 address used in prefix delegation</description>
                          </valueHelp>
                          <constraint>
                            <validator name="ipv6-address"/>
                          </constraint>
                        </properties>
                        <children>
                          <leafNode name="prefix-length">
                            <properties>
                              <help>Length in bits of prefixes to be delegated</help>
                              <valueHelp>
                                <format>u32:32-64</format>
                                <description>Delagated prefix length (32-64)</description>
                              </valueHelp>
                              <constraint>
                                <validator name="numeric" argument="--range 32-64"/>
                              </constraint>
                              <constraintErrorMessage>Delegated prefix length must be between 32 and 64</constraintErrorMessage>
                            </properties>
                          </leafNode>
                          <leafNode name="stop">
                            <properties>
                              <help>Last in range of IPv6 addresses to be used in prefix delegation</help>
                              <valueHelp>
                                <format>ipv6</format>
                                <description>IPv6 address used in prefix delegation</description>
                              </valueHelp>
                              <constraint>
                                <validator name="ipv6-address"/>
                              </constraint>
                            </properties>
                          </leafNode>
                        </children>
                      </tagNode>
                    </children>
                  </node>
                  <leafNode name="sip-server">
                    <properties>
                      <help>IPv6 address of SIP server</help>
                      <valueHelp>
                        <format>ipv6</format>
                        <description>IPv6 address of SIP server</description>
                      </valueHelp>
                      <valueHelp>
                        <format>hostname</format>
                        <description>FQDN of SIP server</description>
                      </valueHelp>
                      <constraint>
                        <validator name="ipv6-address"/>
                        <validator name="fqdn"/>
                      </constraint>
                      <multi/>
                    </properties>
                  </leafNode>
                  <leafNode name="sntp-server">
                    <properties>
                      <help>IPv6 address of an SNTP server for client to use</help>
                      <constraint>
                        <validator name="ipv6-address"/>
                      </constraint>
                      <multi/>
                    </properties>
                  </leafNode>
                  <tagNode name="static-mapping">
                    <properties>
                      <help>Name of static mapping</help>
                      <constraint>
                        <regex>[-_a-zA-Z0-9.]+</regex>
                      </constraint>
                      <constraintErrorMessage>Invalid static mapping name. May only contain letters, numbers and .-_</constraintErrorMessage>
                    </properties>
                    <children>
                      #include <include/generic-disable-node.xml.i>
                      <leafNode name="identifier">
                        <properties>
                          <help>Client identifier (DUID) for this static mapping</help>
                          <valueHelp>
                            <format>h[[:h]...]</format>
                            <description>DUID: colon-separated hex list (as used by isc-dhcp option dhcpv6.client-id)</description>
                          </valueHelp>
                          <constraint>
                            <regex>([0-9A-Fa-f]{1,2}[:])*([0-9A-Fa-f]{1,2})</regex>
                          </constraint>
                          <constraintErrorMessage>Invalid DUID, must be in the format h[[:h]...]</constraintErrorMessage>
                        </properties>
                      </leafNode>
                      <leafNode name="ipv6-address">
                        <properties>
                          <help>Client IPv6 address for this static mapping</help>
                          <valueHelp>
                            <format>ipv6</format>
                            <description>IPv6 address for this static mapping</description>
                          </valueHelp>
                          <constraint>
                            <validator name="ipv6-address"/>
                          </constraint>
                        </properties>
                      </leafNode>
                      <leafNode name="ipv6-prefix">
                        <properties>
                          <help>Client IPv6 prefix for this static mapping</help>
                          <valueHelp>
                            <format>ipv6net</format>
                            <description>IPv6 prefix for this static mapping</description>
                          </valueHelp>
                          <constraint>
                            <validator name="ipv6-prefix"/>
                          </constraint>
                        </properties>
                      </leafNode>
                    </children>
                  </tagNode>
                </children>
              </tagNode>
            </children>
          </tagNode>
        </children>
      </node>
    </children>
  </node>
</interfaceDefinition>