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

[nm-wg] developer guide progress



Hi all,

Not much to report on the developer guide, sorry. But I did find the time to develop a "helper" tool for generating WSDL files.

Basically, my problem with WSDL is that it has an extremely complex and redundant syntax for the really very simple task of specifying that you want the output message to be "X" and the input message to be "Y".

So, I wrote a Python program that takes as input a template WSDL files with all the crazy namespace junk filled in, and a configuration file (in Windows .ini format, because there's a Python module to read that) that specifies just the few actual parameters that I need: namespace for service, name of service operation, name of XML Schema file, namespace of the XML Schemas, and the actual network location of the service.

I tested it on traceroute and it seemed to work. Steps performed:

1) translate *.rnc -> *.xsd, using Trang. Attached just .xsd files.
2) write config file (nmwg_service.cfg)
3) run ezwsdl.py with the config file as output, and "template.wsdl" providing the bulk of the WSDL info -> traceroute.wsdl
4) check validity of results by generating python stubs from .wsdl file

Only step #4 is python-specific. It would be nice if someone could try it with the Java, too. Also, I was thinking that we could extend this to be the standard approach for generating the WSDL files for all our examples (iperf, ping, etc.) and document the whole mess in the developer guide. But then, I need to sleep occasionally. Any volunteers to help out with this?

-Dan

