Stage LP DI Madjid Bouchair SERFA, CDS

VOSpace : API Web REST en Python

Encadré par : André Schaaff

Requête GET et réponses

Get sur mydir

J'ai utilisé les accès fournit par CANFAR, aucun soucis pour me loger sur l'interface, y créer un dossier et y uploader des fichiers.

La commande GET par une requête curl fonction, j'ai pu noter la différence entre detail "min" et "max".

"Max" offre les détails du node parent ainsi que de la cible, CANFAR utilise 2 propriétés supplémentaires :

<vos:property uri="ivo://cadc.nrc.ca/vospace/core#readable" readOnly="true">true</vos:property>
<vos:property uri="ivo://cadc.nrc.ca/vospace/core#writable" readOnly="true">true</vos:property>

Ces propriétés n'apparaissent qu'avec detail="max"

Par contre, lorsque la cible du get est le node "cds", il y a redondance des informations lorsque la requête demande "detail=max":

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="http://www.canfar.phys.uvic.ca/vospace/vospace.xsl"?>
<vos:node xmlns:vos="http://www.ivoa.net/xml/VOSpace/v2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" uri="vos://cadc.nrc.ca!vospace/cds" xsi:type="vos:ContainerNode">
  <vos:properties>
    <vos:property uri="ivo://ivoa.net/vospace/core#length" readOnly="true">7312932</vos:property>
    <vos:property uri="ivo://ivoa.net/vospace/core#date" readOnly="true">2017-05-15T08:03:02.730</vos:property>
    <vos:property uri="ivo://ivoa.net/vospace/core#ispublic" readOnly="false">false</vos:property>
    <vos:property uri="ivo://ivoa.net/vospace/core#creator" readOnly="false">CN=cds_83b,OU=CADC,O=HIA,C=CA</vos:property>
    <vos:property uri="ivo://ivoa.net/vospace/core#quota" readOnly="false">53687091200</vos:property>
    <vos:property uri="ivo://cadc.nrc.ca/vospace/core#readable" readOnly="true">true</vos:property>
    <vos:property uri="ivo://cadc.nrc.ca/vospace/core#writable" readOnly="true">true</vos:property>
  </vos:properties>
  <vos:nodes>
    <vos:node uri="vos://cadc.nrc.ca!vospace/cds/mydir" xsi:type="vos:ContainerNode">
      <vos:properties>
        <vos:property uri="ivo://ivoa.net/vospace/core#length" readOnly="true">7312932</vos:property>
        <vos:property uri="ivo://ivoa.net/vospace/core#date" readOnly="true">2017-05-15T08:03:02.713</vos:property>
        <vos:property uri="ivo://ivoa.net/vospace/core#ispublic" readOnly="false">false</vos:property>
        <vos:property uri="ivo://ivoa.net/vospace/core#creator" readOnly="false">CN=cds_83b,OU=CADC,O=HIA,C=CA</vos:property>
        <vos:property uri="ivo://cadc.nrc.ca/vospace/core#readable" readOnly="true">true</vos:property>
        <vos:property uri="ivo://cadc.nrc.ca/vospace/core#writable" readOnly="true">true</vos:property>
      </vos:properties>
      <vos:nodes />
    </vos:node>
  </vos:nodes>
</vos:node>

