# coding: utf-8 from hashlib import md5 import datetime import uuid from peewee import * from playhouse.shortcuts import RetryOperationalError from playhouse.postgres_ext import JSONField from SWSCloudCore.config import config class RetryDB(RetryOperationalError, PostgresqlDatabase): pass # connect to database database = RetryDB( config.get('Database', 'name'), host=config.get('Database', 'host'), port=config.getint('Database', 'port'), user=config.get('Database', 'user'), password=config.get('Database', 'password'), threadlocals=True, fields={'uuid': 'uuid'} ) class PgSQLModel(Model): class Meta: database = database class DataCenters(PgSQLModel): """ Модель датацентров """ id = UUIDField(unique=True, primary_key=True, null=False) code = CharField(unique=True) name = CharField(unique=True) country = CharField() city = CharField() status = IntegerField(default=0) class Servers(PgSQLModel): id = UUIDField(unique=True, primary_key=True) datacenter = ForeignKeyField(DataCenters) secret = CharField() created = DateTimeField(default=datetime.datetime.now()) status = IntegerField() ip = CharField(unique=True) hostname = CharField() class ServersSettings(PgSQLModel): server = ForeignKeyField(Servers) key = CharField() val = CharField() class Ips(PgSQLModel): datacenter = ForeignKeyField(DataCenters) server = ForeignKeyField(Servers) ipv4 = CharField() ipv6 = CharField() ipv4_gateway = CharField() ipv6_gateway = CharField() # 0: free, 1: used status = IntegerField() class Plans(PgSQLModel): id = UUIDField(primary_key=True, unique=True) name = CharField(unique=True, null=False) status = CharField(null=False, default='active') storage = IntegerField(null=False) swap = IntegerField(null=False) memory = IntegerField(null=False) cores = IntegerField(null=False) class PlansContainers(PgSQLModel): datacenter = ForeignKeyField(DataCenters, unique=True) name = CharField(default='') price_ip = IntegerField(null=False) price_storage_gb = IntegerField(null=False) price_memory_mb = IntegerField(null=False) price_traffic_gb = IntegerField(null=False) class PlansVMs(PgSQLModel): id = UUIDField(primary_key=True, unique=True) name = CharField(unique=True, null=False) status = CharField(null=False, default='active') price = FloatField(null=False) storage = IntegerField(null=False) swap = IntegerField(null=False) memory = IntegerField(null=False) cores = IntegerField(null=False) class Users(PgSQLModel): id = UUIDField(primary_key=True, unique=True) email = CharField(unique=True, null=False) password = CharField() created = DateTimeField(default=datetime.datetime.now) status = IntegerField() class UsersRecoveryCodes(PgSQLModel): user = ForeignKeyField(Users) recovery_code = CharField(null=False) created = DateTimeField(default=datetime.datetime.now) class UsersSecrets(PgSQLModel): user = ForeignKeyField(Users) # 4f235008-a9bd-11e5-a24e-28d244e159e9 secret = CharField(unique=False, null=False) # 1.1.1.1,1.2.3.4 acl = TextField() # 0 - inactive # 1 - active status = IntegerField() class UsersDetails(PgSQLModel): user = ForeignKeyField(Users) fname = CharField(null=True, default='') lname = CharField(null=True, default='') address = CharField(null=True, default='') city = CharField(null=True, default='') country = CharField(null=True, default='') state = CharField(null=True, default='') zipcode = IntegerField(null=True, default=0) class UsersBalance(PgSQLModel): """ Текущий баланс пользователей """ user = ForeignKeyField(Users) balance = FloatField(default=0, null=False) class UsersBalanceTransactions(PgSQLModel): """ Транзакции """ user = ForeignKeyField(Users) amount = FloatField(default=0, null=False) created = DateTimeField(default=datetime.datetime.now) notified = IntegerField(null=False, default=0) # success # process # fail status = TextField(null=False) class SSHKeys(PgSQLModel): user = ForeignKeyField(Users) sshkey = TextField(null=True) # с какого ip был добавлен ключ remote = TextField(null=True) # когда был добавлен ключ created = DateTimeField(default=datetime.datetime.now) class Containers(PgSQLModel): id = UUIDField(primary_key=True, unique=True) datacenter = ForeignKeyField(DataCenters) server = ForeignKeyField(Servers) user = ForeignKeyField(Users) ipv4 = CharField() ipv6 = CharField() # 0: inactive, 1: active, 2: ..., 3: ..., 4: ..., 5: ... status = IntegerField() @staticmethod def get_items(): return Containers.select().execute() class ContainersStatistics(PgSQLModel): container = ForeignKeyField(Containers) created = DateTimeField(default=datetime.datetime.now) cpu = BigIntegerField(default=0, null=False) memory = BigIntegerField(default=0, null=False) size = BigIntegerField(default=0, null=False) net_tx = BigIntegerField(default=0, null=False) net_rx = BigIntegerField(default=0, null=False) net_total = BigIntegerField(default=0, null=False) class ContainersStatisticsState(PgSQLModel): container = ForeignKeyField(Containers) updated = DateTimeField(default=datetime.datetime.now) cpu = BigIntegerField(default=0, null=False) memory = BigIntegerField(default=0, null=False) size = BigIntegerField(default=0, null=False) net_tx = BigIntegerField(default=0, null=False) net_rx = BigIntegerField(default=0, null=False) net_total = BigIntegerField(default=0, null=False) class Vms(PgSQLModel): id = UUIDField(primary_key=True, unique=True) datacenter = ForeignKeyField(DataCenters) server = ForeignKeyField(Servers) user = ForeignKeyField(Users) plan = ForeignKeyField(PlansVMs) # 386, x86_64 hostname = CharField() platform = CharField() os_name = CharField() os_suite = CharField() ipv4 = CharField() ipv6 = CharField() # 0: inactive, 1: active, 2: ..., 3: ..., 4: ..., 5: ... status = IntegerField() @staticmethod def get_items(): return Vms.select() @staticmethod def get_item(vm_id): return Vms.select().where(Vms.id == vm_id).first() @staticmethod def exists(vm_id): if Vms.select().where(Vms.id == vm_id).count() == 0: return False return True @staticmethod def set_status(vm_id, status): """ :param vm_id: :param status: :return: """ x = Vms.update(status=status).where(Vms.id == vm_id) x.execute() return True class Tasks(PgSQLModel): id = UUIDField(primary_key=True, unique=True) datacenter = ForeignKeyField(DataCenters) server = ForeignKeyField(Servers) user = ForeignKeyField(Users) created = DateTimeField(default=datetime.datetime.now) task = CharField(null=False) # 0 - new, 1 - working, 2 - completed status = IntegerField(null=False, default=0) plain = TextField() # @staticmethod # def set_task(datacenter_id, server_id, task, status, **args): # task_id = uuid.uuid4() # plain = dict() # for arg in args: # plain[arg] = str(args[arg]) # # Tasks.create( # id=task_id, # datacenter=datacenter_id, # server=server_id, # task=task, # status=status, # user=self.user_id, # plain=json.dumps(plain) # ) class Settings(PgSQLModel): """ Модель настроек """ key = TextField(unique=True, null=False) val = TextField(null=True) class Admins(PgSQLModel): id = UUIDField(primary_key=True, unique=True) email = CharField(unique=True, null=False) password = CharField() status = IntegerField() @staticmethod def auth(email, password, status=1): """ :param email: :param password: :param status: :return: """ password_hash = md5(password).hexdigest() if Admins.select().where( Admins.email == email, Admins.password == password_hash, Admins.status == status).count() == 0: return False return True class Notifications(PgSQLModel): user = ForeignKeyField(Users) # 0 - unread # 1 - read status = IntegerField(null=False) # Default # Primary # Success # Info # Warning # Danger message_type = CharField(null=False) title = TextField() message = TextField() class NotificationsSecurity(PgSQLModel): # auth_web # auth_api # auth_serverapi alert = CharField(null=False) notified = DateTimeField(default=datetime.datetime.now) details = TextField()