console/SWSCloudCore/models.py
2016-10-14 11:21:48 +03:00

346 lines
9.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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()
@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()
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()