1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | -module(python_migration_SUITE). -compile(export_all). -include_lib("common_test/include/ct.hrl"). suite() -> % Make SSH and Python settings from config files, sshconfig.cfg % and pyconfig.cfg, available in the suite [{require, server}, {require, client1}, {require, client2}, {require, serverSettings}, {require, client1Settings}, {require, client2Settings}]. init_per_suite(Config) -> % Start ssh connection to server, client1 and client2 {ok, Server} = ct_ssh:connect(server), {ok, Client1} = ct_ssh:connect(client1), {ok, Client2} = ct_ssh:connect(client2), % Append handles to config variable [{ssh_handles,{Server, Client1, Client2}} | Config]. end_per_suite(Config) -> % Get ssh handles from config and make them a traversable list Handles = erlang:tuple_to_list(?config(ssh_handles, Config)), % Disconnect any active ssh handle lists:foreach(fun(Handle) -> ct_ssh:disconnect(Handle) end, Handles). init_per_group(_GroupName, Config) -> % Get ssh handles from config {Server, Client1, Client2} = ?config(ssh_handles, Config), % Start python server on server and log stdout ct_ssh:exec(Server, "python " ++ ct:get_config({serverSettings, serverpy}) ++ " -i " ++ ct:get_config({serverSettings, serverip}) ++ " -p " ++ ct:get_config({serverSettings, serverport}) ++ " >> " ++ ct:get_config({serverSettings, serverlog}), 2000), % Start python client on client1 and log stdout ct_ssh:exec(Client1, "python " ++ ct:get_config({client1Settings, client1py}) ++ " -i " ++ ct:get_config({client1Settings, client1ip}) ++ " -p " ++ ct:get_config({client1Settings, client1port}) ++ " > " ++ ct:get_config({client1Settings, client1log}), 2000), % Start python client on client2 and log stdout ct_ssh:exec(Client2, "python " ++ ct:get_config({client2Settings, client2py}) ++ " -i " ++ ct:get_config({client2Settings, client2ip}) ++ " -p " ++ ct:get_config({client2Settings, client2port}) ++ " > " ++ ct:get_config({client2Settings, client2log}), 2000), Config. end_per_group(_GroupName, Config) -> % Get ssh handles from config {Server, Client1, Client2} = ?config(ssh_handles, Config), % End python server on server ct_ssh:exec(Server, "python " ++ ct:get_config({serverSettings, commandpy}) ++ " -x"), % End python client on client1 ct_ssh:exec(Client1, "pkill -f 'client.py'"), % End python client on client2 ct_ssh:exec(Client2, "pkill -f 'client.py'"), ok. init_per_testcase(_TestCase, Config) -> Config. end_per_testcase(_TestCase, _Config) -> ok. groups() -> % Define sequential group migrateC1, then migrate2 [{migrateTest, [sequence], [migrateC1, migrateC2]}]. all() -> % Run the whole group when the suite is run [migrateTest]. migrateC1() -> % Do nothing in this testcase info function []. migrateC2() -> % Do nothing in this testcase info function []. migrateC1(Config) -> % Get server handle as it is the only one used in the testcase Server = element(1, ?config(ssh_handles,Config)), % Initial delay 2 seconds to assure that the server has been started properly ok = timer:sleep(2000), % Redirect server stream to client1 ct_ssh:exec(Server, "python " ++ ct:get_config({serverSettings, commandpy}) ++ " -i " ++ ct:get_config({client1Settings, client1ip}) ++ " -p " ++ ct:get_config({client1Settings, client1port})), % Delay 7 seconds ok = timer:sleep(7000), ok. migrateC2(Config) -> % Get server handle as it is the only one used in the testcase Server = element(1, ?config(ssh_handles,Config)), % Redirect server stream to client2 ct_ssh:exec(Server, "python " ++ ct:get_config({serverSettings, commandpy}) ++ " -i " ++ ct:get_config({client2Settings, client2ip}) ++ " -p " ++ ct:get_config({client2Settings, client2port})), % Delay 7 seconds ok = timer:sleep(7000), ok. |
LW1vZHVsZShweXRob25fbWlncmF0aW9uX1NVSVRFKS4KLWNvbXBpbGUoZXhwb3J0X2FsbCkuCi1pbmNsdWRlX2xpYigiY29tbW9uX3Rlc3QvaW5jbHVkZS9jdC5ocmwiKS4KCgpzdWl0ZSgpIC0+CgklIE1ha2UgU1NIIGFuZCBQeXRob24gc2V0dGluZ3MgZnJvbSBjb25maWcgZmlsZXMsIHNzaGNvbmZpZy5jZmcgCgklIGFuZCBweWNvbmZpZy5jZmcsIGF2YWlsYWJsZSBpbiB0aGUgc3VpdGUKICAgIFt7cmVxdWlyZSwgc2VydmVyfSwgCiAgICAge3JlcXVpcmUsIGNsaWVudDF9LCAKICAgICB7cmVxdWlyZSwgY2xpZW50Mn0sCiAgICAge3JlcXVpcmUsIHNlcnZlclNldHRpbmdzfSwKICAgICB7cmVxdWlyZSwgY2xpZW50MVNldHRpbmdzfSwKICAgICB7cmVxdWlyZSwgY2xpZW50MlNldHRpbmdzfV0uIAoKaW5pdF9wZXJfc3VpdGUoQ29uZmlnKSAtPgogICAgJSBTdGFydCBzc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIsIGNsaWVudDEgYW5kIGNsaWVudDIKICAgIHtvaywgU2VydmVyfSAgPSBjdF9zc2g6Y29ubmVjdChzZXJ2ZXIpLAogICAge29rLCBDbGllbnQxfSA9IGN0X3NzaDpjb25uZWN0KGNsaWVudDEpLAoJe29rLCBDbGllbnQyfSA9IGN0X3NzaDpjb25uZWN0KGNsaWVudDIpLAoJCgklIEFwcGVuZCBoYW5kbGVzIHRvIGNvbmZpZyB2YXJpYWJsZQogICAgW3tzc2hfaGFuZGxlcyx7U2VydmVyLCBDbGllbnQxLCBDbGllbnQyfX0gfCBDb25maWddLgoKCmVuZF9wZXJfc3VpdGUoQ29uZmlnKSAtPgoJJSBHZXQgc3NoIGhhbmRsZXMgZnJvbSBjb25maWcgYW5kIG1ha2UgdGhlbSBhIHRyYXZlcnNhYmxlIGxpc3QKICAgIEhhbmRsZXMgPSBlcmxhbmc6dHVwbGVfdG9fbGlzdCg/Y29uZmlnKHNzaF9oYW5kbGVzLCBDb25maWcpKSwKCiAgICAlIERpc2Nvbm5lY3QgYW55IGFjdGl2ZSBzc2ggaGFuZGxlCglsaXN0czpmb3JlYWNoKGZ1bihIYW5kbGUpIC0+IGN0X3NzaDpkaXNjb25uZWN0KEhhbmRsZSkgZW5kLCAKCQkJCSAgSGFuZGxlcykuCgoKaW5pdF9wZXJfZ3JvdXAoX0dyb3VwTmFtZSwgQ29uZmlnKSAtPgogICAgJSBHZXQgc3NoIGhhbmRsZXMgZnJvbSBjb25maWcKCXtTZXJ2ZXIsIENsaWVudDEsIENsaWVudDJ9ID0gP2NvbmZpZyhzc2hfaGFuZGxlcywgQ29uZmlnKSwKCiAgICAlIFN0YXJ0IHB5dGhvbiBzZXJ2ZXIgb24gc2VydmVyIGFuZCBsb2cgc3Rkb3V0CgljdF9zc2g6ZXhlYyhTZXJ2ZXIsICJweXRob24gIiArKyBjdDpnZXRfY29uZmlnKHtzZXJ2ZXJTZXR0aW5ncywgc2VydmVycHl9KSAKCQkJCSsrICIgLWkgIiArKyBjdDpnZXRfY29uZmlnKHtzZXJ2ZXJTZXR0aW5ncywgc2VydmVyaXB9KSAKCQkJCSsrICIgLXAgIiArKyBjdDpnZXRfY29uZmlnKHtzZXJ2ZXJTZXR0aW5ncywgc2VydmVycG9ydH0pIAoJCQkJKysgIiA+PiAiICsrIGN0OmdldF9jb25maWcoe3NlcnZlclNldHRpbmdzLCBzZXJ2ZXJsb2d9KSwgCgkJCQkyMDAwKSwKCiAgICAlIFN0YXJ0IHB5dGhvbiBjbGllbnQgb24gY2xpZW50MSBhbmQgbG9nIHN0ZG91dAoJY3Rfc3NoOmV4ZWMoQ2xpZW50MSwgInB5dGhvbiAiICsrIGN0OmdldF9jb25maWcoe2NsaWVudDFTZXR0aW5ncywgY2xpZW50MXB5fSkgCgkJCQkrKyAiIC1pICIgKysgY3Q6Z2V0X2NvbmZpZyh7Y2xpZW50MVNldHRpbmdzLCBjbGllbnQxaXB9KQoJCQkJKysgIiAtcCAiICsrIGN0OmdldF9jb25maWcoe2NsaWVudDFTZXR0aW5ncywgY2xpZW50MXBvcnR9KQoJCQkgICAgKysgIiA+ICIgKysgY3Q6Z2V0X2NvbmZpZyh7Y2xpZW50MVNldHRpbmdzLCBjbGllbnQxbG9nfSksIAoJCQkJMjAwMCksCgogICAgJSBTdGFydCBweXRob24gY2xpZW50IG9uIGNsaWVudDIgYW5kIGxvZyBzdGRvdXQKCWN0X3NzaDpleGVjKENsaWVudDIsICJweXRob24gIiArKyBjdDpnZXRfY29uZmlnKHtjbGllbnQyU2V0dGluZ3MsIGNsaWVudDJweX0pIAoJCQkJKysgIiAtaSAiICsrIGN0OmdldF9jb25maWcoe2NsaWVudDJTZXR0aW5ncywgY2xpZW50MmlwfSkKCQkJCSsrICIgLXAgIiArKyBjdDpnZXRfY29uZmlnKHtjbGllbnQyU2V0dGluZ3MsIGNsaWVudDJwb3J0fSkKCQkJICAgICsrICIgPiAiICsrIGN0OmdldF9jb25maWcoe2NsaWVudDJTZXR0aW5ncywgY2xpZW50MmxvZ30pLCAKCQkJCTIwMDApLAoKICAgIENvbmZpZy4KCmVuZF9wZXJfZ3JvdXAoX0dyb3VwTmFtZSwgQ29uZmlnKSAtPgogICAgJSBHZXQgc3NoIGhhbmRsZXMgZnJvbSBjb25maWcKCXtTZXJ2ZXIsIENsaWVudDEsIENsaWVudDJ9ID0gP2NvbmZpZyhzc2hfaGFuZGxlcywgQ29uZmlnKSwKCiAgICAlIEVuZCBweXRob24gc2VydmVyIG9uIHNlcnZlcgoJY3Rfc3NoOmV4ZWMoU2VydmVyLCAicHl0aG9uICIgKysgY3Q6Z2V0X2NvbmZpZyh7c2VydmVyU2V0dGluZ3MsIGNvbW1hbmRweX0pICsrICIgLXgiKSwKCiAgICAlIEVuZCBweXRob24gY2xpZW50IG9uIGNsaWVudDEKCWN0X3NzaDpleGVjKENsaWVudDEsICJwa2lsbCAtZiAnY2xpZW50LnB5JyIpLAoKICAgICUgRW5kIHB5dGhvbiBjbGllbnQgb24gY2xpZW50MgoJY3Rfc3NoOmV4ZWMoQ2xpZW50MiwgInBraWxsIC1mICdjbGllbnQucHknIiksCgogICAgb2suCgppbml0X3Blcl90ZXN0Y2FzZShfVGVzdENhc2UsIENvbmZpZykgLT4KICAgIENvbmZpZy4KCmVuZF9wZXJfdGVzdGNhc2UoX1Rlc3RDYXNlLCBfQ29uZmlnKSAtPgogICAgb2suCgpncm91cHMoKSAtPgogICAgJSBEZWZpbmUgc2VxdWVudGlhbCBncm91cCBtaWdyYXRlQzEsIHRoZW4gbWlncmF0ZTIKICAgIFt7bWlncmF0ZVRlc3QsIFtzZXF1ZW5jZV0sIFttaWdyYXRlQzEsIG1pZ3JhdGVDMl19XS4KCmFsbCgpIC0+CgklIFJ1biB0aGUgd2hvbGUgZ3JvdXAgd2hlbiB0aGUgc3VpdGUgaXMgcnVuCiAgICBbbWlncmF0ZVRlc3RdLgoKbWlncmF0ZUMxKCkgLT4KCSUgRG8gbm90aGluZyBpbiB0aGlzIHRlc3RjYXNlIGluZm8gZnVuY3Rpb24KICAgIFtdLgoKbWlncmF0ZUMyKCkgLT4KCSUgRG8gbm90aGluZyBpbiB0aGlzIHRlc3RjYXNlIGluZm8gZnVuY3Rpb24KICAgIFtdLgoKbWlncmF0ZUMxKENvbmZpZykgLT4KICAgICUgR2V0IHNlcnZlciBoYW5kbGUgYXMgaXQgaXMgdGhlIG9ubHkgb25lIHVzZWQgaW4gdGhlIHRlc3RjYXNlCglTZXJ2ZXIgPSBlbGVtZW50KDEsID9jb25maWcoc3NoX2hhbmRsZXMsQ29uZmlnKSksCgkKCSUgSW5pdGlhbCBkZWxheSAyIHNlY29uZHMgdG8gYXNzdXJlIHRoYXQgdGhlIHNlcnZlciBoYXMgYmVlbiBzdGFydGVkIHByb3Blcmx5CglvayA9IHRpbWVyOnNsZWVwKDIwMDApLAoKICAgICUgUmVkaXJlY3Qgc2VydmVyIHN0cmVhbSB0byBjbGllbnQxIAoJY3Rfc3NoOmV4ZWMoU2VydmVyLCAicHl0aG9uICIgKysgY3Q6Z2V0X2NvbmZpZyh7c2VydmVyU2V0dGluZ3MsIGNvbW1hbmRweX0pCgkJCQkrKyAiIC1pICIgKysgY3Q6Z2V0X2NvbmZpZyh7Y2xpZW50MVNldHRpbmdzLCBjbGllbnQxaXB9KSAKCQkJCSsrICIgLXAgIiArKyBjdDpnZXRfY29uZmlnKHtjbGllbnQxU2V0dGluZ3MsIGNsaWVudDFwb3J0fSkpLAoKICAgICUgRGVsYXkgNyBzZWNvbmRzCglvayA9IHRpbWVyOnNsZWVwKDcwMDApLAoKICAgIG9rLgoKbWlncmF0ZUMyKENvbmZpZykgLT4KICAgICUgR2V0IHNlcnZlciBoYW5kbGUgYXMgaXQgaXMgdGhlIG9ubHkgb25lIHVzZWQgaW4gdGhlIHRlc3RjYXNlCglTZXJ2ZXIgPSBlbGVtZW50KDEsID9jb25maWcoc3NoX2hhbmRsZXMsQ29uZmlnKSksCgogICAgJSBSZWRpcmVjdCBzZXJ2ZXIgc3RyZWFtIHRvIGNsaWVudDIKCWN0X3NzaDpleGVjKFNlcnZlciwgInB5dGhvbiAiICsrIGN0OmdldF9jb25maWcoe3NlcnZlclNldHRpbmdzLCBjb21tYW5kcHl9KSAKCQkJCSsrICIgLWkgIiArKyBjdDpnZXRfY29uZmlnKHtjbGllbnQyU2V0dGluZ3MsIGNsaWVudDJpcH0pIAoJCQkJKysgIiAtcCAiICsrIGN0OmdldF9jb25maWcoe2NsaWVudDJTZXR0aW5ncywgY2xpZW50MnBvcnR9KSksCgogICAgJSBEZWxheSA3IHNlY29uZHMKCW9rID0gdGltZXI6c2xlZXAoNzAwMCksCgogICAgb2suCg==