Après peuplement du dossier mydir, j'ai réalisé un get sur celui-ci:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="http://www.canfar.phys.uvic.ca/vospace/vospace.xsl"?>
<vos:node xmlns:vos="http://www.ivoa.net/xml/VOSpace/v2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" uri="vos://cadc.nrc.ca!vospace/cds/mydir" xsi:type="vos:ContainerNode">
  <vos:properties>
    <vos:property uri="ivo://ivoa.net/vospace/core#length" readOnly="true">7312932</vos:property>
    <vos:property uri="ivo://ivoa.net/vospace/core#date" readOnly="true">2017-05-15T08:03:02.713</vos:property>
    <vos:property uri="ivo://ivoa.net/vospace/core#ispublic" readOnly="false">false</vos:property>
    <vos:property uri="ivo://ivoa.net/vospace/core#creator" readOnly="false">CN=cds_83b,OU=CADC,O=HIA,C=CA</vos:property>
  </vos:properties>
  <vos:nodes>
    <vos:node uri="vos://cadc.nrc.ca!vospace/cds/mydir/Gavo.xml" xsi:type="vos:DataNode" busy="false">
      <vos:properties>
        <vos:property uri="ivo://ivoa.net/vospace/core#length" readOnly="true">3845447</vos:property>
        <vos:property uri="ivo://ivoa.net/vospace/core#MD5" readOnly="true">253bc7e85ec14e9a80f9369349082dc4</vos:property>
        <vos:property uri="ivo://ivoa.net/vospace/core#date" readOnly="true">2017-05-15T07:39:10.287</vos:property>
        <vos:property uri="ivo://ivoa.net/vospace/core#ispublic" readOnly="false">false</vos:property>
        <vos:property uri="ivo://ivoa.net/vospace/core#creator" readOnly="false">CN=cds_83b,OU=CADC,O=HIA,C=CA</vos:property>
      </vos:properties>
      <vos:accepts />
      <vos:provides />
    </vos:node>
    <vos:node uri="vos://cadc.nrc.ca!vospace/cds/mydir/data.xml" xsi:type="vos:DataNode" busy="false">
      <vos:properties>
        <vos:property uri="ivo://ivoa.net/vospace/core#length" readOnly="true">640</vos:property>
        <vos:property uri="ivo://ivoa.net/vospace/core#MD5" readOnly="true">0ff774ba0f908a2847be26f90ef887fc</vos:property>
        <vos:property uri="ivo://ivoa.net/vospace/core#date" readOnly="true">2017-05-15T07:39:06.640</vos:property>
        <vos:property uri="ivo://ivoa.net/vospace/core#ispublic" readOnly="false">false</vos:property>
        <vos:property uri="ivo://ivoa.net/vospace/core#creator" readOnly="false">CN=cds_83b,OU=CADC,O=HIA,C=CA</vos:property>
      </vos:properties>
      <vos:accepts />
      <vos:provides />
    </vos:node>
    <vos:node uri="vos://cadc.nrc.ca!vospace/cds/mydir/dtdTest.txt" xsi:type="vos:DataNode" busy="false">
      <vos:properties>
        <vos:property uri="ivo://ivoa.net/vospace/core#length" readOnly="true">1094280</vos:property>
        <vos:property uri="ivo://ivoa.net/vospace/core#MD5" readOnly="true">be8ee382b04cdc760d6070d55d849b84</vos:property>
        <vos:property uri="ivo://ivoa.net/vospace/core#date" readOnly="true">2017-05-15T07:39:07.583</vos:property>
        <vos:property uri="ivo://ivoa.net/vospace/core#ispublic" readOnly="false">false</vos:property>
        <vos:property uri="ivo://ivoa.net/vospace/core#creator" readOnly="false">CN=cds_83b,OU=CADC,O=HIA,C=CA</vos:property>
      </vos:properties>
      <vos:accepts />
      <vos:provides />
    </vos:node>
    <vos:node uri="vos://cadc.nrc.ca!vospace/cds/mydir/first_helix_1tfe.txt" xsi:type="vos:DataNode" busy="false">
      <vos:properties>
        <vos:property uri="ivo://ivoa.net/vospace/core#length" readOnly="true">550</vos:property>
        <vos:property uri="ivo://ivoa.net/vospace/core#MD5" readOnly="true">66815e387dfe65df79b305d5b5734f0a</vos:property>
        <vos:property uri="ivo://ivoa.net/vospace/core#date" readOnly="true">2017-05-15T07:39:06.547</vos:property>
        <vos:property uri="ivo://ivoa.net/vospace/core#ispublic" readOnly="false">false</vos:property>
        <vos:property uri="ivo://ivoa.net/vospace/core#creator" readOnly="false">CN=cds_83b,OU=CADC,O=HIA,C=CA</vos:property>
      </vos:properties>
      <vos:accepts />
      <vos:provides />
    </vos:node>
    <vos:node uri="vos://cadc.nrc.ca!vospace/cds/mydir/vizier_votable.vot" xsi:type="vos:DataNode" busy="false">
      <vos:properties>
        <vos:property uri="ivo://ivoa.net/vospace/core#length" readOnly="true">2372015</vos:property>
        <vos:property uri="ivo://ivoa.net/vospace/core#MD5" readOnly="true">7bd7c6cdae0af227cbd3dc1dc40c1f11</vos:property>
        <vos:property uri="ivo://ivoa.net/vospace/core#date" readOnly="true">2017-05-15T07:28:14.317</vos:property>
        <vos:property uri="ivo://ivoa.net/vospace/core#ispublic" readOnly="false">false</vos:property>
        <vos:property uri="ivo://ivoa.net/vospace/core#creator" readOnly="false">CN=cds_83b,OU=CADC,O=HIA,C=CA</vos:property>
      </vos:properties>
      <vos:accepts />
      <vos:provides />
    </vos:node>
  </vos:nodes>
