On Fri, Jan 01, 2010 at 08:40:26PM -0500, Laine Stump wrote: > The RNG now supports IPv6 and bonds attached to bridges, along with > some other minor tweaks. All test files from netcf have been copied to > the test directory and added to the xml2xml and schema tests (and they > all pass, of course ;-) > --- > docs/schemas/interface.rng | 316 ++++++++++++++-------- > tests/interfaceschemadata/bond-arp.xml | 6 +- > tests/interfaceschemadata/bond.xml | 6 +- > tests/interfaceschemadata/bridge-bond.xml | 17 ++ > tests/interfaceschemadata/bridge-empty.xml | 6 + > tests/interfaceschemadata/bridge-no-address.xml | 3 +- > tests/interfaceschemadata/bridge-vlan.xml | 2 +- > tests/interfaceschemadata/bridge.xml | 5 +- > tests/interfaceschemadata/bridge42.xml | 3 +- > tests/interfaceschemadata/ipv6-autoconf-dhcp.xml | 7 + > tests/interfaceschemadata/ipv6-autoconf.xml | 6 + > tests/interfaceschemadata/ipv6-dhcp.xml | 6 + > tests/interfaceschemadata/ipv6-local.xml | 5 + > tests/interfaceschemadata/ipv6-static-multi.xml | 8 + > tests/interfaceschemadata/ipv6-static.xml | 7 + > tests/interfacexml2xmltest.c | 9 + > 16 files changed, 288 insertions(+), 124 deletions(-) > create mode 100644 tests/interfaceschemadata/bridge-bond.xml > create mode 100644 tests/interfaceschemadata/bridge-empty.xml > create mode 100644 tests/interfaceschemadata/ipv6-autoconf-dhcp.xml > create mode 100644 tests/interfaceschemadata/ipv6-autoconf.xml > create mode 100644 tests/interfaceschemadata/ipv6-dhcp.xml > create mode 100644 tests/interfaceschemadata/ipv6-local.xml > create mode 100644 tests/interfaceschemadata/ipv6-static-multi.xml > create mode 100644 tests/interfaceschemadata/ipv6-static.xml > > diff --git a/docs/schemas/interface.rng b/docs/schemas/interface.rng > index bed2f0a..a0df9ba 100644 > --- a/docs/schemas/interface.rng > +++ b/docs/schemas/interface.rng > @@ -1,7 +1,13 @@ > <!-- A Relax NG schema for network interfaces --> > <grammar xmlns="http://relaxng.org/ns/structure/1.0" > + xmlns:v="http://netcf.org/xml/version/1.0" > datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> > - <start> > + <!-- Versions for this schema are simple integers that are incremented > + everytime a changed (but backwards compatible) version > + is released. The current version is indicated with the v:serial > + attribute on the start element. > + --> > + <start v:serial="4"> > <choice> > <ref name="ethernet-interface"/> > <ref name="bridge-interface"/> > @@ -109,12 +115,17 @@ > <ref name="on-or-off"/> > </attribute> > </optional> > - <oneOrMore> > + <!-- Bridge forward delay (see 'brctl setfd') --> > + <optional v:since="2"> > + <attribute name="delay"><ref name="timeval"/></attribute> > + </optional> > + <zeroOrMore> > <choice> > <ref name="bare-ethernet-interface"/> > <ref name="bare-vlan-interface"/> > + <ref v:since="2" name="bare-bond-interface"/> > </choice> > - </oneOrMore> > + </zeroOrMore> > </element> > </element> > </define> > @@ -125,90 +136,105 @@ > <!-- > Bonds > --> > - <define name="bond-interface"> > - <element name="interface"> > - <attribute name="type"> > - <value>bond</value> > - </attribute> > - <ref name="name-attr"/> > - <ref name="startmode"/> > - <ref name="mtu"/> > - <ref name="interface-addressing"/> > - <element name="bond"> > - <optional> > - <attribute name="mode"> > - <choice> > - <value>balance-rr</value> > - <!-- The primary interface is the first interface child > - of the bond element --> > - <value>active-backup</value> > - <value>balance-xor</value> > - <value>broadcast</value> > - <value>802.3ad</value> > - <value>balance-tlb</value> > - <value>balance-alb</value> > - </choice> > - </attribute> > - </optional> > + <define name="bond-interface-common"> > + <attribute name="type"> > + <value>bond</value> > + </attribute> > + <ref name="name-attr"/> > + </define> > > - <!-- FIXME: add more attributes > + <define name="bond-element"> > + <element name="bond"> > + <optional> > + <attribute name="mode"> > + <choice> > + <value>balance-rr</value> > + <!-- The primary interface is the first interface child > + of the bond element --> > + <value>active-backup</value> > + <value>balance-xor</value> > + <value>broadcast</value> > + <value>802.3ad</value> > + <value>balance-tlb</value> > + <value>balance-alb</value> > + </choice> > + </attribute> > + </optional> > > - mode == 802.3ad > - ad_select > - lacp_rate > - xmit_hash_policy > + <!-- FIXME: add more attributes > > - mode == active-backup > - fail_over_mac > - num_grat_arp when mode == active-backup (since 3.3.0) > - num_unsol_na when mode == active-backup (ipv6, since 3.4.0) > + mode == 802.3ad > + ad_select > + lacp_rate > + xmit_hash_policy > > - mode == balance-xor > - xmit_hash_policy (since 2.6.3/3.2.2) > - --> > + mode == active-backup > + fail_over_mac > + num_grat_arp when mode == active-backup (since 3.3.0) > + num_unsol_na when mode == active-backup (ipv6, since 3.4.0) > > - <choice> > - <element name="miimon"> > - <!-- miimon frequency in ms --> > - <attribute name="freq"><ref name="uint"/></attribute> > - <optional> > - <attribute name="downdelay"><ref name="uint"/></attribute> > - </optional> > - <optional> > - <attribute name="updelay"><ref name="uint"/></attribute> > - </optional> > - <optional> > - <!-- use_carrier --> > - <attribute name="carrier"> > - <choice> > - <!-- use MII/ETHTOOL ioctl --> > - <value>ioctl</value> > - <!-- use netif_carrier_ok() --> > - <value>netif</value> > - </choice> > - </attribute> > - </optional> > - </element> > - <element name="arpmon"> > - <attribute name="interval"><ref name="uint"/></attribute> > - <attribute name="target"><ref name="ipv4-addr"/></attribute> > - <optional> > - <attribute name="validate"> > - <choice> > - <value>none</value> > - <value>active</value> > - <value>backup</value> > - <value>all</value> > - </choice> > - </attribute> > - </optional> > - </element> > - </choice> > - <oneOrMore> > - <!-- The slave interfaces --> > - <ref name="bare-ethernet-interface"/> > - </oneOrMore> > - </element> > + mode == balance-xor > + xmit_hash_policy (since 2.6.3/3.2.2) > + --> > + > + <choice> > + <element name="miimon"> > + <!-- miimon frequency in ms --> > + <attribute name="freq"><ref name="uint"/></attribute> > + <optional> > + <attribute name="downdelay"><ref name="uint"/></attribute> > + </optional> > + <optional> > + <attribute name="updelay"><ref name="uint"/></attribute> > + </optional> > + <optional> > + <!-- use_carrier --> > + <attribute name="carrier"> > + <choice> > + <!-- use MII/ETHTOOL ioctl --> > + <value>ioctl</value> > + <!-- use netif_carrier_ok() --> > + <value>netif</value> > + </choice> > + </attribute> > + </optional> > + </element> > + <element name="arpmon"> > + <attribute name="interval"><ref name="uint"/></attribute> > + <attribute name="target"><ref name="ipv4-addr"/></attribute> > + <optional> > + <attribute name="validate"> > + <choice> > + <value>none</value> > + <value>active</value> > + <value>backup</value> > + <value>all</value> > + </choice> > + </attribute> > + </optional> > + </element> > + </choice> > + <oneOrMore> > + <!-- The slave interfaces --> > + <ref name="bare-ethernet-interface"/> > + </oneOrMore> > + </element> > + </define> > + > + <define name="bare-bond-interface"> > + <element name="interface"> > + <ref name="bond-interface-common"/> > + <ref name="bond-element"/> > + </element> > + </define> > + > + <define name="bond-interface"> > + <element name="interface"> > + <ref name="bond-interface-common"/> > + <ref name="startmode"/> > + <ref name="mtu"/> > + <ref name="interface-addressing"/> > + <ref name="bond-element"/> > </element> > </define> > > @@ -245,47 +271,87 @@ > different protocols > --> > <define name="interface-addressing"> > - <optional> > - <element name="protocol"> > - <ref name="protocol-ipv4"/> > - </element> > - </optional> > - </define> > - > - <define name="protocol-ipv4"> > - <attribute name="family"> > - <value>ipv4</value> > - </attribute> > <choice> > - <element name="dhcp"> > + <group> > <optional> > - <attribute name="peerdns"> > - <ref name="yes-or-no"/> > - </attribute> > + <ref name="protocol-ipv4"/> > </optional> > - </element> > - <!-- FIXME: This format should be good enough for IPv4 and IPv6, i.e. > + <optional v:since="3"> > + <ref name="protocol-ipv6"/> > + </optional> > + </group> > + <group> > + <optional v:since="3"> > + <ref name="protocol-ipv6"/> > + </optional> > + <optional> > + <ref name="protocol-ipv4"/> > + </optional> > + </group> > + </choice> > + </define> > > - ipaddr="192.168.0.5/24" > - ipaddr="2001:DB8:ABCD::1/64" > + <define name="protocol-ipv4"> > + <element name="protocol"> > + <attribute name="family"> > + <value>ipv4</value> > + </attribute> > + <choice> > + <ref name="dhcp-element"/> > + <group> > + <element name="ip"> > + <attribute name="address"><ref name="ipv4-addr"/></attribute> > + <optional> > + <attribute name="prefix"><ref name="ipv4-prefix"/></attribute> > + </optional> > + </element> > + <optional> > + <element name="route"> > + <attribute name="gateway"><ref name="ipv4-addr"/></attribute> > + </element> > + </optional> > + </group> > + </choice> > + </element> > + </define> > > - but will cause some backend pain > - --> > - <group> > + <define name="protocol-ipv6"> > + <element name="protocol"> > + <attribute name="family"> > + <value>ipv6</value> > + </attribute> > + <optional> > + <element name="autoconf"><empty/></element> > + </optional> > + <optional> > + <ref name="dhcp-element"/> > + </optional> > + <zeroOrMore> > <element name="ip"> > - <attribute name="address"><ref name="ipv4-addr"/></attribute> > + <attribute name="address"><ref name="ipv6-addr"/></attribute> > <optional> > - <attribute name="prefix"><ref name="ipv4-prefix"/></attribute> > + <attribute name="prefix"><ref name="ipv6-prefix"/></attribute> > </optional> > </element> > - <optional> > - <element name="route"> > - <attribute name="gateway"><ref name="ipv4-addr"/></attribute> > - </element> > - </optional> > - </group> > - </choice> > + </zeroOrMore> > + <optional> > + <element name="route"> > + <attribute name="gateway"><ref name="ipv6-addr"/></attribute> > + </element> > + </optional> > + </element> > </define> > + > + <define name="dhcp-element"> > + <element name="dhcp"> > + <optional> > + <attribute name="peerdns"> > + <ref name="yes-or-no"/> > + </attribute> > + </optional> > + </element> > + </define> > + > <!-- Jim Fehlig (<jfehlig@xxxxxxxxxx>) suggest the > following additions to DHCP: > > @@ -342,6 +408,12 @@ > </data> > </define> > > + <define name="timeval"> > + <data type="double"> > + <param name="minInclusive">0</param> > + </data> > + </define> > + > <define name='device-name'> > <data type='string'> > <param name="pattern">[a-zA-Z0-9_\.\-:/]+</param> > @@ -367,13 +439,27 @@ > > <define name='ipv4-addr'> > <data type='string'> > - <param name="pattern">([0-2]?[0-9]?[0-9]\.){3}[0-2]?[0-9]?[0-9]</param> > + <param name="pattern">(((25[0-5])|(1[0-9]{2})|(2[0-4][0-9])|([0-9]{1,2}))\.){3}((25[0-5])|(1[0-9]{2})|(2[0-4][0-9])|([0-9]{1,2}))</param> > </data> > </define> > > <define name='ipv4-prefix'> > + <data type='unsignedInt'> > + <param name="maxInclusive">32</param> > + </data> > + </define> > + > + <!-- Based on http://blog.mes-stats.fr/2008/10/09/regex-ipv4-et-ipv6 --> > + <define name='ipv6-addr'> > <data type='string'> > - <param name="pattern">[1-9]|[12][0-9]|3[0-2]</param> > + <!-- To understand this better, take apart the toplevel '|'s --> > + <param name="pattern">(([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((((25[0-5])|(1[0-9]{2})|(2[0-4][0-9])|([0-9]{1,2})))\.){3}(((25[0-5])|(1[0-9]{2})|(2[0-4][0-9])|([0-9]{1,2}))))|(([0-9A-Fa-f]{1,4}:){0,5}:((((25[0-5])|(1[0-9]{2})|(2[0-4][0-9])|([0-9]{1,2})))\.){3}(((25[0-5])|(1[0-9]{2})|(2[0-4][0-9])|([0-9]{1,2}))))|(::([0-9A-Fa-f]{1,4}:){0,5}((((25[0-5])|(1[0-9]{2})|(2[0-4][0-9])|([0-9]{1,2})))\.){3}(((25[0-5])|(1[0-9]{2})|(2[0-4][0-9])|([0-9]{1,2}))))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:)</param> > + </data> > + </define> > + > + <define name='ipv6-prefix'> > + <data type='unsignedInt'> > + <param name="maxInclusive">128</param> > </data> > </define> > > diff --git a/tests/interfaceschemadata/bond-arp.xml b/tests/interfaceschemadata/bond-arp.xml > index 7b4ed6f..69e1d98 100644 > --- a/tests/interfaceschemadata/bond-arp.xml > +++ b/tests/interfaceschemadata/bond-arp.xml > @@ -6,7 +6,9 @@ > </protocol> > <bond mode='active-backup'> > <arpmon interval='100' target='192.168.50.1' validate='active'/> > - <interface type='ethernet' name='eth1'/> > - <interface type='ethernet' name='eth0'/> > + <interface type='ethernet' name='eth1'> > + </interface> > + <interface type='ethernet' name='eth0'> > + </interface> > </bond> > </interface> > diff --git a/tests/interfaceschemadata/bond.xml b/tests/interfaceschemadata/bond.xml > index 81b92e3..c4e6d40 100644 > --- a/tests/interfaceschemadata/bond.xml > +++ b/tests/interfaceschemadata/bond.xml > @@ -6,7 +6,9 @@ > </protocol> > <bond mode='active-backup'> > <miimon freq='100' updelay='10' carrier='ioctl'/> > - <interface type='ethernet' name='eth1'/> > - <interface type='ethernet' name='eth0'/> > + <interface type='ethernet' name='eth1'> > + </interface> > + <interface type='ethernet' name='eth0'> > + </interface> > </bond> > </interface> > diff --git a/tests/interfaceschemadata/bridge-bond.xml b/tests/interfaceschemadata/bridge-bond.xml > new file mode 100644 > index 0000000..a8c30b9 > --- /dev/null > +++ b/tests/interfaceschemadata/bridge-bond.xml > @@ -0,0 +1,17 @@ > +<interface type='bridge' name='br0'> > + <start mode='onboot'/> > + <mtu size='1500'/> > + <bridge stp='off'> > + <interface type='ethernet' name='eth2'> > + </interface> > + <interface type='bond' name='bond0'> > + <bond mode='active-backup'> > + <miimon freq='100' updelay='10' carrier='ioctl'/> > + <interface type='ethernet' name='eth1'> > + </interface> > + <interface type='ethernet' name='eth0'> > + </interface> > + </bond> > + </interface> > + </bridge> > +</interface> > diff --git a/tests/interfaceschemadata/bridge-empty.xml b/tests/interfaceschemadata/bridge-empty.xml > new file mode 100644 > index 0000000..72861e6 > --- /dev/null > +++ b/tests/interfaceschemadata/bridge-empty.xml > @@ -0,0 +1,6 @@ > +<interface type='bridge' name='br0'> > + <start mode='onboot'/> > + <mtu size='1500'/> > + <bridge stp='off'> > + </bridge> > +</interface> > diff --git a/tests/interfaceschemadata/bridge-no-address.xml b/tests/interfaceschemadata/bridge-no-address.xml > index cddafb1..7757534 100644 > --- a/tests/interfaceschemadata/bridge-no-address.xml > +++ b/tests/interfaceschemadata/bridge-no-address.xml > @@ -5,6 +5,7 @@ > <interface type='ethernet' name='eth0'> > <mac address='ab:bb:cc:dd:ee:ff'/> > </interface> > - <interface type='ethernet' name='eth1'/> > + <interface type='ethernet' name='eth1'> > + </interface> > </bridge> > </interface> > diff --git a/tests/interfaceschemadata/bridge-vlan.xml b/tests/interfaceschemadata/bridge-vlan.xml > index 77f992d..559ebc4 100644 > --- a/tests/interfaceschemadata/bridge-vlan.xml > +++ b/tests/interfaceschemadata/bridge-vlan.xml > @@ -6,7 +6,7 @@ > <bridge stp='off'> > <interface type='vlan' name='eth0.42'> > <vlan tag='42'> > - <interface name='eth0'/> > + <interface name='eth0'/> > </vlan> > </interface> > </bridge> > diff --git a/tests/interfaceschemadata/bridge.xml b/tests/interfaceschemadata/bridge.xml > index 1f17114..2535edf 100644 > --- a/tests/interfaceschemadata/bridge.xml > +++ b/tests/interfaceschemadata/bridge.xml > @@ -4,10 +4,11 @@ > <protocol family='ipv4'> > <dhcp/> > </protocol> > - <bridge stp='off'> > + <bridge stp='off' delay='0.01'> > <interface type='ethernet' name='eth0'> > <mac address='ab:bb:cc:dd:ee:ff'/> > </interface> > - <interface type='ethernet' name='eth1'/> > + <interface type='ethernet' name='eth1'> > + </interface> > </bridge> > </interface> > diff --git a/tests/interfaceschemadata/bridge42.xml b/tests/interfaceschemadata/bridge42.xml > index c6639ab..199b62c 100644 > --- a/tests/interfaceschemadata/bridge42.xml > +++ b/tests/interfaceschemadata/bridge42.xml > @@ -2,6 +2,7 @@ > <start mode='onboot'/> > <mtu size='1500'/> > <bridge stp='off'> > - <interface type='ethernet' name='eth42'/> > + <interface type='ethernet' name='eth42'> > + </interface> > </bridge> > </interface> > diff --git a/tests/interfaceschemadata/ipv6-autoconf-dhcp.xml b/tests/interfaceschemadata/ipv6-autoconf-dhcp.xml > new file mode 100644 > index 0000000..9ea716d > --- /dev/null > +++ b/tests/interfaceschemadata/ipv6-autoconf-dhcp.xml > @@ -0,0 +1,7 @@ > +<interface type='ethernet' name='eth0'> > + <start mode='onboot'/> > + <protocol family='ipv6'> > + <autoconf/> > + <dhcp/> > + </protocol> > +</interface> > diff --git a/tests/interfaceschemadata/ipv6-autoconf.xml b/tests/interfaceschemadata/ipv6-autoconf.xml > new file mode 100644 > index 0000000..eda0ea7 > --- /dev/null > +++ b/tests/interfaceschemadata/ipv6-autoconf.xml > @@ -0,0 +1,6 @@ > +<interface type='ethernet' name='eth0'> > + <start mode='onboot'/> > + <protocol family='ipv6'> > + <autoconf/> > + </protocol> > +</interface> > diff --git a/tests/interfaceschemadata/ipv6-dhcp.xml b/tests/interfaceschemadata/ipv6-dhcp.xml > new file mode 100644 > index 0000000..7439539 > --- /dev/null > +++ b/tests/interfaceschemadata/ipv6-dhcp.xml > @@ -0,0 +1,6 @@ > +<interface type='ethernet' name='eth0'> > + <start mode='onboot'/> > + <protocol family='ipv6'> > + <dhcp/> > + </protocol> > +</interface> > diff --git a/tests/interfaceschemadata/ipv6-local.xml b/tests/interfaceschemadata/ipv6-local.xml > new file mode 100644 > index 0000000..895d0f7 > --- /dev/null > +++ b/tests/interfaceschemadata/ipv6-local.xml > @@ -0,0 +1,5 @@ > +<interface type='ethernet' name='eth0'> > + <start mode='onboot'/> > + <protocol family='ipv6'> > + </protocol> > +</interface> > diff --git a/tests/interfaceschemadata/ipv6-static-multi.xml b/tests/interfaceschemadata/ipv6-static-multi.xml > new file mode 100644 > index 0000000..f0cb00b > --- /dev/null > +++ b/tests/interfaceschemadata/ipv6-static-multi.xml > @@ -0,0 +1,8 @@ > +<interface type='ethernet' name='eth0'> > + <start mode='onboot'/> > + <protocol family='ipv6'> > + <ip address='3ffe:ffff:0:5::1' prefix='128'/> > + <ip address='3ffe:ffff:0:5::3' prefix='128'/> > + <ip address='3ffe:ffff:0:5::5' prefix='128'/> > + </protocol> > +</interface> > diff --git a/tests/interfaceschemadata/ipv6-static.xml b/tests/interfaceschemadata/ipv6-static.xml > new file mode 100644 > index 0000000..e43d2a2 > --- /dev/null > +++ b/tests/interfaceschemadata/ipv6-static.xml > @@ -0,0 +1,7 @@ > +<interface type='ethernet' name='eth0'> > + <start mode='onboot'/> > + <protocol family='ipv6'> > + <ip address='3ffe:ffff:0:5::1' prefix='128'/> > + <route gateway='3ffe:ffff:1234:5678::1'/> > + </protocol> > +</interface> > diff --git a/tests/interfacexml2xmltest.c b/tests/interfacexml2xmltest.c > index ed3093c..d8f1b43 100644 > --- a/tests/interfacexml2xmltest.c > +++ b/tests/interfacexml2xmltest.c > @@ -83,11 +83,20 @@ mymain(int argc, char **argv) > DO_TEST("ethernet-static-no-prefix"); > DO_TEST("bridge"); > DO_TEST("bridge42"); > + DO_TEST("bridge-bond"); > + DO_TEST("bridge-empty"); > + DO_TEST("bridge-no-address"); > DO_TEST("bridge-vlan"); > DO_TEST("bridge-no-address"); > DO_TEST("vlan"); > DO_TEST("bond"); > DO_TEST("bond-arp"); > + DO_TEST("ipv6-autoconf-dhcp"); > + DO_TEST("ipv6-autoconf"); > + DO_TEST("ipv6-dhcp"); > + DO_TEST("ipv6-local"); > + DO_TEST("ipv6-static-multi"); > + DO_TEST("ipv6-static"); > > return (ret==0 ? EXIT_SUCCESS : EXIT_FAILURE); > } ACK Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list