p.s. Mark, is there going to be a call tomorrow morning?
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"; elementFormDefault="qualified" targetNamespace="http://www.ggf.org/nmwg/"; xmlns:nmwg="http://www.ggf.org/nmwg/";>
  <xs:element name="request" type="nmwg:Request"/>
  <xs:element name="response" type="nmwg:Response"/>
  <xs:complexType name="Request">
    <xs:sequence>
      <xs:element minOccurs="0" name="properties" type="nmwg:Properties">
        <xs:annotation>
          <xs:documentation>Properties of the request</xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="nmwg:metadata"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="Response">
    <xs:sequence>
      <xs:element minOccurs="0" name="properties" type="nmwg:Properties">
        <xs:annotation>
          <xs:documentation>Properties of the response</xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:annotation>
          <xs:documentation>Metadata / data sections</xs:documentation>
        </xs:annotation>
        <xs:element ref="nmwg:metadata"/>
        <xs:element ref="nmwg:data"/>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="metadata">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="nmwg:subject"/>
        <xs:element ref="nmwg:parameters"/>
      </xs:sequence>
      <xs:attribute name="id" use="required" type="nmwg:Identifier"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="subject">
    <xs:complexType>
      <xs:attributeGroup ref="nmwg:Subject"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="parameters">
    <xs:complexType>
      <xs:attributeGroup ref="nmwg:Parameters"/>
    </xs:complexType>
  </xs:element>
  <xs:attributeGroup name="Subject">
    <xs:annotation>
      <xs:documentation>Metadata subject</xs:documentation>
    </xs:annotation>
    <xs:attribute name="id" use="required" type="nmwg:Identifier"/>
  </xs:attributeGroup>
  <xs:attributeGroup name="Parameters">
    <xs:annotation>
      <xs:documentation>Metadata parameters</xs:documentation>
    </xs:annotation>
    <xs:attribute name="id" use="required" type="nmwg:Identifier"/>
  </xs:attributeGroup>
  <xs:element name="data">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" ref="nmwg:time"/>
        <xs:element minOccurs="0" ref="nmwg:units"/>
        <xs:element ref="nmwg:results"/>
      </xs:sequence>
      <xs:attribute name="id" use="required" type="nmwg:Identifier">
        <xs:annotation>
          <xs:documentation>Data section identifier</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="metadataId" use="required" type="nmwg:Identifier">
        <xs:annotation>
          <xs:documentation>Reference to associated metadata section</xs:documentation>
        </xs:annotation>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
  <xs:element name="time">
    <xs:annotation>
      <xs:documentation>Initial or "base" timestamp</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:attributeGroup ref="nmwg:Time"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="units" type="xs:token">
    <xs:annotation>
      <xs:documentation>Units</xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="results" type="xs:string"/>
  <xs:simpleType name="Identifier">
    <xs:restriction base="xs:string"/>
  </xs:simpleType>
  <xs:complexType name="Properties">
    <xs:sequence>
      <xs:element maxOccurs="unbounded" ref="nmwg:item"/>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="item">
    <xs:complexType mixed="true">
      <xs:attribute name="name" use="required" type="xs:string">
        <xs:annotation>
          <xs:documentation>Property name.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="targetId" type="nmwg:Identifier"/>
    </xs:complexType>
  </xs:element>
  <xs:attributeGroup name="Time">
    <xs:annotation>
      <xs:documentation>Timestamp</xs:documentation>
    </xs:annotation>
    <xs:attribute name="type" use="required" type="xs:token">
      <xs:annotation>
        <xs:documentation>Format and semantics of value</xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="value" use="required">
      <xs:annotation>
        <xs:documentation>Timestamp value</xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:attributeGroup>
  <xs:group name="TimeRange">
    <xs:sequence>
      <xs:element ref="nmwg:start"/>
      <xs:element ref="nmwg:end"/>
    </xs:sequence>
  </xs:group>
  <xs:element name="start">
    <xs:complexType>
      <xs:attributeGroup ref="nmwg:Time"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="end">
    <xs:complexType>
      <xs:attribute name="type" type="xs:token">
        <xs:annotation>
          <xs:documentation>Format and semantics of value</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="value">
        <xs:annotation>
          <xs:documentation>Timestamp value</xs:documentation>
        </xs:annotation>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified" targetNamespace="http://www.ggf.org/nmwg/traceroute/";
    xmlns:nmwg="http://www.ggf.org/nmwg/"; xmlns:tr="http://www.ggf.org/nmwg/traceroute/"; xmlns:xs="http://www.w3.org/2001/XMLSchema";>
    <xs:import namespace="http://www.ggf.org/nmwg/"; schemaLocation="nmbase.xsd"/>
    <xs:element name="metadata" substitutionGroup="nmwg:Metadata">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="tr:subject"/>
                <xs:element ref="tr:parameters"/>
            </xs:sequence>
            <xs:attribute name="id" type="nmwg:Identifier" use="required"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="subject" type="tr:TracerouteSubject"/>
    <xs:element name="parameters" type="tr:TracerouteParameters"/>
    <xs:element abstract="true" name="TracerouteSubject"/>
    <xs:complexType name="TracerouteSubject">
        <xs:sequence>
            <xs:element ref="tr:TracerouteSubject"/>
        </xs:sequence>
        <xs:attributeGroup ref="nmwg:Subject"/>
    </xs:complexType>
    <xs:complexType name="TracerouteParameters">
        <xs:sequence>
            <xs:element minOccurs="0" ref="tr:maxttl"/>
            <xs:element minOccurs="0" ref="tr:nqueries"/>
        </xs:sequence>
        <xs:attributeGroup ref="nmwg:Parameters"/>
    </xs:complexType>
    <xs:element name="maxttl" type="xs:int"/>
    <xs:element name="nqueries" type="xs:int"/>
    <!-- etc.. -->
    <xs:element name="results" substitutionGroup="nmwg:Results">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" minOccurs="0" ref="tr:probe"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="probe">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="tr:query"/>
            </xs:sequence>
            <xs:attribute name="num" type="xs:int" use="required"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="query">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="tr:hopValue"/>
                <xs:element ref="tr:rtt"/>
            </xs:sequence>
            <xs:attribute name="num" type="xs:int" use="required"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="hopValue" type="xs:string"/>
    <xs:element name="rtt" type="xs:float"/>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://www.ggf.org/nwwg/traceroute.wsdl"; 
 xmlns:http="http://schemas.xmlsoap.org/wsdl/http/";
 xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"; 
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/";
 xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"; 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/";
 xmlns:xs="http://www.w3.org/2001/XMLSchema"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
 xmlns:ws="http://www.ggf.org/nwwg/traceroute.wsdl";
  xmlns:xsd="http://www.ggf.org/nmwg/traceroute/"; >
    <wsdl:types>
        <xs:schema targetNamespace="http://www.ggf.org/nmwg/traceroute/";>
            <xs:include schemaLocation="traceroute.xsd"></xs:include>
        </xs:schema>
    </wsdl:types>
    <wsdl:message name="request">
        <wsdl:part name="body" element="xsd:request"></wsdl:part>
    </wsdl:message>
    <wsdl:message name="response">
        <wsdl:part name="body" element="xsd:response"></wsdl:part>
    </wsdl:message>
    <wsdl:portType name="opPortType">
        <wsdl:operation name="getTraceroute">
            <wsdl:input message="ws:request"/>
            <wsdl:output message="ws:response"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="opBinding" type="ws:opPortType">
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="getTraceroute">
            <soap:operation soapAction="http://fakehost.com:8080"/>
            <wsdl:input><soap:body use="literal"/></wsdl:input>
            <wsdl:output><soap:body use="literal"/></wsdl:output>
         </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="opService">
        <wsdl:port name="ws:opPort" binding="ws:opBinding">
            <soap:address location="http://fakehost.com:8080"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="%(target_ns)s" 
 xmlns:http="http://schemas.xmlsoap.org/wsdl/http/";
 xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"; 
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/";
 xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"; 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/";
 xmlns:xs="http://www.w3.org/2001/XMLSchema"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
 xmlns:ws="%(target_ns)s"
  xmlns:xsd="%(schema_ns)s" >
    <wsdl:types>
        <xs:schema targetNamespace="%(schema_ns)s">
            <xs:include schemaLocation="%(schema_xsd)s"></xs:include>
        </xs:schema>
    </wsdl:types>
    <wsdl:message name="request">
        <wsdl:part name="body" element="xsd:request"></wsdl:part>
    </wsdl:message>
    <wsdl:message name="response">
        <wsdl:part name="body" element="xsd:response"></wsdl:part>
    </wsdl:message>
    <wsdl:portType name="opPortType">
        <wsdl:operation name="%(operation)s">
            <wsdl:input message="ws:request"/>
            <wsdl:output message="ws:response"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="opBinding" type="ws:opPortType">
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="%(operation)s">
            <soap:operation soapAction="%(service_url)s"/>
            <wsdl:input><soap:body use="literal"/></wsdl:input>
            <wsdl:output><soap:body use="literal"/></wsdl:output>
         </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="opService">
        <wsdl:port name="ws:opPort" binding="ws:opBinding">
            <soap:address location="%(service_url)s"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>
# Short descriptive name for service
[traceroute]
# Namespace for this service
target_ns: http://www.ggf.org/nwwg/traceroute.wsdl
# File with request/response schemas
schema_xsd: traceroute.xsd
# Namespace used in the schema_xsd file, above
schema_ns: http://www.ggf.org/nmwg/traceroute/
# Name of operation, e.g. "getStockQuote"
operation: getTraceroute
# URL where the actual service is running
service_url: http://fakehost.com:8080

Attachment: ezwsdl.py
Description: application/python