[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nm-wg] XML response schema cleanup



Hi all,

I wasn't able to quite finish "cleaning up" the response schema, but I got far enough that I figured I should send out something for others to look at, and explain myself a bit.

I had 3 goals when looking at that schema again (1) break it into "modules" that would allow re-use with the request schema, (2) to simplify anything that was too tricky for its own good, and (3) to allow generic results and multiple characteristics.

In short, I started along the road to (1), am still only part-way into (2), and think I managed to get (3) finished. More detail follows.

(1) XML-Schema has an "include" directive that is intended for doing exactly what we want here: taking a bunch of stuff that belongs in the same namespace and splitting it into different physical files. Therefore, I created "nm_root.xsd" to house the root schema, and had it include sections for subject (NetworkEntity types), results (included statistics here), tools, and parameters. I have finished subject and started on results. These are the three attached files.

(2) I made one important change: I took a section called "tool" out of the "NodeType" definition and instead placed an element called "endpoint" (of type NetworkAddress) under the "methodology" section. The purpose of "tool" was to allow different tool settings to be reported at each endpoint. However, I think it is easier to understand if we allow the entire "methodology" section to be repeated up to two times, and then provide a way of associating the methodology with a given endpoint, thus my new "endpoint" element. This is all in the "nm_root.xsd" file, in case you're still reading this.

(3) To allow generic results, I simply removed the attribute "abstract=true" from the base "ResultType". This should allow any content in there. For multiple characteristics, I added an envelope "networkMeasurementSet" as the root element, containing within it one or more of the original "networkMeasurement" elements.

Whew! I'm tired. In these schemas I apologize for some unnecessary close-tags, but XEmacs in SGML mode wouldn't indent properly without them. We should be able to trivially remove these later if it really bothers anyone.