</vos:node>

Get sur un datanote

Lorsque je fais un get sur un datanode spécifique avec la commande :

curl -s -u cds:******* -X GET -H 'Accept: text/xml' 
    'http://www.canfar.phys.uvic.ca/vospace/auth/nodes/cds/mydir?detail="min"&
    uri="vos://cadc.nrc.ca~vospace/cds/mydir/first_helix_1tfe.txt"'

Le serveur répond :

InvalidURI: URI not well formed: vos://cadc.nrc.ca!vospace/cds/mydir

CANFAR n'a pas intégré les méthodes getProtocols ou getProperties, une erreur 404 est lancée.

Requête pullFromVoSpace

J'ai essayé de faire un pullFromVoSpace synchrone et asynchrone:

fichier xml :

<vos:transfer xmlns:vos="http://www.ivoa.net/xml/VOSpace/v2.1">
  <vos:target>vos://cadc.nrc.ca!vospace/cds/vizier_votable.vot</vos:target>
  <vos:direction>pullFromVoSpace</vos:direction>
  <vos:protocol uri="ivo://ivoa.net/vospace/core#httpget" />
</vos:transfer>

Requête Async

J'utilise la commande curl:

curl -s -u cds:******* -X POST -d @pullFrom.xml --header 
    'Accept: text/xml' 'http://www.canfar.phys.uvic.ca/vospace/auth/transfers'

Je ne reçois aucune réponse du serveur.

Asynchrone depuis l'interface:

http://www.canfar.phys.uvic.ca/vospace/

Depuis l'API reference de l'interface, j'ai voulu tester le pullFromVoSpace asynchrone avec le xml ciblant un fichier que j'avais au préalable uploadé.

La réponse me donne un code 200 au lieu d'un 300 et redirection mais le corps du job est bon.

<?xml version="1.0" encoding="UTF-8"?>

<uws:job xmlns:uws="http://www.ivoa.net/xml/UWS/v1.0" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
  <uws:jobId>zx5x4av6t8ntxazq</uws:jobId>

  <uws:runId />

  <uws:ownerId>CN=cds_83b,OU=CADC,O=HIA,C=CA</uws:ownerId>
  <uws:phase>PENDING</uws:phase>
  <uws:quote>2017-05-15T19:55:44.997</uws:quote>
  <uws:startTime xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true" />
  <uws:endTime xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true" />
  <uws:creationTime>2017-05-15T07:55:44.997</uws:creationTime>
  <uws:executionDuration>43200</uws:executionDuration>
  <uws:destruction>2017-05-22T07:55:44.997</uws:destruction>
  <uws:parameters />
  <uws:results />
  <uws:jobInfo>
    <vos:transfer xmlns:vos="http://www.ivoa.net/xml/VOSpace/v2.1">
      <vos:target>vos://cadc.nrc.ca!vospace/cds/vizier_votable.vot</vos:target>
      <vos:direction>pullFromVoSpace</vos:direction>
      <vos:protocol uri="ivo://ivoa.net/vospace/core#httpget" />
      <vos:keepBytes>true</vos:keepBytes>

    </vos:transfer>
  </uws:jobInfo>
</uws:job>

Lorsque je tente de consulter le job avec la commande

curl -v http://www.canfar.phys.uvic.ca/vospace/transfers/zx5x4av6t8ntxazq

Comme indiqué dans le protocol, j'ai l'erreur suivante :

