From ce51455f0acd41295cc297d31d2dcdbe1d3d0e8b Mon Sep 17 00:00:00 2001 From: Maciej Sobkowiak Date: Wed, 5 Jan 2022 02:59:50 +0100 Subject: [PATCH] Added test to deploy script --- .gitignore | 3 + Checker/main.py | 153 ------------------- Hetzner/.gitignore | 2 - README.md | 6 +- checker.py | 152 ++++++++++++++++++ Hetzner/config_base.json => config_base.json | 0 Hetzner/deploy.py => deploy.py | 24 ++- Hetzner/requirements.txt => requirements.txt | Bin 328 -> 632 bytes Hetzner/webservice.yml => webservice.yml | 0 9 files changed, 179 insertions(+), 161 deletions(-) create mode 100644 .gitignore delete mode 100644 Checker/main.py delete mode 100644 Hetzner/.gitignore create mode 100644 checker.py rename Hetzner/config_base.json => config_base.json (100%) rename Hetzner/deploy.py => deploy.py (91%) rename Hetzner/requirements.txt => requirements.txt (51%) rename Hetzner/webservice.yml => webservice.yml (100%) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9f0cd09 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +venv/ +config.json +__pycache__ \ No newline at end of file diff --git a/Checker/main.py b/Checker/main.py deleted file mode 100644 index bc3bb93..0000000 --- a/Checker/main.py +++ /dev/null @@ -1,153 +0,0 @@ -import requests -import random -import math -import time -import threading -import logging -import numpy as np -import matplotlib.pyplot as plt -import scipy.stats as stats - -logging.getLogger().setLevel(logging.INFO) - - -API_URL = " http://34.234.169.21:80/" - - -UNIT = 5.0 # secs - -# Pre generated primes -first_primes_list = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, - 31, 37, 41, 43, 47, 53, 59, 61, 67, - 71, 73, 79, 83, 89, 97, 101, 103, - 107, 109, 113, 127, 131, 137, 139, - 149, 151, 157, 163, 167, 173, 179, - 181, 191, 193, 197, 199, 211, 223, - 227, 229, 233, 239, 241, 251, 257, - 263, 269, 271, 277, 281, 283, 293, - 307, 311, 313, 317, 331, 337, 347, 349] - - -def nBitRandom(n): - return random.randrange(2**(n-1)+1, 2**n - 1) - - -def getLowLevelPrime(n): - '''Generate a prime candidate divisible - by first primes''' - while True: - # Obtain a random number - pc = nBitRandom(n) - - # Test divisibility by pre-generated - # primes - for divisor in first_primes_list: - if pc % divisor == 0 and divisor**2 <= pc: - break - else: - return pc - - -def isMillerRabinPassed(mrc): - '''Run 20 iterations of Rabin Miller Primality test''' - maxDivisionsByTwo = 0 - ec = mrc-1 - while ec % 2 == 0: - ec >>= 1 - maxDivisionsByTwo += 1 - assert(2**maxDivisionsByTwo * ec == mrc-1) - - def trialComposite(round_tester): - if pow(round_tester, ec, mrc) == 1: - return False - for i in range(maxDivisionsByTwo): - if pow(round_tester, 2**i * ec, mrc) == mrc-1: - return False - return True - - # Set number of trials here - numberOfRabinTrials = 20 - for i in range(numberOfRabinTrials): - round_tester = random.randrange(2, mrc) - if trialComposite(round_tester): - return False - return True - - -def random_large_prime(bits): - while True: - prime_candidate = getLowLevelPrime(bits) - if not isMillerRabinPassed(prime_candidate): - continue - else: - return prime_candidate - - -def thread_function(i, fast, timeout): - start = time.time() - - c = 5 # bits: 20: 200ms; 21: 350ms; 22: 700ms 23: 1.5s; 25: 6s; 26: 10s; 27: 24s - bits = 19 if fast else 23 - last_report = time.time() - processing_time = 0.0 - reqs = 0 - while True: - iter_start = time.time() - if iter_start - start > timeout: - logging.info("Thread: %d\treqs: %d\tmean time: %.3fs\t%s" % ( - i, reqs, processing_time/reqs if reqs > 0 else 0.0, "fast\t" if fast else "")) - results[i][iter_start] = processing_time/reqs if reqs > 0 else 0.0 - return - if iter_start - last_report > UNIT/2: - if len(results[i]) % 2 == 0: - logging.info("Thread: %d\treqs: %d\tmean time: %.3fs\t%s" % ( - i, reqs, processing_time/reqs if reqs > 0 else 0.0, "fast\t" if fast else "")) - results[i][iter_start] = processing_time/reqs if reqs > 0 else 0.0 - processing_time = 0.0 - reqs = 0 - last_report = iter_start - - factors = [random_large_prime(bits) for i in range(c)] - factors.sort() - n = math.prod(factors) - - r = requests.get(API_URL+'/factors/%d' % (n)) - if r.status_code != 200: - logging.error("wrong status code from webservice" + - str(r.status_code)) - else: - result = r.json() - if result != factors: - logging.error("Wrong factors") - - processing_time += time.time() - iter_start - reqs += 1 - time.sleep(0.5) - - -START = time.time() -slow_threads = 4 - -results = [{} for i in range(slow_threads+1)] - -t0 = threading.Thread(target=thread_function, args=( - 0, True, (5 + slow_threads*3) * UNIT)) -t0.start() -time.sleep(2 * UNIT) -for i in range(slow_threads): - t = threading.Thread(target=thread_function, args=( - i+1, False, (slow_threads-i) * 3 * UNIT)) - t.start() - time.sleep(2 * UNIT) - -t0.join() - -mu = 0 -std = 1 -for i, result in enumerate(results): - x = [(x - START)/UNIT for x in result.keys()] - y = result.values() - plt.plot(x, y, label="t%d"%(i,)) - -plt.legend() -plt.show() diff --git a/Hetzner/.gitignore b/Hetzner/.gitignore deleted file mode 100644 index 7f2e811..0000000 --- a/Hetzner/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -venv/ -config.json \ No newline at end of file diff --git a/README.md b/README.md index 0601ddf..f5d1cc5 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@ -1. Skrypt do tworzenia serwerów i load balancera dostępny w folderze Hetzner. -2. Instalacja paczek komendą "pip3 install -r requirements.txt" +1. Instalacja paczek komendą "pip3 install -r requirements.txt" 2. Uzupełnienie pliku config_base.json wartościami token-hetzner i ssh-public ``` { @@ -19,4 +18,5 @@ ``` 3. Uruchomienie skryptu komendą "python3 deploy.py config_base.json" -4. Po 60 sekundach jeżeli skrypt nie zostanie zatzymany wszystkie zasoby zostaną usunięte. \ No newline at end of file +4. Po 30 sekundach jeżeli skrypt nie zostanie zatrzymany uruchomiony zostanie program do ewaluacji stworzonych zasobów. +5. Po kolejnych 60 sekundach jeżeli skrypt nie zostanie zatzymany wszystkie zasoby zostaną usunięte. \ No newline at end of file diff --git a/checker.py b/checker.py new file mode 100644 index 0000000..6486801 --- /dev/null +++ b/checker.py @@ -0,0 +1,152 @@ +import requests +import random +import math +import time +import threading +import logging +import numpy as np +import matplotlib.pyplot as plt +import scipy.stats as stats + + +def test(ip): + logging.getLogger().setLevel(logging.INFO) + API_URL = ip + UNIT = 5.0 # secs + + # Pre generated primes + first_primes_list = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, + 31, 37, 41, 43, 47, 53, 59, 61, 67, + 71, 73, 79, 83, 89, 97, 101, 103, + 107, 109, 113, 127, 131, 137, 139, + 149, 151, 157, 163, 167, 173, 179, + 181, 191, 193, 197, 199, 211, 223, + 227, 229, 233, 239, 241, 251, 257, + 263, 269, 271, 277, 281, 283, 293, + 307, 311, 313, 317, 331, 337, 347, 349] + + def nBitRandom(n): + return random.randrange(2**(n-1)+1, 2**n - 1) + + def getLowLevelPrime(n): + '''Generate a prime candidate divisible + by first primes''' + while True: + # Obtain a random number + pc = nBitRandom(n) + + # Test divisibility by pre-generated + # primes + for divisor in first_primes_list: + if pc % divisor == 0 and divisor**2 <= pc: + break + else: + return pc + + def isMillerRabinPassed(mrc): + '''Run 20 iterations of Rabin Miller Primality test''' + maxDivisionsByTwo = 0 + ec = mrc-1 + while ec % 2 == 0: + ec >>= 1 + maxDivisionsByTwo += 1 + assert(2**maxDivisionsByTwo * ec == mrc-1) + + def trialComposite(round_tester): + if pow(round_tester, ec, mrc) == 1: + return False + for i in range(maxDivisionsByTwo): + if pow(round_tester, 2**i * ec, mrc) == mrc-1: + return False + return True + + # Set number of trials here + numberOfRabinTrials = 20 + for i in range(numberOfRabinTrials): + round_tester = random.randrange(2, mrc) + if trialComposite(round_tester): + return False + return True + + def random_large_prime(bits): + while True: + prime_candidate = getLowLevelPrime(bits) + if not isMillerRabinPassed(prime_candidate): + continue + else: + return prime_candidate + + def thread_function(i, fast, timeout): + start = time.time() + + c = 5 # bits: 20: 200ms; 21: 350ms; 22: 700ms 23: 1.5s; 25: 6s; 26: 10s; 27: 24s + bits = 19 if fast else 23 + last_report = time.time() + processing_time = 0.0 + reqs = 0 + while True: + iter_start = time.time() + if iter_start - start > timeout: + logging.info("Thread: %d\treqs: %d\tmean time: %.3fs\t%s" % ( + i, reqs, processing_time/reqs if reqs > 0 else 0.0, "fast\t" if fast else "")) + results[i][iter_start] = processing_time / \ + reqs if reqs > 0 else 0.0 + return + if iter_start - last_report > UNIT/2: + if len(results[i]) % 2 == 0: + logging.info("Thread: %d\treqs: %d\tmean time: %.3fs\t%s" % ( + i, reqs, processing_time/reqs if reqs > 0 else 0.0, "fast\t" if fast else "")) + results[i][iter_start] = processing_time / \ + reqs if reqs > 0 else 0.0 + processing_time = 0.0 + reqs = 0 + last_report = iter_start + + factors = [random_large_prime(bits) for i in range(c)] + factors.sort() + n = math.prod(factors) + + r = requests.get(API_URL+'/factors/%d' % (n)) + if r.status_code != 200: + logging.error("wrong status code from webservice" + + str(r.status_code)) + else: + result = r.json() + if result != factors: + logging.error("Wrong factors") + + processing_time += time.time() - iter_start + reqs += 1 + time.sleep(0.5) + + START = time.time() + slow_threads = 4 + + results = [{} for i in range(slow_threads+1)] + + t0 = threading.Thread(target=thread_function, args=( + 0, True, (5 + slow_threads*3) * UNIT)) + t0.start() + time.sleep(2 * UNIT) + for i in range(slow_threads): + t = threading.Thread(target=thread_function, args=( + i+1, False, (slow_threads-i) * 3 * UNIT)) + t.start() + time.sleep(2 * UNIT) + + t0.join() + + mu = 0 + std = 1 + for i, result in enumerate(results): + x = [(x - START)/UNIT for x in result.keys()] + y = result.values() + plt.plot(x, y, label="t%d" % (i,)) + + plt.legend() + plt.show() + + +if __name__ == '__main__': + API_URL = "http://95.217.174.110:8080" + test(API_URL) # next section explains the use of sys.exit diff --git a/Hetzner/config_base.json b/config_base.json similarity index 100% rename from Hetzner/config_base.json rename to config_base.json diff --git a/Hetzner/deploy.py b/deploy.py similarity index 91% rename from Hetzner/deploy.py rename to deploy.py index 8eb7ced..62edc62 100644 --- a/Hetzner/deploy.py +++ b/deploy.py @@ -10,6 +10,7 @@ from hcloud.locations.domain import Location from hcloud.images.domain import Image from hcloud.server_types.domain import ServerType from hcloud.volumes.domain import Volume +from checker import test class Client_MS: @@ -147,10 +148,12 @@ class Client_MS: def print_info(self): print("\n----- Server info -----") - ip = self.client.load_balancers.get_by_name( - self.config["load-balancer-name"]).data_model.public_net.ipv4.ip print( - f"Webservice dostępny pod adresem: http://{ip}:8080\n") + f"Webservice dostępny pod adresem: {self.get_ip()}\n") + + def get_ip(self): + return str("http://" + self.client.load_balancers.get_by_name( + self.config["load-balancer-name"]).data_model.public_net.ipv4.ip + ":8080") def delete_all(self): for i, server in enumerate(self.servers): @@ -167,6 +170,21 @@ if __name__ == '__main__': else: c = Client_MS(sys.argv[1]) c.print_info() + + # Test creation + try: + for remaining in range(30, 0, -1): + sys.stdout.write("\r") + sys.stdout.write( + "Testing server starts in: {:2d}. Press Ctrl + C to stop.".format(remaining)) + sys.stdout.flush() + time.sleep(1) + print("") + test(c.get_ip()) + except KeyboardInterrupt: + pass + + # Delete assets try: for remaining in range(60, 0, -1): sys.stdout.write("\r") diff --git a/Hetzner/requirements.txt b/requirements.txt similarity index 51% rename from Hetzner/requirements.txt rename to requirements.txt index eaf7ea6a8e595e2681b91aa61437ad8ad89afce1..b449d347fa99055005e439e37b7346ae0078e94a 100644 GIT binary patch literal 632 zcmY+BZBBzg5QgWsiAO0Zi*5CXckl{|U`Z*o?$(NjSD%@YC8k+O_x+sV=ew3h-X%#V zE$5M6kTs{2g0tp%FSl|dwd~~?W`v()C4-FoJ95{f`!W|-7p79J>n5~)#?`SjcgI_N z1{@Rb5ni+ocd!D1~Fl?#juiH+gzqIfWTZy6(uSHr#i7Ti-h?gzSR!;0I=R0o=0 zInk0oaz|Aw%e{5RBqzF!ymi`_?6ZMYn%6+~5!RIR1Nu4tghwq0o^R*}p1vzj(mg$K z-&@Ajum{sF`U!8}|DxB9x{0kd(Coxl(tWO&S6er>H+7!B&9XDy(!>>Elg}`QO}1mQ0su#P2MYiI diff --git a/Hetzner/webservice.yml b/webservice.yml similarity index 100% rename from Hetzner/webservice.yml rename to webservice.yml