- Dan
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"; 
  targetNamespace="http://www.ggf.org/namespaces/2004/01/gridNetworkMonitoring";
  xmlns="http://www.ggf.org/namespaces/2004/01/gridNetworkMonitoring";
  elementFormDefault="qualified">
  <!--
       This is the "main" file of a multi-file schema.
       The other files in the schema are included below.
  -->
  <!-- Subject -->
  <xs:include schemaLocation="nm_subject.xsd"></xs:include>
  <!-- Result -->
  <xs:include schemaLocation="nm_result.xsd"></xs:include>
  <!-- Tool -->
  <xs:include schemaLocation="nm_tool.xsd"></xs:include>
  <!-- Parameters -->
  <xs:include schemaLocation="nm_parameters.xsd"></xs:include>
  <!--
        End of includes 
  -->

  <xs:annotation>
    <xs:documentation>
      This document provides a schema for publishing network
      measurement data. It is based on the GGF NM-WG document: "A Hierarchy of Network
      Performance Characteristics for Grid Applications and Services". Naming of
      characteristics should follow the conventions of the GGF DAMED-WG document,
      "An Analysis of 'Top N' Event Event Descriptions".
    </xs:documentation>
  </xs:annotation>

  <xs:element name="networkMeasurementSet">
    <xs:annotation>
      <xs:documentation>
        One or more network measurements.
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="NetworkMeasurement" minOccurs="1" maxOccurs="unbounded"></xs:element>
    </xs:sequence>
  </xs:element>
  
  <xs:element name="networkMeasurement">
      <xs:annotation>
        <xs:documentation>
          Report of a network measurement.
        </xs:documentation>
      </xs:annotation>
      <xs:complexType>
        <xs:sequence>

        <xs:element name="characteristic" type="xs:token">
            <xs:annotation>
              <xs:documentation>
                Network characteristic name
              </xs:documentation>
            </xs:annotation>          
        </xs:element>

        <!-- NEW: "Inlined" the result set -->
        <xs:element name="results">
          <xs:complexType>
            <xs:sequence>

              <xs:element name="resultSet" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    
                    <xs:element name="timestamp" type="TimestampType">
                      <xs:annotation>
                        <xs:documentation>
                          Timestamp for all results and statistics. May be
                          overridden by timestamps on individual
                          results or statistics.
                        </xs:documentation>
                      </xs:annotation>
                    </xs:element>

                    <xs:element name="result" type="ResultType" minOccurs="0" maxOccurs="unbounded">
                      <xs:annotation>
                        <xs:documentation>
                          Some result values.
                        </xs:documentation>
                      </xs:annotation>
                    </xs:element>

                    <xs:element name="statistic" type="StatisticType" minOccurs="0" maxOccurs="unbounded">
                      <xs:annotation>
                        <xs:documentation>
                          Some statistics "about" the result values.
                        </xs:documentation>
                      </xs:annotation>
                    </xs:element>

                  </xs:sequence>
                </xs:complexType>
              </xs:element>

            </xs:sequence>
          </xs:complexType>
        </xs:element>

        <xs:element name="subject" type="NetworkEntityType">
          <xs:annotation>
            <xs:documentation>
              The hosts and networks that are being tested.
            </xs:documentation>
          </xs:annotation>
        </xs:element>

        <!-- May occur up to twice: once for source, once for destination -->
        <xs:element name="methodology" minOccurs="0" maxOccurs="2">
          <xs:annotation>
            <xs:documentation>
              What test was run, and how it was run, in order to collect the measurement.
            </xs:documentation>
          </xs:annotation>
          <xs:complexType>
            <xs:sequence>

              <!-- NEW: Replaces <tool> sub-section of NodeType -->
              <xs:element name="endpoint" type="NetworkAddressType" minOccurs="0">
                <xs:annotation>
                  <xs:documentation>
                    To which endpoint in a network path this information applies.
                    If omitted, it means that it applies to any and all endpoints.
                  </xs:documentation>
                </xs:annotation>
              </xs:element>

              <xs:element name="tool" type="ToolType">
                <xs:annotation>
                  <xs:documentation>
                    The tool used to perform the measurement
                  </xs:documentation>
                </xs:annotation>
              </xs:element>

              <xs:element name="parameters" type="ParameterType"
                minOccurs="0" maxOccurs="unbounded">
                <xs:annotation>
                  <xs:documentation>
                    Tool/test parameters used for this measurement.
                  </xs:documentation>
                </xs:annotation>
              </xs:element>

            </xs:sequence>
          </xs:complexType>
        </xs:element>

      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"; 
  targetNamespace="http://www.ggf.org/namespaces/2004/01/gridNetworkMonitoring";
  xmlns="http://www.ggf.org/namespaces/2004/01/gridNetworkMonitoring";
  elementFormDefault="qualified">

  <!-- Abstract base for all network entity types -->
  <xs:complexType name="NetworkEntityType" abstract="true"></xs:complexType>

  <!-- Path -->
  <xs:complexType name="NetworkPathType">
    <xs:annotation>
      <xs:documentation>
        Path between a network source and destination node
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="NetworkEntityType">
        <xs:sequence>
          <xs:element name="source" type="NodeType" minOccurs="0"></xs:element>
          <xs:element name="destination" type="NodeType" minOccurs="0"></xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- Node -->
  <xs:complexType name="NodeType" abstract="true">
    <xs:annotation>
      <xs:documentation>
        A network node
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="NetworkEntityType">
        <xs:sequence>
          <xs:element name="name" type="xs:string" minOccurs="0">
            <xs:annotation>
              <xs:documentation>
                Optional node name, in addition to network address.
              </xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element name="address" type="NetworkAddressType"></xs:element>
<!--
          NEW: Removed! See 'endpoint' under root <methodology> element

          <xs:element name="tool" type="SoftwareDescriptionType" minOccurs="0">
            <xs:annotation>
              <xs:documentation>
                If the tool used at this node is in any way
                different from the one described in the
                methodology section, the differences are shown
                here.
              </xs:documentation>
            </xs:annotation>
          </xs:element>
