Suche
Schließen Sie dieses Suchfeld.

Große Erwartungen

Verwendung des expect-Tools für die autonome Interaktion mit SysBack zur Erstellung eines in die kontinuierliche Integrationspipeline eingebetteten End-to-End-Tests.

Verwendung des Tools expect für die autonome Interaktion mit SysBack.

Wir haben vor kurzem die Entwicklung von SysBack übernommen, das zuvor von IBM entwickelt worden war.

Da ich gerade an einem Round-Trip-Test (für die intern entwickelten Bare-Metal-Restore-Produkte) gearbeitet hatte, war es sinnvoll, diesen Test auf SysBack auszudehnen (da es weitgehend dieselbe Funktion wie die internen Programme erfüllen kann), bevor ich den SysBack-Code änderte.

Ein Problem, das ich sofort erkannte, war, dass unsere BMR-Produkte die Möglichkeit haben, ssh auszuführen, was eine Fernmanipulation des Prozesses ermöglicht. SysBack aktiviert ssh normalerweise nicht.

Da das Sysback-Boot-Image auf einem Hypervisor (IBMs HMC) läuft, war nicht alles verloren: Wir können mit dem Hypervisor kommunizieren, der wiederum über seine Konsole mit dem Boot-Image kommunizieren kann.

Expect ist ein altehrwürdiges Programm, das die Interaktion mit Programmen automatisiert, die eine Textterminal-Schnittstelle aufweisen. Es gab zwar eine Reihe technischer Probleme zu lösen, aber wir waren der Meinung, dass die Änderung unseres bestehenden Testprogramms machbar war; ein Eindruck, der sich bestätigte, als die Interaktion schließlich kodiert wurde.

Das Testprogramm ist in Python geschrieben, daher habe ich Paramiko Expect verwendet .

Das erste, was ich mit Expect gemacht habe, war die Interaktion mit der SysBack-Wiederherstellungs-CD, was einige Herausforderungen mit sich brachte. Ich begann mit dem Beispiel paramiko_expect-demo.py, das definiert:

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

Die SysBack-CD verwendet zunächst [n]curses, um das erforderliche Terminal einzurichten, und fordert den Benutzer auf, die Taste y zu drücken, nachdem der Terminaltyp definiert wurde, um zu bestätigen, dass er korrekt angezeigt wird. Beachten Sie, dass es sich um ein reines y-Zeichen handelt, nicht um ein y gefolgt von einem Wagenrücklauf oder einem Zeilenumbruch.

Implizit wird durch die Verwendung von SSHClientInteraction sind einige Standardwerte - einer davon ist newline='\r' (dieses Wissen wird durch das Studium des Quellcodes gewonnen, paramiko_expect.py ), so meine wir verwenden:

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

Ich behandle die Zeilenumbrüche, indem ich entsprechende Zeichen nach dem Text meiner Antwort sende.

Nebenbei bemerkt, habe ich zuerst auf der Integrierter Virtualisierungsmanager (IVM), da wir zu der Zeit keine HMC hatten, und dort habe ich \n, ASCII-Zeichen 10(dezimal) als newline. Als ich das Testprogramm zur Ausführung auf einer HMC verschob, stellte ich fest, dass das Senden eines CR/LF (\r\n ASCII 13 dann 10 Zeichen) funktionierte als newline. Es dauerte einige Zeit, bis ich erkannte, dass ich diese Veränderung vornehmen musste.

Als ich erst einmal mit der CD sprechen konnte, war es bald recht einfach, sich auf der CD zu bewegen. Ich definierte

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

um die Navigation zu erleichtern - ich glaube, ich habe das Menü immer nur verlassen (Escape) und bin nach unten gegangen. Hätte ich mehr Kontrolle gebraucht, hätte ich andere Fluchsequenzen finden müssen, um nach oben oder nach rechts oder nach links oder was auch immer zu gehen.

Am besten hat mir der Teil des Codes gefallen, der ein Formular ausfüllte :-)

[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\t')
interact.send(self.tsm_data['tsm_password'] + '\t')
interact.send(esc_char + esc_char + esc_char)
[/code]

wo:

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

die es mir ermöglicht, Konfigurationsdaten zu Beginn des Laufs festzulegen und dann innerhalb des Expect-Codes darauf zuzugreifen.

Sobald SysBack einen Rechner wiederhergestellt hat, durchläuft er einen Neustart-Zyklus, dann können wir expect (mit einem sehr hohen Timeout) verwenden, um auf eine Anmeldeaufforderung zu warten:

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

Ich melde mich über expect an und aktiviere das Netzwerk und ssh und führe dann eine Analyse nach der Wiederherstellung über ssh durch.

Ich fand es sehr nützlich, den Rechner laufen und verfügbar zu haben und kleine Testskripte zu schreiben, die die minimalen Daten an das Python-Modul lieferten, das den Expect-Code enthielt, anstatt mein Round-Trip-Testprogramm jedes Mal neu starten zu müssen, da es ziemlich lange dauert, einen Rechner zu sichern und wiederherzustellen.

Kontakt

Vielen Dank, dass Sie uns kontaktiert haben. Wir haben Ihre Anfrage erhalten.