<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="urn:ibm:names:ws:provisioning:0.1:api" 
        xmlns:api="urn:ibm:names:ws:provisioning:0.1:api"
        xmlns:core="urn:ibm:names:ws:provisioning:0.1:core"
        xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

    <import namespace="urn:ibm:names:ws:provisioning:0.1:core" schemaLocation="core.xsd"/>
    
    <element name="ListTargetsRequest" type="api:ListTargetsRequestType"/>  
    <complexType name="ListTargetsRequestType">
        <annotation>
            <documentation>Request to retrieve all available targets.</documentation>
        </annotation>  
        <complexContent>
            <extension base="core:ExtensibleType">        
                <sequence>
                    <element name="iterator" type="core:ProvisioningIterator" minOccurs="0"/>  
                </sequence>
            </extension>
        </complexContent>                 
    </complexType>
    
    <element name="ListTargetsResponse" type="api:ListTargetsResponseType"/>    
    <complexType name="ListTargetsResponseType">
        <annotation>
            <documentation>Response from a listTargets request.</documentation>
        </annotation>  
        <complexContent>
            <extension base="core:ExtensibleType">        
                <sequence>
                    <element name="targets" type="core:ProvisioningTargetSetType"/>
                    <element name="result" type="core:ProvisioningIteratedResultType" minOccurs="1"/>
                </sequence>
                <attribute name="remaining" use="required"/> 
            </extension>
        </complexContent>                 
    </complexType>
    
    <element name="FetchTargetsRequest" type="api:FetchTargetsRequestType"/>  
    <complexType name="FetchTargetsRequestType">
        <annotation>
            <documentation>Request a specific target or set of targets.</documentation>
        </annotation>  
        <complexContent>
            <extension base="core:ExtensibleType">        
                <sequence>
                    <element name="identifier" type="core:ProvisioningIdentifierType" minOccurs="1" maxOccurs="unbounded"/>
                    <!-- This should be of type 'anyURI' but that generates different mappings based on the 
                         generator used which means that the server is not portable, so a string is used instead. -->
                    <element name="preferredSchema" type="string" minOccurs="0" maxOccurs="unbounded"/>  
                </sequence>
            </extension>
        </complexContent>                 
    </complexType>
                
    <element name="FetchTargetsResponse" type="api:FetchTargetsResponseType"/>
    <complexType name="FetchTargetsResponseType">
        <annotation>
            <documentation>Response from a fetchTargets message.</documentation>
        </annotation>   
        <complexContent>
            <extension base="core:ExtensibleType">        
                <sequence>
                    <element name="status" type="core:ProvisioningRequestStatusType"/>      
                    <element name="targets" type="core:ProvisioningTargetSetType" minOccurs="0"/>
                    <element name="unavailable" type="core:ProvisioningObjectStatusType" minOccurs="0" maxOccurs="unbounded"/>            
                </sequence>
            </extension>
        </complexContent>                 
    </complexType>  
    
    <element name="ListProvisionedItemsRequest" type="api:ListProvisionedItemsRequestType"/>  
    <complexType name="ListProvisionedItemsRequestType">
        <annotation>
            <documentation>Request to retrieve provisioned objects.</documentation>
        </annotation> 
        <complexContent>
            <extension base="core:ExtensibleType">        
                <sequence>
                    <!-- This should be a choice since these are mutually exclusive but some tools
                         doen't handle choice yet. -->
                    <element name="filter" type="core:ProvisionedItemFilterType" minOccurs="0"/>           
                    <element name="iterator" type="core:ProvisioningIterator" minOccurs="0"/>   
                </sequence>
            </extension>
        </complexContent>                 
    </complexType>
    
    <element name="ListProvisionedItemsResponse" type="api:ListProvisionedItemsResponseType"/>    
    <complexType name="ListProvisionedItemsResponseType">
        <annotation>
            <documentation>Response type for retrieving the list of provisioned objects.</documentation>
        </annotation> 
        <complexContent>
            <extension base="core:ExtensibleType">        
                <sequence>
                    <element name="items" type="core:ProvisionedItemSetType"/>
                    <element name="result" type="core:ProvisioningIteratedResultType" minOccurs="1"/>         
                </sequence>
            </extension>
        </complexContent>                 
    </complexType>
    
    <element name="ListProvisionedLifecycleRequest" type="api:ListProvisionedLifecycleRequestType"/>  
    <complexType name="ListProvisionedLifecycleRequestType">
        <annotation>
            <documentation>Request to retrieve a list of lifecycle events for a provisioned item.</documentation>
        </annotation>  
        <complexContent>
            <extension base="core:ExtensibleType">        
                <sequence>
                    <!-- Some toolkits do not support choice so this is omitted for now -->
                    <!--
                    <choice>
                        <sequence>
                            <element name="lifecycleInterval" type="core:ProvisioningIntervalType" minOccurs="0" maxOccurs="1"/>   
                            <element name="provisionedItem" type="core:ProvisioningIdentifierType" minOccurs="0"/> 
                        </sequence>
                        <element name="iterator" type="core:ProvisioningIterator" minOccurs="0"/>                   
                    </choice>
                    -->

                    <element name="lifecycleInterval" type="core:ProvisioningIntervalType" minOccurs="0" maxOccurs="1"/>   
                    <element name="provisionedItem" type="core:ProvisionedItemType" minOccurs="0"/> 
                    <element name="iterator" type="core:ProvisioningIterator" minOccurs="0"/>  
                </sequence>  
            </extension>
        </complexContent>                 
    </complexType>
    
    <element name="ListProvisionedLifecycleResponse" type="api:ListProvisionedLifecycleResponseType"/>    
    <complexType name="ListProvisionedLifecycleResponseType">
        <annotation>
            <documentation>Response type for retrieving the list of lifecycle events for a provisioned item.</documentation>
        </annotation>  
        <complexContent>
            <extension base="core:ExtensibleType">        
                <sequence>
                    <element name="items" type="core:ProvisionedItemSetType"/>
                    <element name="result" type="core:ProvisioningIteratedResultType" minOccurs="1"/>         
                </sequence>
            </extension>
        </complexContent>                 
    </complexType>    
    
    <element name="FetchProvisionedItemsRequest" type="api:FetchProvisionedItemsRequestType"/>    
    <complexType name="FetchProvisionedItemsRequestType">
        <annotation>
            <documentation>Request a specific provisioned item instance.</documentation>
        </annotation>  
        <complexContent>
            <extension base="core:ExtensibleType">        
                <sequence>
                    <element name="items" type="core:ProvisionedItemType" minOccurs="1" maxOccurs="unbounded"/>
                </sequence>
            </extension>
        </complexContent>                 
    </complexType>
                
    <element name="FetchProvisionedItemsResponse" type="api:FetchProvisionedItemsResponseType"/>
    <complexType name="FetchProvisionedItemsResponseType">
        <annotation>
            <documentation>Response from a fetchProvisioned message.</documentation>
        </annotation>   
        <complexContent>
            <extension base="core:ExtensibleType">        
                <sequence>
                    <element name="status" type="core:ProvisioningRequestStatusType"/>      
                    <element name="items" type="core:ProvisionedItemSetType" minOccurs="0"/>
                    <element name="unavailable" type="core:ProvisioningObjectStatusType" minOccurs="0" maxOccurs="unbounded"/>            
                </sequence>
            </extension>
        </complexContent>                 
    </complexType>
    
    <element name="FetchStatusRequest" type="api:FetchStatusRequestType"/>  
    <complexType name="FetchStatusRequestType">
        <annotation>
            <documentation>Request to get the status for a previous request.</documentation>
        </annotation> 
        <complexContent>
            <extension base="core:ExtensibleType">        
                <sequence>
                    <element name="requestId" type="string" minOccurs="1" maxOccurs="unbounded"/>  
                </sequence>
            </extension>
        </complexContent>                 
    </complexType>
    
    <element name="FetchStatusResponse" type="api:FetchStatusResponseType"/>    
    <complexType name="FetchStatusResponseType">
        <annotation>
            <documentation>Response type for fetchStatusRequest.</documentation>
        </annotation>   
        <complexContent>
            <extension base="core:ExtensibleType">        
                <sequence>
                    <element name="status" type="core:ProvisioningRequestStatusType" minOccurs="1"/>        
                    <element name="response" type="core:ProvisioningObjectStatusType" minOccurs="0" maxOccurs="unbounded"/>           
                </sequence>
            </extension>
        </complexContent>                 
    </complexType>
    
    <element name="ListStatusRequest" type="api:ListStatusRequestType"/>  
    <complexType name="ListStatusRequestType">
        <annotation>
            <documentation>Request to get or iterate through the status for all requests.</documentation>
        </annotation> 
        <complexContent>
            <extension base="core:ExtensibleType">        
                <sequence>
                    <element name="iterator" type="core:ProvisioningIterator" minOccurs="0" maxOccurs="1"/> 
                </sequence> 
            </extension>
        </complexContent>                 
    </complexType>
    
    <element name="ListStatusResponse" type="api:ListStatusResponseType"/>    
    <complexType name="ListStatusResponseType">
        <annotation>
            <documentation>Response type for listStatusRequest.</documentation>
        </annotation>   
        <complexContent>
            <extension base="core:ExtensibleType">        
                <sequence>
                    <element name="status" type="core:ProvisioningIteratedResultType" minOccurs="1" maxOccurs="1"/>   
                    <element name="response" type="core:ProvisioningObjectStatusType" minOccurs="0" maxOccurs="unbounded"/>
                </sequence>
            </extension>
        </complexContent>                 
    </complexType>
    
    <element name="CancelRequest" type="api:CancelRequestType"/>  
    <complexType name="CancelRequestType">
        <annotation>
            <documentation>Request to cancel a set of requests.</documentation>
        </annotation>   
        <complexContent>
            <extension base="core:ExtensibleType">        
                <sequence>
                    <element name="requestId" type="string" minOccurs="1" maxOccurs="unbounded"/>
                </sequence>  
            </extension>
        </complexContent>                 
    </complexType>
    
    <element name="CancelResponse" type="api:CancelResponseType"/>    
    <complexType name="CancelResponseType">
        <annotation>
            <documentation>Response type for cancelRequest.</documentation>
        </annotation>    
        <complexContent>
            <extension base="core:ExtensibleType">        
                <sequence>
                    <element name="status" type="core:ProvisioningRequestStatusType" minOccurs="0" maxOccurs="unbounded"/>            
                </sequence>
            </extension>
        </complexContent>                 
    </complexType>    
    
    <element name="ProvisionRequest" type="api:ProvisionRequestType"/>
    <complexType name="ProvisionRequestType">
        <annotation>
            <documentation>Provision a target.</documentation>
        </annotation>   
        <complexContent>
            <extension base="core:ExtensibleType">        
                <sequence>
                    <element name="target" type="core:ProvisioningIdentifierType"/>
                    <element name="owner" type="core:ProvisioningIdentifierType" minOccurs="0"/>            
                    <element name="parameters" type="core:ProvisioningServiceParametersType" minOccurs="0"/>            
                </sequence>
            </extension>
        </complexContent>                 
    </complexType>
    
    <element name="ProvisionResponse" type="api:ProvisionResponseType"/>
    <complexType name="ProvisionResponseType">
        <annotation>
            <documentation>Response message for a provisioning request.</documentation>
        </annotation>
        <complexContent>
            <extension base="core:ExtensibleType">        
                <sequence>
                    <element name="status" type="core:ProvisioningRequestStatusType" minOccurs="1"/>
                    <element name="item" type="core:ProvisionedItemType" minOccurs="0"/>     
                </sequence>
            </extension>
        </complexContent>                 
    </complexType>
    
    <element name="ModifyProvisionedParametersRequest" type="api:ModifyProvisionedParametersRequestType"/>   
    <complexType name="ModifyProvisionedParametersRequestType">
        <annotation>
            <documentation>Request to modify a provisioned object instance.</documentation>
        </annotation>   
        <complexContent>
            <extension base="core:ExtensibleType">        
                <sequence>
                    <element name="item" type="core:ProvisionedItemType" minOccurs="1"/>
                    <element name="modification" type="api:ParameterModificationType" minOccurs="1" maxOccurs="unbounded"/>
                </sequence>
            </extension>
        </complexContent>                 
    </complexType>  
    
    <element name="ParameterModification" type="api:ParameterModificationType"/>        
    <complexType name="ParameterModificationType">
        <annotation>
            <documentation>This class describes a particular modification to target data for a provisioned item.</documentation>
        </annotation>   
        <complexContent>
            <extension base="core:ExtensibleType">        
                <all>
                    <element name="identifier" type="core:ProvisioningIdentifierType" minOccurs="0"/>        
                    <element name="selector" type="core:ProvisioningSelectorType" minOccurs="0" maxOccurs="1"/>
                    <element name="parameters" type="core:ProvisioningServiceParametersType" minOccurs="0" maxOccurs="1"/>                      
                </all>
                <attribute name="operation" type="api:ParameterModificationOperation" use="required"/> 
            </extension>
        </complexContent>                 
    </complexType> 
    
    <simpleType name="ParameterModificationOperation">
        <restriction base="string">
            <enumeration value="add"/>
            <enumeration value="delete"/>
            <enumeration value="replace"/>
        </restriction>
    </simpleType>
    
    <element name="ModifyProvisionedParametersResponse" type="api:ModifyProvisionedParametersResponseType"/>
    <complexType name="ModifyProvisionedParametersResponseType">
        <annotation>
            <documentation>Response message for a modify provisioned parameters request.</documentation>
        </annotation>
        <complexContent>
            <extension base="core:ExtensibleType">        
                <sequence>
                    <element name="requestStatus" type="core:ProvisioningRequestStatusType" minOccurs="1"/>
                    <element name="provisionedItem" type="core:ProvisionedItemType" minOccurs="0"/>            
                    <element name="modificationStatus" type="core:ProvisioningObjectStatusType" minOccurs="0" maxOccurs="unbounded"/>
                </sequence>
            </extension>
        </complexContent>                 
    </complexType>
    
    <element name="ModifyProvisionedStateRequest" type="api:ModifyProvisionedStateRequestType"/>
    <complexType name="ModifyProvisionedStateRequestType">
        <annotation>
            <documentation>Modify the state of a ProvisionedItem object.</documentation>
        </annotation>  
        <complexContent>
            <extension base="core:ExtensibleType">        
                <all>
                    <element name="item" type="core:ProvisionedItemType"/>
                    <element name="state" type="core:ProvisioningStateType"/> 
                    <element name="reason" type="core:ProvisioningRequestStatusType" minOccurs="0"/>    
                </all>
            </extension>
        </complexContent>                 
    </complexType>
    
    <element name="ModifyProvisionedStateResponse" type="api:ModifyProvisionedStateResponseType"/>
    <complexType name="ModifyProvisionedStateResponseType">
        <annotation>
            <documentation>Response message for a modify state request.</documentation>
        </annotation>
        <complexContent>
            <extension base="core:ExtensibleType">        
                <all>
                    <element name="status" type="core:ProvisioningRequestStatusType" minOccurs="1"/>
                    <element name="item" type="core:ProvisionedItemType" minOccurs="0"/>     
                </all>
            </extension>
        </complexContent>                 
    </complexType>
    
    <element name="DeprovisionRequest" type="api:DeprovisionRequestType"/>
    <complexType name="DeprovisionRequestType">
        <annotation>
            <documentation>De-provision a target.</documentation>
        </annotation>  
        <complexContent>
            <extension base="core:ExtensibleType">        
                <all>
                    <element name="item" type="core:ProvisionedItemType"/>
                </all>
            </extension>
        </complexContent>                 
    </complexType>
    
    <element name="DeprovisionResponse" type="api:DeprovisionResponseType"/>
    <complexType name="DeprovisionResponseType">
        <annotation>
            <documentation>Response message for a de-provision request.</documentation>
        </annotation>
        <complexContent>
            <extension base="core:ExtensibleType">        
                <all>
                    <element name="status" type="core:ProvisioningRequestStatusType" minOccurs="1"/>
                    <element name="item" type="core:ProvisionedItemType" minOccurs="0"/>     
                </all>
            </extension>
        </complexContent>                 
    </complexType>  
    
    <element name="ProvisioningFault" type="api:ProvisioningFaultType"/>
    <complexType name="ProvisioningFaultType">
        <annotation>
            <documentation>Generic fault for all operations.</documentation>
        </annotation>
        <complexContent>
            <extension base="core:ExtensibleType">        
                <sequence>
                    <element name="error" type="core:ProvisioningRequestStatusType" minOccurs="1"/>     
                </sequence>
            </extension>
        </complexContent>                 
    </complexType>  
    
</schema>