-->
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- Internal node, abstract supertype of Router -->
  <xs:complexType name="InternalNodeType" abstract="true">
    <xs:complexContent>
      <xs:extension base="NodeType"></xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- Router -->
  <xs:complexType name="RouterType">
    <xs:complexContent>
      <xs:extension base="InternalNodeType"></xs:extension>
    </xs:complexContent>
  </xs:complexType>
  
  <!-- Hop -->
  <xs:complexType name="HopType">
    <xs:complexContent>
      <xs:extension base="NetworkPathType"></xs:extension>
    </xs:complexContent>
  </xs:complexType>
  
  <!-- Network address, supertype of IP address -->
  <xs:complexType name="NetworkAddressType" abstract="true">
    <xs:annotation>
      <xs:documentation>Abstract network address</xs:documentation>
    </xs:annotation>
  </xs:complexType>

  <!-- IP (v4 or v6) address -->
  <xs:complexType name="IPAddressType">
    <xs:annotation>
      <xs:documentation>
        Internet Protocol address
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="NetworkAddressType">
        <xs:sequence>
          <xs:element name="IP" type="xs:string"></xs:element>
          <xs:element name="port" type="xs:int" minOccurs="0"></xs:element>
        </xs:sequence>
        <xs:attribute name="version" type="xs:token" default="4">
          <xs:annotation>
            <xs:documentation>
              Internet Protocol version (4 or 6)
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"; 
  targetNamespace="http://www.ggf.org/namespaces/2004/01/gridNetworkMonitoring";
  xmlns="http://www.ggf.org/namespaces/2004/01/gridNetworkMonitoring";
  elementFormDefault="qualified">

  <!-- Result elements. These use types defined below. -->

  <xs:element name="path.delay.roundTrip" type="DelayType">
  </xs:element>
  <xs:element name="path.delay.oneWay" type="DelayType">
  </xs:element>

  <xs:element name="path.loss.roundTrip" type="PathLossType">
  </xs:element>
  <xs:element name="path.loss.oneWay" type="PathLossType" >
  </xs:element>

  <xs:element name="path.delay.jitter.roundTrip" type="PathDelayJitterType" >
  </xs:element>
  <xs:element name="path.delay.jitter.oneWay" type="PathDelayJitterType" >
  </xs:element>

  <xs:element name="path.reordering.oneWay" type="PathReorderingType">
  </xs:element>

  <xs:element name="path.bandwidth.utilization" type="BandwidthType">
  </xs:element>

  <xs:element name="path.bandwidth.capacity" type="BandwidthType">
  </xs:element>

  <!--
  ************
  Result types
  ************
  -->

  <!-- Abstract base type for a result. Use this for generic types. -->

  <xs:complexType name="ResultType">
    <xs:annotation>
      <xs:documentation>
        Result of performing a network test
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>

      <!-- timestamp -->
      <xs:element name="timestamp" type="TimestampType" minOccurs="0">
        <xs:annotation>
          <xs:documentation>
            Timestamp for the result. It is optional so that multiple
            results can share the same timestamp (avoiding redundancy).
          </xs:documentation>
        </xs:annotation>
      </xs:element>

    </xs:sequence>
  </xs:complexType>

  <!-- Delay -->
  <xs:complexType name="DelayType">
    <xs:complexContent>
      <xs:extension base="ResultType">
        <xs:sequence>

          <xs:element name="delay">
            <xs:annotation>
              <xs:documentation>
                From IETF. One way Delay
                (http://www.ietf.org/rfc/rfc2679.txt), Round Trip Delay
                (http://www.ietf.org/rfc/rfc2681.txt).
              </xs:documentation>
            </xs:annotation>
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:decimal">
                  <xs:attribute name="units" type="xs:token" default="ms"></xs:attribute>
                </xs:extension>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>

        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- (Path) Loss -->
  <xs:complexType name="PathLossType">
    <xs:annotation>
      <xs:documentation>
        From IETF. One way Delay
        (http://www.ietf.org/rfc/rfc2679.txt), Round Trip Delay
        (http://www.ietf.org/rfc/rfc2681.txt).
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="ResultType">
        <xs:sequence>

          <xs:element name="lossDistance">
            <xs:annotation>
              <xs:documentation>
                Number of packets since the previous loss (See RFC3357)
              </xs:documentation>
            </xs:annotation>
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:int">
                  <xs:attribute name="units" type="xs:token" fixed="packets"></xs:attribute>
                </xs:extension>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>

          <xs:element name="lossPeriod">
            <xs:annotation>
              <xs:documentation>
                Number of groups of lost packets (See RFC3357)
              </xs:documentation>
            </xs:annotation>
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:int">
                  <xs:attribute name="units" type="xs:token" fixed="packet-groups"></xs:attribute>
                </xs:extension>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>

          <xs:element name="noticeableRate">
            <xs:annotation>
              <xs:documentation>
                Percent of packets lost where if the distance between
                the lost packet and the previously lost packet is no
                greater than the "loss constraint" (See RFC3357)
              </xs:documentation>
            </xs:annotation>
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:int">
                  <xs:attribute name="units" type="xs:token" fixed="percent"></xs:attribute>
                </xs:extension>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>

          <xs:element name="periodTotal">
            <xs:annotation>
              <xs:documentation>
                Total number of loss periods (See RFC3357)
              </xs:documentation>
            </xs:annotation>
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:int">
                  <xs:attribute name="units" type="xs:token" fixed="loss-periods"></xs:attribute>
                </xs:extension>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>

	<xs:element name="periodLengths">
            <xs:annotation>
              <xs:documentation>
                Number of packets in a burst of loss (See RFC3357)
              </xs:documentation>
            </xs:annotation>
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:int">
                  <xs:attribute name="units" type="xs:token" fixed="packets"></xs:attribute>
                </xs:extension>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>

	<xs:element name="interLossperiodLengths">
            <xs:annotation>
              <xs:documentation>
                Number of packets between bursts of loss (See RFC3357)
              </xs:documentation>
            </xs:annotation>
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:int">
                  <xs:attribute name="units" type="xs:token" fixed="packets"></xs:attribute>
                </xs:extension>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>

	<xs:element name="numPacketsLost">
            <xs:annotation>
              <xs:documentation>
                Number of packets lost during the test (See RFC3357)
              </xs:documentation>
            </xs:annotation>
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:int">
                  <xs:attribute name="units" type="xs:token" fixed="packets"></xs:attribute>
                </xs:extension>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>

          <xs:element name="percentLoss">
            <xs:annotation>
              <xs:documentation>
                Average packet loss (in percent) (See RFC2680)
              </xs:documentation>
            </xs:annotation>
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:int">
                  <xs:attribute name="units" type="xs:token" fixed="percent"></xs:attribute>
                </xs:extension>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>

        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- (Path) Delay jitter -->
  <xs:complexType name="PathDelayJitterType">
    <xs:annotation>
      <xs:documentation>
        See the following IETF documents: Delay Variation (Jitter): http://www.ietf.org/rfc/rfc3393.txt
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="ResultSetType">
        <xs:sequence>

          <xs:element name="jitterPeakToPeakIpdvResult">
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:decimal">
                  <xs:attribute name="units" type="xs:token"></xs:attribute>
                </xs:extension>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>

          <xs:element name="jitterResult">
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:decimal">
                  <xs:attribute name="units" type="xs:token"></xs:attribute>
                </xs:extension>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>

        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
	

  <xs:complexType name="PathReorderingType">
    <xs:annotation>
      <xs:documentation>
        See the following IETF documents:
        http://www.ietf.org/internet-drafts/draft-ietf-ippm-reordering-02.txt
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="ResultType">
        <xs:sequence>

        <xs:element name="lateTimeResult">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:decimal">
                <xs:attribute name="units" type="xs:token" default="ms"></xs:attribute>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>

        <xs:element name="gapResult">
          <xs:annotation>
            <xs:documentation>
              Number of positions out of order
            </xs:documentation>
          </xs:annotation>
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:decimal">
                <xs:attribute name="units" type="xs:token" fixed="positions"></xs:attribute>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>

        <xs:element name="percentReorderedResult">
          <xs:annotation>
            <xs:documentation>
              Percent of packets reordered
            </xs:documentation>
          </xs:annotation>
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:int">
                <xs:attribute name="units" type="xs:token" fixed="percent"></xs:attribute>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>

      </xs:sequence>
    </xs:extension>
    </xs:complexContent>
  </xs:complexType>

<!-- ===============   stopped here   =========================== -->

  <xs:complexType name="BandwidthType">
    <xs:complexContent>
      <xs:extension base="ResultType">
        <xs:sequence>
          <xs:element ref="bandwidthBottleneckResult" minOccurs="0"/>
            <xs:element ref="bandwidthResult"/>
            </xs:sequence>
          </xs:extension>
        </xs:complexContent>
      </xs:complexType>
      <xs:element name="bandwidthBottleneckResult">
		<xs:annotation>
			<xs:documentation>which hop is the bottleneck ("tight link")</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="ResultType">
					<xs:sequence>
						<xs:group ref="HopValueGroup"/>
					</xs:sequence>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<xs:element name="bandwidthResult">
		<xs:annotation>
			<xs:documentation>bandwidth of path</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="ResultType">
					<xs:sequence>
						<xs:group ref="DoubleValueGroup"/>
					</xs:sequence>
					<xs:attribute name="units" type="xs:token" default="Mb/s"/>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<xs:element name="path.bandwidth.achievable.TCP" type="BandwidthAchievableType" substitutionGroup="resultSet">
		<xs:annotation>
			<xs:documentation>Result set for indicated characteristic</xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:element name="path.bandwidth.achievable.TCP.multiStream" type="BandwidthAchievableType" substitutionGroup="resultSet">
		<xs:annotation>
			<xs:documentation>Result set for indicated characteristic</xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:element name="path.bandwidth.achievable.UDP" type="BandwidthAchievableType" substitutionGroup="resultSet">
		<xs:annotation>
			<xs:documentation>Result set for indicated characteristic</xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:complexType name="BandwidthAchievableType">
		<xs:complexContent>
			<xs:extension base="ResultSetType">
				<xs:sequence>
					<xs:element ref="achievableBottleneckResult" minOccurs="0"/>
					<xs:element ref="achievableThroughputResult"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:element name="achievableBottleneckResult">
		<xs:annotation>
			<xs:documentation>indication of what is the bottleneck (network, CPU, NIC, memory, disk, etc.)</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="ResultType">
					<xs:sequence>
						<xs:group ref="StringValueGroup"/>
					</xs:sequence>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<xs:element name="achievableThroughputResult">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="ResultType">
					<xs:sequence>
						<xs:group ref="DoubleValueGroup"/>
					</xs:sequence>
					<xs:attribute name="units" type="xs:token" default="Mb/s"/>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<xs:element name="path.bandwidth.available" type="BandwidthAvailableType" substitutionGroup="resultSet">
		<xs:annotation>
			<xs:documentation>Result set for indicated characteristic</xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:complexType name="BandwidthAvailableType">
		<xs:complexContent>
			<xs:extension base="ResultSetType">
				<xs:sequence>
					<xs:element ref="mtbfResult"/>
					<xs:element ref="downsResult"/>
					<xs:element ref="medianOutageLengthResult"/>
					<xs:element ref="percentUpResult"/>
					<xs:element ref="bandwidthBottleneckResult" minOccurs="0"/>
					<xs:element ref="bandwidthResult"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:element name="mtbfResult">
		<xs:annotation>
			<xs:documentation>Mean Time Between Failures</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="ResultType">
					<xs:sequence>
						<xs:group ref="IntValueGroup"/>
					</xs:sequence>
					<xs:attribute name="units" type="xs:token" default="s"/>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<xs:element name="downsResult">
		<xs:annotation>
			<xs:documentation>Number of periods when path was not available</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="ResultType">
					<xs:sequence>
						<xs:group ref="IntValueGroup"/>
					</xs:sequence>
					<xs:attribute name="units" type="xs:token" fixed="periods"/>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<xs:element name="medianOutageLengthResult">
		<xs:annotation>
			<xs:documentation>Outage length</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="ResultType">
					<xs:sequence>
						<xs:group ref="IntValueGroup"/>
					</xs:sequence>
					<xs:attribute name="units" type="xs:token" default="s"/>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<xs:element name="percentUpResult">
		<xs:annotation>
			<xs:documentation>percent Availability = 100*(#unavailable cycles/total cycles)%</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="ResultType">
					<xs:sequence>
						<xs:group ref="IntValueGroup"/>
					</xs:sequence>
					<xs:attribute name="units" type="xs:token" fixed="percent"/>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<xs:element name="path.hoplist" type="HoplistType" substitutionGroup="resultSet">
		<xs:annotation>
			<xs:documentation>Result set for indicated characteristic</xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:complexType name="HoplistType">
		<xs:complexContent>
			<xs:extension base="ResultSetType">
				<xs:sequence>
					<xs:element ref="hopcountResult"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:element name="hopcountResult">
		<xs:annotation>
			<xs:documentation>Number of hops</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="ResultType">
					<xs:sequence>
						<xs:group ref="IntValueGroup"/>
					</xs:sequence>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>

  <!-- 
  ********** 
  Statistics
  **********
  -->

  <!-- Base statistic group -->
  <xs:element name="statistic">
  </xs:element>

  <!-- Single-valued statistics -->

  <xs:element name="count" substitutionGroup="statistic">
    <xs:annotation>
      <xs:documentation>
        Count of measured values.
      </xs:documentation>
    </xs:annotation>
    <xs:simpleType>
      <xs:extension base="xs:nonNegativeInteger"></xs:extension>
    </xs:simpleType>
  </xs:element>

      
  <xs:element name="min" substitutionGroup="statistic">
    <xs:annotation>
      <xs:documentation>
        Minimum measured value
      </xs:documentation>
    </xs:annotation>
    <xs:simpleType>
      <xs:restriction base="xs:double"></xs:restriction>
    </xs:simpleType>
  </xs:element>

  <xs:element name="max" substitutionGroup="statistic">
    <xs:annotation>
      <xs:documentation>
        Maximum measured value
      </xs:documentation>
    </xs:annotation>
    <xs:simpleType>
      <xs:restriction base="xs:double"></xs:restriction>
    </xs:simpleType>
  </xs:element>

  <xs:element name="mean" substitutionGroup="statistic">
    <xs:annotation>
      <xs:documentation>
        Mean measured value
      </xs:documentation>
    </xs:annotation>
    <xs:simpleType>
      <xs:restriction base="xs:double"></xs:restriction>
    </xs:simpleType>
  </xs:element>

  <xs:element name="median" substitutionGroup="statistic">
    <xs:annotation>
      <xs:documentation>
        Median measured value
      </xs:documentation>
    </xs:annotation>
    <xs:simpleType>
      <xs:restriction base="xs:double"></xs:restriction>
    </xs:simpleType>
  </xs:element>
  
  <xs:element name="stddev" substitutionGroup="statistic">
    <xs:annotation>
      <xs:documentation>
        Standard deviation of  measured values
      </xs:documentation>
    </xs:annotation>
    <xs:simpleType>
      <xs:restriction base="xs:double"></xs:restriction>
      </xs:simpleType>
    </xs:element>

  <xs:element name="percentile" substitutionGroup="statistic">
    <xs:annotation>
      <xs:documentation>
        Some percentile of the measured values (median is a
        special case of this, really)
      </xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:double">
          <xs:attribute name="pct" type="xs:nonNegativeInteger">
            <xs:annotation>
              <xs:documentation>
                The percentile to which the value applies
              </xs:documentation>
            </xs:annotation>
          </xs:attribute>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>

  <xs:element name="confidence" substitutionGroup="statistic">
    <xs:annotation>
      <xs:documentation>
        The +/- n% confidence interval (default n=95%) . For example,
        a value of "1.5" means +/- 1.5
      </xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:double">
          <xs:attribute name="confidence" type="xs:nonNegativeInteger">
            <xs:annotation>
              <xs:documentation>
                Percent confidence for which the given value provides an interval.
              </xs:documentation>
            </xs:annotation>
          </xs:attribute>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>


</xs:schema>