Projet

Général

Profil

Development #60836

connecteur SOAP générique

Ajouté par Benjamin Dauvergne il y a plus de 2 ans. Mis à jour il y a environ 2 ans.

Statut:
Fermé
Priorité:
Bas
Assigné à:
Version cible:
-
Début:
19 janvier 2022
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

Cf. ticket un peu con #59868 où un connecteur est produit pour appeler une seule méthode SOAP qui en gros fait un GET et renvoie une liste de dico.

L'idée serait un connecteur SOAP générique où on désigne un WSDL et on obtient un endpoint "method" qui reçoit un seul paramètre dans l'URL, le nom de la méthode, appelle cette méthode et convertit la sérialisation du XML en objets zeep vers du JSON (pas trop compliqué normalement, possible que zeep fournisse déjà une méthode to_dict pour ela).

Point bonus : produire une description des méthodes disponibles dans l'interface, voir du JSON produit par chacune.


Fichiers

0001-add-a-generic-soap-connector-60836.patch (10,1 ko) 0001-add-a-generic-soap-connector-60836.patch Benjamin Dauvergne, 19 janvier 2022 19:35
0001-add-a-generic-soap-connector-60836.patch (11,8 ko) 0001-add-a-generic-soap-connector-60836.patch Benjamin Dauvergne, 19 janvier 2022 22:19
Firefox_Screenshot_2022-01-19T21-19-36.130Z.png (190 ko) Firefox_Screenshot_2022-01-19T21-19-36.130Z.png Benjamin Dauvergne, 19 janvier 2022 22:22
Firefox_Screenshot_2022-01-19T21-20-55.591Z.png (362 ko) Firefox_Screenshot_2022-01-19T21-20-55.591Z.png Benjamin Dauvergne, 19 janvier 2022 22:22
0001-add-a-generic-soap-connector-60836.patch (11,9 ko) 0001-add-a-generic-soap-connector-60836.patch Benjamin Dauvergne, 20 janvier 2022 08:50
0001-add-a-generic-soap-connector-60836.patch (11,9 ko) 0001-add-a-generic-soap-connector-60836.patch Benjamin Dauvergne, 20 janvier 2022 09:00
0001-add-a-generic-soap-connector-60836.patch (28,4 ko) 0001-add-a-generic-soap-connector-60836.patch Benjamin Dauvergne, 20 janvier 2022 11:29
0001-add-a-generic-soap-connector-60836.patch (28,4 ko) 0001-add-a-generic-soap-connector-60836.patch Benjamin Dauvergne, 23 mars 2022 11:14
0005-wip-on-soaperror-set-availability-of-connector-to-do.patch (4,83 ko) 0005-wip-on-soaperror-set-availability-of-connector-to-do.patch Benjamin Dauvergne, 23 mars 2022 11:14
0007-wip-report-xsd-type-name-in-json-schema-for-debug.patch (1,92 ko) 0007-wip-report-xsd-type-name-in-json-schema-for-debug.patch Benjamin Dauvergne, 23 mars 2022 11:14
0002-wip-add-test-of-homepage-get_endpoint_infos.patch (1,06 ko) 0002-wip-add-test-of-homepage-get_endpoint_infos.patch Benjamin Dauvergne, 23 mars 2022 11:14
0006-wip-add-wsse-UsernameToken-support.patch (5,2 ko) 0006-wip-add-wsse-UsernameToken-support.patch Benjamin Dauvergne, 23 mars 2022 11:14
0004-misc-factorize-setting-of-the-availability-status.patch (1,52 ko) 0004-misc-factorize-setting-of-the-availability-status.patch Benjamin Dauvergne, 23 mars 2022 11:14
0003-wip-add-more-test-around-jsonify.patch (3,86 ko) 0003-wip-add-more-test-around-jsonify.patch Benjamin Dauvergne, 23 mars 2022 11:14
0001-add-a-generic-soap-connector-60836.patch (28,4 ko) 0001-add-a-generic-soap-connector-60836.patch Benjamin Dauvergne, 24 mars 2022 17:42
0005-wip-on-soaperror-set-availability-of-connector-to-do.patch (4,83 ko) 0005-wip-on-soaperror-set-availability-of-connector-to-do.patch Benjamin Dauvergne, 24 mars 2022 17:42
0009-wip-report-xsd-type-in-json-schema.patch (2,53 ko) 0009-wip-report-xsd-type-in-json-schema.patch Benjamin Dauvergne, 24 mars 2022 17:42
0007-wip-report-xsd-type-name-in-json-schema-for-debug.patch (1,92 ko) 0007-wip-report-xsd-type-name-in-json-schema-for-debug.patch Benjamin Dauvergne, 24 mars 2022 17:42
0002-wip-add-test-of-homepage-get_endpoint_infos.patch (1,06 ko) 0002-wip-add-test-of-homepage-get_endpoint_infos.patch Benjamin Dauvergne, 24 mars 2022 17:42
0006-wip-add-wsse-UsernameToken-support.patch (5,2 ko) 0006-wip-add-wsse-UsernameToken-support.patch Benjamin Dauvergne, 24 mars 2022 17:42
0004-misc-factorize-setting-of-the-availability-status.patch (1,52 ko) 0004-misc-factorize-setting-of-the-availability-status.patch Benjamin Dauvergne, 24 mars 2022 17:42
0008-wip-convert-soap-Fault-to-json.patch (1,38 ko) 0008-wip-convert-soap-Fault-to-json.patch Benjamin Dauvergne, 24 mars 2022 17:42
0003-wip-add-more-test-around-jsonify.patch (3,86 ko) 0003-wip-add-more-test-around-jsonify.patch Benjamin Dauvergne, 24 mars 2022 17:42
0001-add-a-generic-soap-connector-60836.patch (28,4 ko) 0001-add-a-generic-soap-connector-60836.patch Benjamin Dauvergne, 25 mars 2022 12:17
0005-wip-on-soaperror-set-availability-of-connector-to-do.patch (3,81 ko) 0005-wip-on-soaperror-set-availability-of-connector-to-do.patch Benjamin Dauvergne, 25 mars 2022 12:17
0007-wip-add-wsse-UsernameToken-support.patch (5,2 ko) 0007-wip-add-wsse-UsernameToken-support.patch Benjamin Dauvergne, 25 mars 2022 12:17
0010-wip-report-xsd-type-in-json-schema.patch (4,74 ko) 0010-wip-report-xsd-type-in-json-schema.patch Benjamin Dauvergne, 25 mars 2022 12:17
0008-wip-report-xsd-type-name-in-json-schema-for-debug.patch (1,93 ko) 0008-wip-report-xsd-type-name-in-json-schema-for-debug.patch Benjamin Dauvergne, 25 mars 2022 12:17
0002-wip-add-test-of-homepage-get_endpoint_infos.patch (1,06 ko) 0002-wip-add-test-of-homepage-get_endpoint_infos.patch Benjamin Dauvergne, 25 mars 2022 12:17
0004-misc-factorize-setting-of-the-availability-status.patch (1,53 ko) 0004-misc-factorize-setting-of-the-availability-status.patch Benjamin Dauvergne, 25 mars 2022 12:17
0009-wip-convert-soap-Fault-to-json.patch (1,38 ko) 0009-wip-convert-soap-Fault-to-json.patch Benjamin Dauvergne, 25 mars 2022 12:17
0003-wip-add-more-test-around-jsonify.patch (3,86 ko) 0003-wip-add-more-test-around-jsonify.patch Benjamin Dauvergne, 25 mars 2022 12:17
0006-misc-search-endpoints-on-model-not-on-the-instance.patch (1,07 ko) 0006-misc-search-endpoints-on-model-not-on-the-instance.patch Benjamin Dauvergne, 25 mars 2022 12:17
0011-wip-check-properties-to-decide-between-get-post-endp.patch (964 octets) 0011-wip-check-properties-to-decide-between-get-post-endp.patch Benjamin Dauvergne, 25 mars 2022 12:17
Screenshot_2022-03-25 Passerelle.png (25,7 ko) Screenshot_2022-03-25 Passerelle.png Nicolas Roche, 25 mars 2022 14:05

