console/SWSCloudCore/models.py

381 lines
10 KiB
Python
Raw Permalink Normal View History

2015-11-26 23:50:33 +03:00
# coding: utf-8
2016-10-11 03:37:04 +03:00
from hashlib import md5
2015-11-26 23:50:33 +03:00
import datetime
2016-10-11 03:37:04 +03:00
import uuid
2016-04-02 00:42:22 +03:00
2016-10-01 12:09:52 +03:00
from peewee import *
from playhouse.shortcuts import RetryOperationalError
from playhouse.postgres_ext import JSONField
2016-05-10 02:42:07 +03:00
from SWSCloudCore.config import config
2015-11-26 23:50:33 +03:00
2016-10-01 12:09:52 +03:00
class RetryDB(RetryOperationalError, PostgresqlDatabase):
pass
2015-11-26 23:50:33 +03:00
# connect to database
2016-10-01 12:09:52 +03:00
database = RetryDB(
2016-05-10 02:42:07 +03:00
config.get('Database', 'name'),
host=config.get('Database', 'host'),
port=config.getint('Database', 'port'),
user=config.get('Database', 'user'),
password=config.get('Database', 'password'),
2015-11-26 23:50:33 +03:00
threadlocals=True,
fields={'uuid': 'uuid'}
)
class PgSQLModel(Model):
class Meta:
database = database
class DataCenters(PgSQLModel):
2016-04-03 19:10:18 +03:00
"""
Модель датацентров
"""
2015-11-26 23:50:33 +03:00
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)
2016-04-03 19:10:18 +03:00
datacenter = ForeignKeyField(DataCenters)
2015-11-26 23:50:33 +03:00
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)
2015-11-29 00:08:10 +03:00
ipv4 = CharField()
ipv6 = CharField()
2015-12-01 02:45:57 +03:00
ipv4_gateway = CharField()
ipv6_gateway = CharField()
2016-04-03 19:10:18 +03:00
# 0: free, 1: used
2015-11-29 00:08:10 +03:00
status = IntegerField()
2015-11-26 23:50:33 +03:00
2016-05-16 09:24:27 +03:00
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)
2016-05-16 09:24:27 +03:00
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)
2015-11-26 23:50:33 +03:00
class Users(PgSQLModel):
id = UUIDField(primary_key=True, unique=True)
email = CharField(unique=True, null=False)
password = CharField()
2016-04-03 19:10:18 +03:00
created = DateTimeField(default=datetime.datetime.now)
2015-11-26 23:50:33 +03:00
status = IntegerField()
2016-10-14 11:21:48 +03:00
@staticmethod
def auth(email, password, status=1):
if Users.select().where(
Users.email == email, Users.password == Users.hash_password(password), Users.status == status
).count() == 0:
return False
return True
@staticmethod
def hash_password(password):
return md5(password).hexdigest()
2016-10-17 02:10:57 +03:00
@staticmethod
def get_by_id(user_id):
return Users.select().where(Users.id == user_id).get()
2015-11-26 23:50:33 +03:00
class UsersRecoveryCodes(PgSQLModel):
2016-04-03 19:10:18 +03:00
user = ForeignKeyField(Users)
2015-11-26 23:50:33 +03:00
recovery_code = CharField(null=False)
created = DateTimeField(default=datetime.datetime.now)
class UsersSecrets(PgSQLModel):
2016-04-03 19:10:18 +03:00
user = ForeignKeyField(Users)
2015-12-24 01:52:14 +03:00
# 4f235008-a9bd-11e5-a24e-28d244e159e9
secret = CharField(unique=False, null=False)
2015-12-24 01:52:14 +03:00
# 1.1.1.1,1.2.3.4
2015-11-26 23:50:33 +03:00
acl = TextField()
2015-12-14 01:49:38 +03:00
# 0 - inactive
# 1 - active
2015-11-26 23:50:33 +03:00
status = IntegerField()
class UsersDetails(PgSQLModel):
2016-04-03 19:10:18 +03:00
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='')
2016-04-09 16:52:33 +03:00
zipcode = IntegerField(null=True, default=0)
2015-11-26 23:50:33 +03:00
class UsersBalance(PgSQLModel):
2016-04-03 19:10:18 +03:00
"""
Текущий баланс пользователей
"""
user = ForeignKeyField(Users)
2015-11-26 23:50:33 +03:00
balance = FloatField(default=0, null=False)
2016-10-17 02:10:57 +03:00
@staticmethod
def get_by_account(user_id):
x = UsersBalance.select(UsersBalance.balance).where(UsersBalance.user == user_id).get()
return x.balance
2015-11-26 23:50:33 +03:00
class UsersBalanceTransactions(PgSQLModel):
2016-04-03 19:10:18 +03:00
"""
Транзакции
"""
user = ForeignKeyField(Users)
2015-11-26 23:50:33 +03:00
amount = FloatField(default=0, null=False)
created = DateTimeField(default=datetime.datetime.now)
notified = IntegerField(null=False, default=0)
2016-10-17 02:10:57 +03:00
# success, process, fail
2015-11-26 23:50:33 +03:00
status = TextField(null=False)
2016-10-17 03:35:52 +03:00
paid = DateTimeField()
2016-10-17 02:10:57 +03:00
# robokassa, webmoney, yandex_money, rbk_money, alfaclick, sberbank_online, paypal, invoice
method = CharField(null=False, default=0)
details = JSONField(default='{}')
2015-11-26 23:50:33 +03:00
2015-11-29 00:08:10 +03:00
class SSHKeys(PgSQLModel):
user = ForeignKeyField(Users)
sshkey = TextField(null=True)
2016-04-03 19:10:18 +03:00
# с какого ip был добавлен ключ
remote = TextField(null=True)
# когда был добавлен ключ
created = DateTimeField(default=datetime.datetime.now)
2015-11-29 00:08:10 +03:00
2015-11-26 23:50:33 +03:00
class Containers(PgSQLModel):
id = UUIDField(primary_key=True, unique=True)
2015-11-29 00:08:10 +03:00
datacenter = ForeignKeyField(DataCenters)
2015-11-26 23:50:33 +03:00
server = ForeignKeyField(Servers)
user = ForeignKeyField(Users)
2015-11-29 00:08:10 +03:00
ipv4 = CharField()
ipv6 = CharField()
2016-04-03 19:10:18 +03:00
# 0: inactive, 1: active, 2: ..., 3: ..., 4: ..., 5: ...
2015-11-26 23:50:33 +03:00
status = IntegerField()
2016-10-11 03:37:04 +03:00
@staticmethod
def get_items():
return Containers.select().execute()
2015-11-26 23:50:33 +03:00
2015-12-13 04:48:00 +03:00
class ContainersStatistics(PgSQLModel):
2015-11-26 23:50:33 +03:00
container = ForeignKeyField(Containers)
2015-12-14 05:00:33 +03:00
created = DateTimeField(default=datetime.datetime.now)
cpu = BigIntegerField(default=0, null=False)
memory = BigIntegerField(default=0, null=False)
2015-12-16 08:39:53 +03:00
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)
2015-12-15 11:22:41 +03:00
size = BigIntegerField(default=0, null=False)
2015-12-14 05:00:33 +03:00
net_tx = BigIntegerField(default=0, null=False)
net_rx = BigIntegerField(default=0, null=False)
net_total = BigIntegerField(default=0, null=False)
2015-11-26 23:50:33 +03:00
2016-05-16 09:24:27 +03:00
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()
2016-10-11 03:37:04 +03:00
@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
2016-10-17 02:10:57 +03:00
@staticmethod
def get_state(vm_id):
c = Vms.select(Vms.status).where(Vms.id == vm_id).first()
return c.status
2016-05-16 09:24:27 +03:00
2015-11-26 23:50:33 +03:00
class Tasks(PgSQLModel):
id = UUIDField(primary_key=True, unique=True)
2016-04-03 19:10:18 +03:00
datacenter = ForeignKeyField(DataCenters)
server = ForeignKeyField(Servers)
user = ForeignKeyField(Users)
2015-11-26 23:50:33 +03:00
created = DateTimeField(default=datetime.datetime.now)
2015-12-01 02:45:57 +03:00
task = CharField(null=False)
2016-04-20 03:39:13 +03:00
# 0 - new, 1 - working, 2 - completed
2015-12-01 02:45:57 +03:00
status = IntegerField(null=False, default=0)
2015-11-26 23:50:33 +03:00
plain = TextField()
2016-10-17 02:10:57 +03:00
@staticmethod
def exists_active_tasks(user_id):
if Tasks.select().where(Tasks.user == user_id, Tasks.status != 2).count() == 0:
return False
return True
2016-11-07 09:28:03 +03:00
@staticmethod
def count_items(status=None):
if status:
Tasks.select().where(Tasks.status == status).count()
return Tasks.select().count()
2016-10-11 03:37:04 +03:00
# @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)
# )
2015-11-26 23:50:33 +03:00
class Settings(PgSQLModel):
2016-04-03 19:10:18 +03:00
"""
Модель настроек
"""
2015-11-26 23:50:33 +03:00
key = TextField(unique=True, null=False)
val = TextField(null=True)
2016-10-27 10:47:16 +03:00
@staticmethod
def get_item(key):
if Settings.select().where(Settings.key == key).count() == 0:
return None
return Settings.select(Settings.val).where(Settings.key == key).first().val
2015-11-26 23:50:33 +03:00
class Admins(PgSQLModel):
id = UUIDField(primary_key=True, unique=True)
email = CharField(unique=True, null=False)
password = CharField()
status = IntegerField()
2015-12-23 02:31:43 +03:00
2016-10-11 03:37:04 +03:00
@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
2015-12-23 02:31:43 +03:00
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
2015-12-23 02:31:43 +03:00
alert = CharField(null=False)
notified = DateTimeField(default=datetime.datetime.now)
details = TextField()