# coding: utf-8 import datetime from peewee import DateTimeField, TextField, FloatField, BigIntegerField from peewee import Model, UUIDField, CharField, ForeignKeyField, IntegerField from peewee import PostgresqlDatabase from SWSCloudCore.config import config # connect to database database = PostgresqlDatabase( 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=True, 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() 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() 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() 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() 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()