mirror of https://github.com/dswd/vpncloud.git
100 lines
3.1 KiB
Python
100 lines
3.1 KiB
Python
|
#!/usr/bin/env python3
|
||
|
|
||
|
from common import EC2Environment, CREATE, eprint
|
||
|
import time, json, os, atexit
|
||
|
from datetime import date
|
||
|
|
||
|
|
||
|
# Note: this script will run for ~8 minutes and incur costs of about $ 0.02
|
||
|
|
||
|
FILE = "../../target/release/vpncloud"
|
||
|
VERSION = "2.2.0"
|
||
|
REGION = "eu-central-1"
|
||
|
|
||
|
env = EC2Environment(
|
||
|
region = REGION,
|
||
|
node_count = 2,
|
||
|
instance_type = "m5.large",
|
||
|
use_spot = True,
|
||
|
max_price = "0.08", # USD per hour per VM
|
||
|
vpncloud_version = VERSION,
|
||
|
vpncloud_file = FILE,
|
||
|
cluster_nodes = True,
|
||
|
subnet = CREATE,
|
||
|
keyname = CREATE
|
||
|
)
|
||
|
|
||
|
|
||
|
CRYPTO = ["plain", "aes256", "aes128", "chacha20"]
|
||
|
|
||
|
|
||
|
class PerfTest:
|
||
|
def __init__(self, sender, receiver):
|
||
|
self.sender = sender
|
||
|
self.receiver = receiver
|
||
|
self.sender_ip_vpncloud = "10.0.0.1"
|
||
|
self.receiver_ip_vpncloud = "10.0.0.2"
|
||
|
|
||
|
@classmethod
|
||
|
def from_ec2_env(cls, env):
|
||
|
return cls(env.nodes[0], env.nodes[1])
|
||
|
|
||
|
def run_ping(self, dst, size):
|
||
|
eprint(f"\tRunning ping {dst} with size {size} ...")
|
||
|
return self.sender.ping(dst=dst, size=size, count=30000, interval=0.001)
|
||
|
|
||
|
def run_iperf(self, dst):
|
||
|
eprint(f"\tRunning iperf on {dst} ...")
|
||
|
self.receiver.start_iperf_server()
|
||
|
time.sleep(0.1)
|
||
|
result = self.sender.run_iperf(dst=dst, duration=30)
|
||
|
self.receiver.stop_iperf_server()
|
||
|
return result
|
||
|
|
||
|
def start_vpncloud(self):
|
||
|
eprint("\tSetting up vpncloud on receiver")
|
||
|
self.receiver.start_vpncloud(ip=f"{self.receiver_ip_vpncloud}/24")
|
||
|
eprint("\tSetting up vpncloud on sender")
|
||
|
self.sender.start_vpncloud(peers=[f"{self.receiver.private_ip}:3210"], ip=f"{self.sender_ip_vpncloud}/24")
|
||
|
time.sleep(1.0)
|
||
|
|
||
|
def stop_vpncloud(self):
|
||
|
self.sender.stop_vpncloud(wait=False)
|
||
|
self.receiver.stop_vpncloud(wait=True)
|
||
|
|
||
|
def run(self):
|
||
|
print()
|
||
|
self.start_vpncloud()
|
||
|
throughput = self.run_iperf(self.receiver_ip_vpncloud)["throughput"]
|
||
|
print(f"Throughput: {throughput / 1_000_000.0} MBit/s")
|
||
|
native_ping_100 = self.run_ping(self.receiver.private_ip, 100)["rtt_avg"]
|
||
|
ping_100 = self.run_ping(self.receiver_ip_vpncloud, 100)["rtt_avg"]
|
||
|
print(f"Latency 100: +{(ping_100 - native_ping_100)*1000.0/2.0} µs")
|
||
|
native_ping_1000 = self.run_ping(self.receiver.private_ip, 1000)["rtt_avg"]
|
||
|
ping_1000 = self.run_ping(self.receiver_ip_vpncloud, 1000)["rtt_avg"]
|
||
|
print(f"Latency 1000: +{(ping_1000 - native_ping_1000)*1000.0/2.0} µs")
|
||
|
self.stop_vpncloud()
|
||
|
|
||
|
keyfile = "key.pem"
|
||
|
assert not os.path.exists(keyfile)
|
||
|
with open(keyfile, 'x') as fp:
|
||
|
fp.write(env.privatekey)
|
||
|
os.chmod(keyfile, 0o400)
|
||
|
print(f"SSH private key written to {keyfile}")
|
||
|
atexit.register(lambda : os.remove(keyfile))
|
||
|
print()
|
||
|
print("Nodes:")
|
||
|
for node in env.nodes:
|
||
|
print(f"\t {env.username}@{node.public_ip}\tprivate: {node.private_ip}")
|
||
|
print()
|
||
|
|
||
|
perf = PerfTest.from_ec2_env(env)
|
||
|
|
||
|
try:
|
||
|
perf.run()
|
||
|
except Exception as e:
|
||
|
eprint(f"Exception: {e}")
|
||
|
print("Press ENTER to shut down")
|
||
|
input()
|
||
|
|
||
|
eprint("done.")
|