From 0e14842c11c58485a21b01246fe8c3ed04ea36fc Mon Sep 17 00:00:00 2001 From: Maciej Sobkowiak Date: Wed, 5 Jan 2022 02:27:16 +0100 Subject: [PATCH] Final --- 4_1_hetzner/config_base.json | 8 - 4_1_hetzner/deploy.py | 92 ----------- {Sprawdzarka1 => Checker}/main.py | 19 ++- {4_1_hetzner => Hetzner}/.gitignore | 0 Hetzner/config_base.json | 14 ++ Hetzner/deploy.py | 181 ++++++++++++++++++++++ {4_1_hetzner => Hetzner}/requirements.txt | Bin 326 -> 328 bytes {4_1_hetzner => Hetzner}/webservice.yml | 0 README.md | 22 +++ 9 files changed, 234 insertions(+), 102 deletions(-) delete mode 100644 4_1_hetzner/config_base.json delete mode 100644 4_1_hetzner/deploy.py rename {Sprawdzarka1 => Checker}/main.py (90%) rename {4_1_hetzner => Hetzner}/.gitignore (100%) create mode 100644 Hetzner/config_base.json create mode 100644 Hetzner/deploy.py rename {4_1_hetzner => Hetzner}/requirements.txt (71%) rename {4_1_hetzner => Hetzner}/webservice.yml (100%) create mode 100644 README.md diff --git a/4_1_hetzner/config_base.json b/4_1_hetzner/config_base.json deleted file mode 100644 index caefb73..0000000 --- a/4_1_hetzner/config_base.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "ssh_name": "s434784", - "server-type": "cx11", - "server-image": "ubuntu-20.04", - "location": "hel1", - "ssh_private": "", - "ssh_public": "", -} \ No newline at end of file diff --git a/4_1_hetzner/deploy.py b/4_1_hetzner/deploy.py deleted file mode 100644 index 5d30804..0000000 --- a/4_1_hetzner/deploy.py +++ /dev/null @@ -1,92 +0,0 @@ -import json -import time -import sys -import requests -from hcloud import Client -from hcloud.networks.domain import NetworkSubnet -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 - - -class Client_MS: - def __init__(self, json_config) -> None: - self.config = self.load_config(json_config) - - self.client = self.get_client() - self.ssh_key = self.get_ssh() - - self.vscode = self.create_vscode_server() - - def load_config(self, json_config): - with open(json_config) as json_file: - return json.load(json_file) - - def get_client(self): - try: - return Client(token=self.config["token"]) - except: - return None - - def get_ssh(self): - if(self.client.ssh_keys.get_by_name(self.config["ssh_name"])): - print("SSH_KEY: Key exists.") - return self.client.ssh_keys.get_by_name(self.config["ssh_name"]) - else: - print("SSH_KEY: Creating ssh_key.") - return self.client.ssh_keys.create(name=self.config["ssh_name"], public_key=self.config["ssh_public"]) - - def create_vscode_server(self): - with open("webservice.yml", "r") as f: - vs = f.read() - - if(self.client.servers.get_by_name(self.config["server-name"])): - print("Server exists.") - self.vscode = self.client.servers.get_by_name( - self.config["server-name"]) - return self.vscode - else: - print("Creating server.") - vscode = self.client.servers.create( - name=self.config["server-name"], - server_type=ServerType(self.config["server-type"]), - image=Image(name=self.config["server-image"]), - ssh_keys=[self.ssh_key], - location=Location(self.config["location"]), - user_data=vs) - vscode.action.wait_until_finished() - self.vscode = vscode.server - return vscode.server - - def print_info(self): - print("----- Server info -----") - print( - f"\t{self.vscode.data_model.name}\n\t\tIP: {self.vscode.data_model.public_net.ipv4.ip}") - print( - f"\nTo access vscode go to: http:\\\\{self.vscode.data_model.public_net.ipv4.ip}:8080") - - def delete_all(self): - self.vscode.delete() - print("Deleted.") - - -if __name__ == '__main__': - if(len(sys.argv) != 2): - print("Podaj ścieżkę do pliku konfiguracyjnego.") - else: - c = Client_MS(sys.argv[1]) - c.print_info() - # c.get_password() - try: - for remaining in range(60, 0, -1): - sys.stdout.write("\r") - sys.stdout.write( - "Deleting server starts in: {:2d}. Press Ctrl + C to stop.".format(remaining)) - sys.stdout.flush() - time.sleep(1) - print("") - except KeyboardInterrupt: - sys.exit() - - c.delete_all() diff --git a/Sprawdzarka1/main.py b/Checker/main.py similarity index 90% rename from Sprawdzarka1/main.py rename to Checker/main.py index d02cf15..bc3bb93 100644 --- a/Sprawdzarka1/main.py +++ b/Checker/main.py @@ -4,10 +4,14 @@ 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://95.216.192.77:8080/" +API_URL = " http://34.234.169.21:80/" UNIT = 5.0 # secs @@ -109,7 +113,8 @@ def thread_function(i, fast, timeout): r = requests.get(API_URL+'/factors/%d' % (n)) if r.status_code != 200: - logging.error("wrong status code from webservice") + logging.error("wrong status code from webservice" + + str(r.status_code)) else: result = r.json() if result != factors: @@ -136,3 +141,13 @@ for i in range(slow_threads): 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/4_1_hetzner/.gitignore b/Hetzner/.gitignore similarity index 100% rename from 4_1_hetzner/.gitignore rename to Hetzner/.gitignore diff --git a/Hetzner/config_base.json b/Hetzner/config_base.json new file mode 100644 index 0000000..c156317 --- /dev/null +++ b/Hetzner/config_base.json @@ -0,0 +1,14 @@ +{ + "server-number": "3", + "server-name": "ms-server", + "server-type": "cx11", + "server-image": "ubuntu-20.04", + "location": "hel1", + "network": "ms-network", + "network-ip": "10.10.10.0/24", + "load-balancer-name": "ms-load-balancer", + "load-balancer-type": "lb11", + "ssh-name": "s434784", + "ssh-public": "", + "token-hetzner": "" +} \ No newline at end of file diff --git a/Hetzner/deploy.py b/Hetzner/deploy.py new file mode 100644 index 0000000..8eb7ced --- /dev/null +++ b/Hetzner/deploy.py @@ -0,0 +1,181 @@ +import json +import time +import sys +import requests +from hcloud import Client +from hcloud.load_balancer_types.domain import LoadBalancerType +from hcloud.load_balancers.domain import LoadBalancerAlgorithm, LoadBalancerServiceHttp, LoadBalancerHealthCheck, LoadBalancerService, LoadBalancerHealtCheckHttp, LoadBalancerTarget +from hcloud.networks.domain import NetworkSubnet +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 + + +class Client_MS: + def __init__(self, json_config) -> None: + self.config = self.load_config(json_config) + + self.client = self.get_client() + self.ssh_key = self.get_ssh() + self.network = self.create_network() + + self.servers = [] + for i in range(int(self.config["server-number"])): + self.servers.append(self.create_virual(i)) + + self.loadBalancer = self.create_load_balancer() + + def load_config(self, json_config): + with open(json_config) as json_file: + return json.load(json_file) + + def get_client(self): + try: + return Client(token=self.config["token-hetzner"]) + except: + return None + + def get_ssh(self): + if(self.client.ssh_keys.get_by_name(self.config["ssh-name"])): + print("SSHKEY: Key exists.") + return self.client.ssh_keys.get_by_name(self.config["ssh-name"]) + else: + print("SSHKEY: Creating ssh_key.") + return self.client.ssh_keys.create(name=self.config["ssh-name"], public_key=self.config["ssh-public"]) + + def create_virual(self, i): + with open("webservice.yml", "r") as f: + vs = f.read() + + if(self.client.servers.get_by_name(str(self.config["server-name"] + "-" + str(i)))): + print("SERVER %s: Server exists." % (str(i))) + server = self.client.servers.get_by_name( + str(self.config["server-name"] + "-" + str(i))) + print( + f"\tName: {server.data_model.name}\n\tIP: {server.data_model.public_net.ipv4.ip}") + return server + else: + print("SERVER %s: Creating server." % (str(i))) + server = self.client.servers.create( + name=str(self.config["server-name"] + "-" + str(i)), + server_type=ServerType(self.config["server-type"]), + image=Image(name=self.config["server-image"]), + ssh_keys=[self.ssh_key], + location=Location(self.config["location"]), + networks=[self.network], + user_data=vs) + server.action.wait_until_finished() + + print( + f"\tName: {server.server.data_model.name}\n\tIP: {server.server.data_model.public_net.ipv4.ip}") + return server.server + + def create_network(self): + if(self.client.networks.get_by_name(self.config["network"])): + print("NETWORK: Network exists.") + return self.client.networks.get_by_name(self.config["network"]) + else: + print("NETWORK: Creating network.") + return self.client.networks.create( + name=self.config["network"], + ip_range=self.config["network-ip"], + subnets=[ + NetworkSubnet(ip_range=self.config["network-ip"], + network_zone="eu-central", type="cloud") + ] + ) + + def create_load_balancer(self): + if(self.client.load_balancers.get_by_name(self.config["load-balancer-name"])): + print("LOADBALANCER: Load balancer exists.") + loadBalancer = self.client.load_balancers.get_by_name( + self.config["load-balancer-name"]) + print( + f"\tName: {loadBalancer.data_model.name}\n\tIP: {loadBalancer.data_model.public_net.ipv4.ip}") + return loadBalancer + else: + print("LOADBALANCER: Creating load balancer.") + + targets = [] + for server in self.servers: + targets.append(LoadBalancerTarget( + type="server", + server=server, + use_private_ip=True + )) + + loadBalancer = self.client.load_balancers.create( + name=self.config["load-balancer-name"], + + load_balancer_type=LoadBalancerType( + name=self.config["load-balancer-type"]), + + location=Location(self.config["location"]), + + services=[ + LoadBalancerService( + protocol="http", + listen_port=8080, + destination_port=8080, + proxyprotocol=False, + health_check=LoadBalancerHealthCheck( + protocol="http", + port="8080", + interval=15, + timeout=10, + retries=3, + http=LoadBalancerHealtCheckHttp( + path="/factors/10", + status_codes=["2??", "3??"], + tls=False + ) + ) + ) + ], + targets=targets, + public_interface=True, + network=self.network + ) + loadBalancer.action.wait_until_finished() + ip = self.client.load_balancers.get_by_name( + self.config["load-balancer-name"]).data_model.public_net.ipv4.ip + print( + f"\tName: {loadBalancer.load_balancer.data_model.name}\n\tIP: {ip}") + + return loadBalancer.load_balancer + + 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") + + def delete_all(self): + for i, server in enumerate(self.servers): + print("SERVER%s: Deleted." % (str(i))) + server.delete() + + self.loadBalancer.delete() + print("LOADBALANCER: Deleted.") + + +if __name__ == '__main__': + if(len(sys.argv) != 2): + print("Podaj ścieżkę do pliku konfiguracyjnego.") + else: + c = Client_MS(sys.argv[1]) + c.print_info() + try: + for remaining in range(60, 0, -1): + sys.stdout.write("\r") + sys.stdout.write( + "Deleting server starts in: {:2d}. Press Ctrl + C to stop.".format(remaining)) + sys.stdout.flush() + time.sleep(1) + print("") + except KeyboardInterrupt: + sys.exit() + + c.delete_all() diff --git a/4_1_hetzner/requirements.txt b/Hetzner/requirements.txt similarity index 71% rename from 4_1_hetzner/requirements.txt rename to Hetzner/requirements.txt index a87cc22e32c87883f8052d75db3103ba943dc525..eaf7ea6a8e595e2681b91aa61437ad8ad89afce1 100644 GIT binary patch delta 19 acmX@cbb@I@6tf|N!NlmLjOLRW8C?NBBL##2 delta 17 YcmX@Xbc|_26r;t&*rkkSlbIP^0XHTETmS$7 diff --git a/4_1_hetzner/webservice.yml b/Hetzner/webservice.yml similarity index 100% rename from 4_1_hetzner/webservice.yml rename to Hetzner/webservice.yml diff --git a/README.md b/README.md new file mode 100644 index 0000000..0601ddf --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ +1. Skrypt do tworzenia serwerów i load balancera dostępny w folderze Hetzner. +2. Instalacja paczek komendą "pip3 install -r requirements.txt" +2. Uzupełnienie pliku config_base.json wartościami token-hetzner i ssh-public + ``` + { + "server-number": "3", + "server-name": "ms-server", + "server-type": "cx11", + "server-image": "ubuntu-20.04", + "location": "hel1", + "network": "ms-network", + "network-ip": "10.10.10.0/24", + "load-balancer-name": "ms-load-balancer", + "load-balancer-type": "lb11", + "ssh-name": "s434784", + "ssh-public": "", + "token-hetzner": "" + } + + ``` +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