import json import time 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 class Client_MS: def __init__(self) -> None: self.config = self.load_config() self.client = Client(token=self.config["token"]) self.ssh_key = self.get_ssh() self.network = self.create_network() self.volume = self.create_volume() self.server_db = None self.server_gitea = None servers = self.client.servers.get_all() print(servers[0]) def load_config(self): with open('config.json') as json_file: return json.load(json_file) 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_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_volume(self): if(self.client.volumes.get_by_name(self.config["volume"])): print("VOLUME: Volume exists.") return self.client.volumes.get_by_name(self.config["volume"]) else: print("VOLUME: Creating volume.") return self.client.volumes.create( size=10, name=self.config["volume"], location=Location(id=self.config["location"])) def create_db_server(self): with open("db.yml", "r") as f: db_yml = f.read() if(self.client.servers.get_by_name(self.config["db-server-name"])): print("DB: Server exists.") self.server_db = self.client.servers.get_by_name( self.config["db-server-name"]) return self.server_db else: print("DB: Creating server.") self.server_db = self.client.servers.create( name=self.config["db-server-name"], server_type=ServerType(self.config["server-type"]), image=Image(name=self.config["server-image"]), ssh_keys=[self.ssh_key], networks=[self.network], location=Location(self.config["location"]), user_data=db_yml) return self.server_db def create_gitea_server(self): with open("gitea.yml", "r") as f: gitea_yml = f.read() if(self.client.servers.get_by_name(self.config["gitea-server-name"])): print("GITEA: Server exists.") self.server_gitea = self.client.servers.get_by_name( self.config["gitea-server-name"]) return self.server_gitea else: self.server_gitea = self.client.servers.create( name=self.config["gitea-server-name"], server_type=ServerType(self.config["server-type"]), image=Image(name=self.config["server-image"]), ssh_keys=[self.ssh_key], networks=[self.network], location=Location(self.config["location"]), user_data=gitea_yml, volumes=[self.volume] ) return self.server_gitea def delete_all(self): self.network.delete() print("NETWORK: Deleted.") self.volume.detach() self.volume.delete() print("VOLUME: Deleted.") self.server_db.delete() print("DB: Deleted.") self.server_gitea.delete() print("GITEA: Deleted.") def main(): c = Client_MS() c.create_db_server() c.create_gitea_server() # c.delete_all() if __name__ == '__main__': main()