Recherche
Fermer cette boîte de recherche.

Grandes espérances

Utilisation de l'outil expect pour une interaction autonome avec SysBack afin de produire un test de bout en bout intégré dans le pipeline d'intégration continue.

Utilisation de l'outil d'attente pour une interaction autonome avec SysBack.

Nous avons récemment repris le développement de SysBack, qui était auparavant développé par IBM.

Puisque je venais de travailler sur un test d'aller-retour (pour les produits de restauration bare metal développés en interne), il était logique d'étendre ce test à la gestion de SysBack (puisqu'il peut réaliser à peu près la même fonction que les programmes internes) avant de modifier le code de SysBack.

Un problème que j'ai immédiatement prévu est que nos produits BMR ont la possibilité d'exécuter ssh qui permet la manipulation à distance du processus. SysBack n'active généralement pas ssh.

Comme l'image de démarrage Sysback fonctionne sur un hyperviseur (HMC d'IBM), tout n'est pas perdu : nous pouvons parler à l'hyperviseur qui, à son tour, peut parler à l'image de démarrage via sa console.

Expect est un programme vénérable qui automatise les interactions avec les programmes qui exposent une interface de terminal texte. Bien qu'il y ait eu un certain nombre de problèmes techniques à surmonter, nous avons pensé que la modification de notre programme de test existant était faisable ; un sentiment qui a été validé une fois que l'interaction a été codée.

Le programme de test est écrit en python, j'ai donc utilisé Paramiko Expect.

La première chose que j'ai faite avec Expect a été d'interagir avec le CD de récupération SysBack, ce qui a présenté quelques défis. J'ai commencé avec l'exemple paramiko_expect-demo.py, qui définit :

[code language="python"]
with SSHClientInteraction(
client,
timeout=10,
display=True) as interact :
[/code]

Le CD SysBack utilise initialement des [n]curses pour configurer le terminal requis et demande à l'utilisateur d'appuyer sur y après avoir défini le type de terminal pour confirmer qu'il apparaît correctement. Notez qu'il s'agit d'un simple caractère y, et non d'un y suivi d'un retour chariot ou d'un caractère de nouvelle ligne.

Il est implicite que l'utilisation de SSHClientInteraction Il existe des valeurs par défaut, dont l'une est la suivante newline='\r' (ces connaissances sont acquises par l'étude du code source, paramiko_expect.py ), donc mon nous utilisons :

[code language="python"]
with SSHClientInteraction(
client,
timeout=100,
newline=",
display=True) as interact :
[/code]

Je gère les nouvelles lignes en envoyant les caractères appropriés après le corps de ma réponse.

Pour l'anecdote, j'ai d'abord développé sur le Gestionnaire de virtualisation intégré (IVM) puisque, à l'époque, nous n'avions pas de HMC, et là j'ai passé \nle caractère ASCII 10 (décimal) en tant que newline. Lorsque j'ai déplacé le programme de test pour l'exécuter sur une HMC, j'ai découvert que l'envoi d'un CR/LF (\r\n ASCII 13 puis 10 caractères) a fonctionné comme newline. Il m'a fallu du temps pour me rendre compte que je devais faire ce changement.

Une fois que j'ai pu parler au CD de manière efficace, il a été rapidement assez facile de se déplacer dans le CD. J'ai défini

[code language="python"]
esc_char = '\0;33'
down_arrow = esc_char + '[B'
[/code]

pour faciliter la navigation - je suppose que je n'ai jamais quitté le menu (escape) que pour descendre. Si j'avais eu besoin de plus de contrôle, j'aurais dû trouver d'autres séquences de malédiction pour aller vers le haut, la droite, la gauche ou autre.

J'ai surtout apprécié le bout de code qui remplissait un formulaire :-)

[code language="python"]
interact.expect(enter_the_ip, strip_ansi=False)
interact.send(self.tsm_data['client_ip'] + '\t')
interact.send(self.tsm_data['node_name'] + '\t')
interact.send(self.tsm_data['admin_id'] + '\t')
interact.send(self.tsm_data['server_ip'] + '\t')
interact.send(self.network_data['gateway'] + '\t')
interact.send(self.network_data['netmask'] + '\t')
interact.send(self.tsm_data['tsm_password'] + '\t')
interact.send(esc_char + esc_char + esc_char)
[/code]

où :

[code language="python"]
enter_the_ip = '.*Enter the IP address by which the server.*'
[/code]

qui me permet de définir les données de configuration au début de l'exécution et d'y accéder ensuite dans le code attendu.

Une fois que SysBack a restauré une machine, elle passe par un cycle de redémarrage, puis nous pouvons utiliser l'attente (avec un délai d'attente très élevé) pour attendre une invite de connexion :

[code language="python"]
login_prompt = r'\s*Console login:\s*'
[/code]

Je me connecte via expectative et j'active le réseau et le ssh, puis j'effectue l'analyse post-récupération via ssh.

J'ai trouvé très utile d'avoir la machine en marche et disponible et d'écrire de petits scripts de test qui fournissaient les données minimales au module python qui contenait le code attendu, plutôt que de devoir relancer mon programme de test aller-retour à chaque fois, car il faut beaucoup de temps pour sauvegarder et restaurer une machine.

Nous contacter

Merci de nous avoir contactés. Nous avons bien reçu votre demande.