Se connecter à CAS avec Python
Dans cet article, je vous présente comment se connecter à CAS depuis du code python.
Pour se connecter vous devez utiliser les SAS Scripting Wrapper for Analytics Transfer, appelés plus simplement SWAT. Il s'agit d'un package (une interface) Python vers CAS qui :
- Permet l'exécution d'actions d'analyse CAS à l'aide de code Python,
- Permet à l'utilisateur d'exécuter d'extraire les données,
- SWAT "imite" les apis du package pandas, ce qui permet aux utilisateur de panda (manipulation et l'analyse de données) d'utiliser rapidement SWAT
Pour télécharger SWAT c'est sur sur le gitlab de SAS.
L'installation de SWAT se fait en utilisation pip. Par exemple, pour installer la dernière version 1.5.2 (9 septembre 2019) vous pouvez utiliser le code ci-dessous :
1 2 3 4 5 6 |
if [[ $(pip list --disable-pip-version-check | grep swat) ]]; then echo "Python swat package is already installed" else echo "Installing Python swat package" pip install https://github.com/sassoftware/python-swat/releases/download/v1.5.2/python-swat-1.5.2-linux64.tar.gz fi |
Deux méthodes pour accéder à CAS
La connexion peut se faire via deux méthodes.
- Python binary (CAS) protocol
- Python HTTP protocol
Le protocole binaire est implémenté dans le sous-système SAS TK, inclus dans l'installation SWAT (sur les plates-formes où il est pris en charge). Ce protocole contient toutes les données sous forme de transmissions binaires efficaces.
L’interface REST, quant à elle, utilise une communication HTTP ou HTTPS standard. Toutes les demandes et réponses sont effectuées à l'aide de mécanismes HTTP et de données JSON. Cette interface ne nécessite aucun module d'extension Python supplémentaire ni le sous-système SAS TK. tout est fait en pur Python. Cela présente l'avantage d'être plus ouvert, mais la couche de traitement JSON supplémentaire nuit à la performance.
Le schéma ci-dessus montre le processus global d'une demande d'action CAS en Python, depuis l'appel de l'action jusqu'à la récupération des résultats. Le protocole par défaut pour la connexion à CAS est binaire, mais le client SWAT essaie de détecter automatiquement le type en envoyant des paquets de test de types différents pour déterminer lequel a réussi.
Comme le montre le schéma ci-dessous, l'utilisation de l'API REST nécessite plus de conversion. En effet, les objets Python doivent être converti en JSON. Le CAS server doit en suite convertir ces JSON avant d'appeler les CAS Actions :
Exemples de connexion
Le code python ci-dessous permet de se connecter à CAS, en mode binaire (sur linux uniquement).
1 2 3 4 5 6 7 8 |
import os import swat os.environ['CAS_CLIENT_SSL_CA_LIST'] ='/root/swat/vault.crt' conn = swat.CAS('viyacasctrl.nicolas-housset.fr', '5570', 'user', 'mot_de_passe') out = conn.serverstatus() print(out) |
Ce qui donne :
À partir de SAS Viya 3.3, la communication chiffrée est activée sur le serveur par défaut, aussi pour se connecter au serveur CAS, via SWAT, il est nécessaire de positionner la variable d'environnement CAS_CLIENT_SSL_CA_LIST.
CAS_CLIENT_SSL_CA_LIST pointe vers le magasin de certificat utilisé par le serveur CAS ( le certificat vault)
Pour permettre à un programme Python de fonctionner avec SAS Cloud Analytic Services, vous devez établir une connexion avec le serveur. Vous avez besoin du nom d'hôte et du port écoutés par le contrôleur CAS.
Comme nous l'avons vu en introduction, outre la connexion binaire, le package SWAT peut établir une connexion REST. La syntaxe est la suivante :
1 2 3 4 5 6 7 |
import os import swat os.environ['CAS_CLIENT_SSL_CA_LIST'] ='/root/swat/trustedcerts.pem' conn = swat.CAS('viyacasctrl.nicolas-housset.fr/cas-shared-default-http/', '8777', 'user', 'mot_de_passe',protocol='https') out = conn.serverstatus() print(out) |
Notez l'option "protocol=http". Il s'agit du protocole à utiliser pour communiquer avec le serveur. Ce protocole doit correspondre au protocole utilisé par le port spécifié du serveur. Si le premier paramètre est une URL, ce protocole sera utilisé.
Notez également que la variable d'environnement CAS_CLIENT_SSL_CA_LIST ne pointe plus vers le magasin de certificats du serveur CAS, mais vers le magasin de certificat utilisé par le serveur web. N'oubliez pas qu'en fonction du code utilisé ( appel aux fonctions du module request par exemple), il est nécessaire de positionner la variable d'environnement REQUESTS_CA_BUNDLE ( exemple : os.environ['REQUESTS_CA_BUNDLE'] ='/root/swat/trustedcerts.pem' ) bien que le magasin est déjà défini dans CAS_CLIENT_SSL_CA_LIST.
Messages d'erreurs
Vous pouvez rencontrer divers problèmes lors de la connexion à CAS. Les situations les plus courantes sont décrites ci-dessous.
Si vous essayez de vous connecter à un serveur avec SSL activé, mais que vous n'avez pas configuré le certificat sur votre client, vous obtiendrez ce qui suit (notez le code d'état à la fin) :
ERROR: The TCP/IP negClientSSL support routine failed with status 807ff013.
Si vous utilisez le mauvais certificat pour votre serveur, vous obtiendrez une erreur comme celle-ci (notez le code d'état à la fin):
ERROR: The TCP/IP negClientSSL support routine failed with status 807ff008.
Ces deux erreurs peuvent être résolue en définissant le chemin d'accès au certificat approprié dans la variable d'environnement CAS_CLIENT_SSL_CA_LIST, comme indiqué plus haut dans cet article.
L'erreur suivante indique que le client ne peut pas localiser la bibliothèque partagée libssl sur votre ordinateur (notez le code d'état à la fin):
ERROR: The TCP/IP negClientSSL support routine failed with status 803fd068
Le message d'erreur suivant illustre l'absence de la variable d'environnement REQUESTS_CA_BUNDLE pointant sur le magasin de certificat contenant l'autorité de certification ayant signé le certificat du serveur web ( lorsque vous utilisez les fonctions du modules request) :
requests.exceptions.SSLError: [Errno 1] _ssl.c:503: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verif
Le message d'erreur indique que l'URL que vous utilisez pour communiquer ne correspond pas à l'hostname (nom d'hôte) du serveur. Cela peut entraîner une erreur SSL, qui se produit lorsque vous utilisez des alias de domaines, par exemple.
En d'autres termes, si vous spécifiez une URL avec un nom de domaine différent de celui attendu par le serveur, une erreur SSL peut survenir.
requests.exceptions.SSLError: HTTPSConnectionPool(host='xxxxx', port=443): Max retries exceeded with url: /cas-shared-default-http/cas/sessions (Caused by SSLError(SSLCertVerificationError(1, "[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for 'yyyyyyyy'. (_ssl.c:1002)")))
Il est également important que le protocole utilisé pour la communication (HTTP, HTTPS ) corresponde au protocole parlé par le port spécifié du serveur afin d'établir une connexion correcte.