*   Trying 132.246.217.32...
* Connected to www.canfar.phys.uvic.ca (132.246.217.32) port 80 (#0)
> GET /vospace/transfers/zx5x4av6t8ntxazq HTTP/1.1
> Host: www.canfar.phys.uvic.ca
> User-Agent: curl/7.47.0
> Accept: */*
> 
< HTTP/1.1 403 Forbidden
< Date: Mon, 15 May 2017 07:57:38 GMT
< Server: Restlet-Framework/2.0.2
< Vary: Accept-Charset,Accept-Encoding,Accept-Language,Accept
< Content-Type: text/plain;charset=UTF-8
< Content-Length: 18
< Connection: close
< Accept-Ranges: bytes
< 
permission denied
* Closing connection 0

Mais lorsque j'accede direction à l'url http://www.canfar.phys.uvic.ca/vospace/transfers/zx5x4av6t8ntxazq je vois le job et sa phase.

Au moment de lancer le job avec la requête :

curl -v -u cds:******* -X POST 
    -d "PHASE=RUN" 
    'http://www.canfar.phys.uvic.ca/vospace/auth/transfers/zx5x4av6t8ntxazq/phase'

Le serveur me répond :

Note: Unnecessary use of -X or --request, POST is already inferred.
*   Trying 132.246.217.32...
* Connected to www.canfar.phys.uvic.ca (132.246.217.32) port 80 (#0)
* Server auth using Basic with user 'cds'
> POST /vospace/auth/transfers/zx5x4av6t8ntxazq/phase HTTP/1.1
> Host: www.canfar.phys.uvic.ca
> Authorization: Basic Y2RzOmFzQEBDRFM=
> User-Agent: curl/7.47.0
> Accept: */*
> Content-Length: 9
> Content-Type: application/x-www-form-urlencoded
> 
* upload completely sent off: 9 out of 9 bytes
< HTTP/1.1 303 See Other
< Date: Mon, 15 May 2017 08:15:29 GMT
< Server: Restlet-Framework/2.0.2
< Location: http://www.canfar.phys.uvic.ca/vospace/auth/transfers/zx5x4av6t8ntxazq
< Content-Length: 0
< Connection: close
< Content-Type: text/plain
< Accept-Ranges: bytes
< 
* Closing connection 0

Le job passe immédiatement en "ERROR".

curl -v -u cds:******* 'http://www.canfar.phys.uvic.ca/vospace/auth/transfers/zx5x4av6t8ntxazq/phase'
*   Trying 132.246.217.32...
* Connected to www.canfar.phys.uvic.ca (132.246.217.32) port 80 (#0)
* Server auth using Basic with user 'cds'
> GET /vospace/auth/transfers/zx5x4av6t8ntxazq/phase HTTP/1.1
> Host: www.canfar.phys.uvic.ca
> Authorization: Basic Y2RzOmFzQEBDRFM=
> User-Agent: curl/7.47.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Mon, 15 May 2017 08:18:14 GMT
< Server: Restlet-Framework/2.0.2
< Cache-Control: private
< Expires: Wed, 31 Dec 1969 16:00:00 PST
< Vary: Accept-Charset,Accept-Encoding,Accept-Language,Accept
< Content-Type: text/plain;charset=UTF-8
< Content-Length: 5
< Connection: close
< Accept-Ranges: bytes
< 
* Closing connection 0
ERROR

Par l'interface, les options de téléchargement fonctionnent, elle offre soit directement l'url d'accès au fichier soit le lancement d'un download manager java qui va effectuer le téléchargement.

Requête Sync

Toujours avec le même xml, je lance la commande :

curl -s -u cds:******* -X POST -d @pullFrom.xml 
    --header 'Accept: text/xml' 
    'http://www.canfar.phys.uvic.ca/vospace/auth/synctrans'

La réponse est la suivante :

Invalid input: missing parameters: TARGET=null DIRECTION=null PROTOCOL=null

Il semblerait que CANFAR n'ai implémenté la fonction pullFromVoSpace synchrone que par URL avec paramètre.

Je test donc cette méthode.

curl -v -X POST -u cds:******* "http://www.canfar.phys.uvic.ca/vospace/auth/synctrans?
    TARGET=vos://cadc.nrc.ca~vospace/cdsdata.xml&
    DIRECTION=pullFromVoSpace&PROTOCOL=ivo://ivoa.net/vospace/core%23httpget"

Le serveur répond avec un code 500

*   Trying 132.246.217.47...
* Connected to www.canfar.phys.uvic.ca (132.246.217.47) port 80 (#0)
* Server auth using Basic with user 'cds'
> POST /vospace/auth/synctrans?TARGET=vos://cadc.nrc.ca~vospace/cdsdata.xml&DIRECTION=pullFromVoSpace&PROTOCOL=ivo://ivoa.net/vospace/core%23httpget HTTP/1.1
> Host: www.canfar.phys.uvic.ca
> Authorization: Basic Y2RzOmFzQEBDRFM=
> User-Agent: curl/7.47.0
> Accept: */*
> 
< HTTP/1.1 500 Internal Server Error
< Date: Tue, 16 May 2017 11:54:22 GMT
< Content-Type: text/plain;charset=ISO-8859-1
< Content-Length: 31
< Connection: close
< 
job null failed unexpectedly: 
* Closing connection 0

Lorsque je passe directement par le browser j'ai un "NodeNotFound"

logo_cds logo_serfa