Révisions associées

Révision 1c5c7e54 (diff)
Ajouté par Benjamin Dauvergne il y a environ 2 ans

misc: factorize setting of the availability status (#60836)

Révision 49881354 (diff)
Ajouté par Benjamin Dauvergne il y a environ 2 ans

misc: search endpoints on model not on the instance (#60836)

Instance have property descriptors which can fail on a getattr(), raising errors
during getmembers(), by iterating on the class we work around that.

Révision 1f748deb (diff)
Ajouté par Benjamin Dauvergne il y a environ 2 ans

add a generic soap connector (#60836)

Historique

#4

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

wip, le cas du ticket lié est déjà couvert directement sans développement.

#5

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

  • Assigné à mis à Benjamin Dauvergne
#6

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

#8

Mis à jour par Nicolas Roche il y a plus de 2 ans

wip, le cas du ticket lié est déjà couvert directement sans développement.

Magique !
J'ai l'impression que json_schema_response n'est pas pris en compte.
(pour retourner le format canonique avec {'err':, 'data':})

#9

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

La méthode "method" est faite pour nous faciliter la vie lors du prototypage (mais on peut utiliser ça jusqu'à la prod ça ne devrait pas poser de souci). Les paramètres de query-string sont repris (via getlist dans la dernière branche) est passé à la méthode en plus du payload JSON de POST (qui a la priorité). Donc étant donnée des méthodes getTruc et createTruc on peut faire :
  • juste GET /soap/service1/method/getTruc/ pour obtenir un référentiel
  • ou bien GET /soap/service1/method/getTruc/?query=machin si getTruc accepte un paramètre query qui peut être une liste ou une simple chaîne (un Element<type=xs:string max_occurs=1 ou unbounded>)
  • un POST sur /soap/service1/method/createTruc?name=machin&email=machin@example.com si createTruc prend deux paramètre name et machin
  • ou bien un POST /soap/service1/method/createTruc avec un payload JSON {'name': 'machin', 'email': 'machin@example.com'}

Et ça utilise aussi unflatten sur le POST JSON, donc on peut aussi faire un POST de {'Truc/Name': 'machin', 'Truc/Email': 'machin@example.com'} si l'API SOAP exige une structure XML de la forme Truc(Name=..., Email=...).

#10

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

Possible, j'ai ajouté le conteneur explicite {'err': 0, 'data': ..} en fin de méthode method.

#11

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

Et une petite amélioration au schéma en sortie (l'élément racine est ignoré).

#13

Mis à jour par Nicolas Roche il y a environ 2 ans

C'est dommage, que les tests ne passent pas dans les fonctions "récursives/ou pas loin" comme jsonify et get_endpoints_infos.
Déjà je vois ça :
  • crash si en face on a un mauvais certificat (et que l'on a pas coché l'option pour l'ignorer)
       File "/home/nroche/src/passerelle/passerelle/utils/soap.py", line 87, in _load_remote_data
       raise SOAPError(
    
  • crash sur un mauvais wsdl
        File "/home/nroche/src/passerelle/passerelle/apps/soap/models.py", line 139, in operations_and_schemas
        operations = self.client.service._binding._operations
      File "/home/nroche/envs/publik-env-py3/lib/python3.9/site-packages/zeep/client.py", line 100, in service
        raise ValueError(
    ValueError: There is no default service defined. This is usually due to missing wsdl:service definitions in the WSDL
    
  • il manque l'authentification du client
       return self.soap_client(
           wsdl_url=self.wsdl_url,
    ++     wsse=UsernameToken(self.basic_auth_username, self.basic_auth_password),
           ...
    
#15

Mis à jour par Benjamin Dauvergne il y a environ 2 ans

  • Statut changé de Solution proposée à En cours
#20

Mis à jour par Nicolas Roche il y a environ 2 ans

C'est vraiment top, et je suis pressé de l'avoir en recette !

Dans 0005 tu as embarqué une correction de 0004 concernant passerelle/base/models.py.

Aussi, je n'ai pas compris l'impact de la modif sur inspect.getmembers pour récupérer les infos sur les endpoints, où plutôt que de récupérer les méthodes sur un objet, on récupère les fonctions sur les classes.
Je la verrais bien dans un commit séparé histoire d'avoir une petite explication dans son intitulé.

0006: c'est bizarre d'avoir le mot de passe pour l'authentification basique relayé plus bas. J'aurais mis :

fields[:4] + fields[-5:] + fields[4:-5]

Peut-être merger 0007 et 0009 ?

Enfin, j'aurais laissé les WS qui n'ont pas d'arguments en GET, histoire que d'un unique coup d’œil (parce que c'est bleu) on sache que l'on puisse cliquer dessus pour obtenir directement des résultats :

<<<
        if input_schema:
            endpoints[-1].http_method = 'post'
---
        if input_schema and input_schema.get('type') != 'null':
>>>

#21

Mis à jour par Benjamin Dauvergne il y a environ 2 ans

Nicolas Roche a écrit :

C'est vraiment top, et je suis pressé de l'avoir en recette !

Dans 0005 tu as embarqué une correction de 0004 concernant passerelle/base/models.py.

Oui je l'ai remis dans le bon commit, mais tout ce qui est wip va être rebasé dans le premier commit.

Aussi, je n'ai pas compris l'impact de la modif sur inspect.getmembers pour récupérer les infos sur les endpoints, où plutôt que de récupérer les méthodes sur un objet, on récupère les fonctions sur les classes.
Je la verrais bien dans un commit séparé histoire d'avoir une petite explication dans son intitulé.

C'est fait, le problème vient de la propriété operations_and_schemas, inspect.getmembers() fait un getattr au lieu de hasattr ce qui provoque une éventuelle erreur SOAPError et plante la recherche des endpoints, comme les endpoints sont en fait toujours défini sur la classe, c'est sur la classe qu'il faut faire getmembers() pour éviter ça (ça pourrait revenir à tout moment dès qu'on crée un property sur un modèle).

0006: c'est bizarre d'avoir le mot de passe pour l'authentification basique relayé plus bas. J'aurais mis :
[...]

Non je suis pas fan, l'auth basic est un détail et jusqu'à présent c'est rare qu'il y en ait.

Peut-être merger 0007 et 0009 ?

Comme dit plus haut, tout vas être mergé, sauf les misc:*.

Enfin, j'aurais laissé les WS qui n'ont pas d'arguments en GET, histoire que d'un unique coup d’œil (parce que c'est bleu) on sache que l'on puisse cliquer dessus pour obtenir directement des résultats :
[...]

Ok.

#23

Mis à jour par Nicolas Roche il y a environ 2 ans

Tout bon pour moi.
Je pose quand même cette capture d'écran pour préciser ce que j'entendais pas "le mot de passe pour l'authentification basique relayé plus bas" (donc j'aurais mis fields[:2] + fields[-5:] + fields[2:-5] pour déplacer le login et le mot de passe sans les séparer)

#24

Mis à jour par Benjamin Dauvergne il y a environ 2 ans

Rebasage sur le travail de Laureline, je vais regarder pour l'ordre des champs (le nombre de champs diffèrent, plus de slug, entre le formulaire de création et celui d'édition ça explique le souci).

#25

Mis à jour par Benjamin Dauvergne il y a environ 2 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit 1f748deb73e152b34f6e1250662c70a9604ba318
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Wed Jan 19 16:52:48 2022 +0100

    add a generic soap connector (#60836)

commit 498813542f11f3f65bf326bec8387e67d8b0e16c
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Fri Mar 25 12:11:25 2022 +0100

    misc: search endpoints on model not on the instance (#60836)

    Instance have property descriptors which can fail on a getattr(), raising errors
    during getmembers(), by iterating on the class we work around that.

commit 1c5c7e545467bfd052cb18f3cf327d223731253d
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Wed Mar 23 07:12:00 2022 +0100

    misc: factorize setting of the availability status (#60836)
#26

Mis à jour par Transition automatique il y a environ 2 ans

  • Statut changé de Résolu (à déployer) à Solution déployée
#27

Mis à jour par Transition automatique il y a presque 2 ans

Automatic expiration

Formats disponibles : Atom PDF