mirror of https://github.com/openspug/spug
104 lines
3.8 KiB
Python
104 lines
3.8 KiB
Python
# Copyright: (c) OpenSpug Organization. https://github.com/openspug/spug
|
|
# Copyright: (c) <spug.dev@gmail.com>
|
|
# Released under the AGPL-3.0 License.
|
|
from django.db import models
|
|
from libs import ModelMixin, human_datetime
|
|
from apps.account.models import User
|
|
from apps.setting.utils import AppSetting
|
|
from libs.ssh import SSH
|
|
import json
|
|
|
|
|
|
class Host(models.Model, ModelMixin):
|
|
name = models.CharField(max_length=100)
|
|
hostname = models.CharField(max_length=50)
|
|
port = models.IntegerField(null=True)
|
|
username = models.CharField(max_length=50)
|
|
pkey = models.TextField(null=True)
|
|
desc = models.CharField(max_length=255, null=True)
|
|
is_verified = models.BooleanField(default=False)
|
|
created_at = models.CharField(max_length=20, default=human_datetime)
|
|
created_by = models.ForeignKey(User, models.PROTECT, related_name='+')
|
|
|
|
@property
|
|
def private_key(self):
|
|
return self.pkey or AppSetting.get('private_key')
|
|
|
|
def get_ssh(self, pkey=None, default_env=None):
|
|
pkey = pkey or self.private_key
|
|
return SSH(self.hostname, self.port, self.username, pkey, default_env=default_env)
|
|
|
|
def to_view(self):
|
|
tmp = self.to_dict()
|
|
if hasattr(self, 'hostextend'):
|
|
tmp.update(self.hostextend.to_view())
|
|
tmp['group_ids'] = []
|
|
return tmp
|
|
|
|
def __repr__(self):
|
|
return '<Host %r>' % self.name
|
|
|
|
class Meta:
|
|
db_table = 'hosts'
|
|
ordering = ('-id',)
|
|
|
|
|
|
class HostExtend(models.Model, ModelMixin):
|
|
INSTANCE_CHARGE_TYPES = (
|
|
('PrePaid', '包年包月'),
|
|
('PostPaid', '按量计费'),
|
|
('Other', '其他')
|
|
)
|
|
INTERNET_CHARGE_TYPES = (
|
|
('PayByTraffic', '按流量计费'),
|
|
('PayByBandwidth', '按带宽计费'),
|
|
('Other', '其他')
|
|
)
|
|
host = models.OneToOneField(Host, on_delete=models.CASCADE)
|
|
instance_id = models.CharField(max_length=64, null=True)
|
|
zone_id = models.CharField(max_length=30, null=True)
|
|
cpu = models.IntegerField()
|
|
memory = models.FloatField()
|
|
disk = models.CharField(max_length=255, default='[]')
|
|
os_name = models.CharField(max_length=50)
|
|
os_type = models.CharField(max_length=20)
|
|
private_ip_address = models.CharField(max_length=255)
|
|
public_ip_address = models.CharField(max_length=255)
|
|
instance_charge_type = models.CharField(max_length=20, choices=INSTANCE_CHARGE_TYPES)
|
|
internet_charge_type = models.CharField(max_length=20, choices=INTERNET_CHARGE_TYPES)
|
|
created_time = models.CharField(max_length=20, null=True)
|
|
expired_time = models.CharField(max_length=20, null=True)
|
|
updated_at = models.CharField(max_length=20, default=human_datetime)
|
|
|
|
def to_view(self):
|
|
tmp = self.to_dict(excludes=('id',))
|
|
tmp['disk'] = json.loads(self.disk)
|
|
tmp['private_ip_address'] = json.loads(self.private_ip_address)
|
|
tmp['public_ip_address'] = json.loads(self.public_ip_address)
|
|
tmp['instance_charge_type_alias'] = self.get_instance_charge_type_display()
|
|
tmp['internet_charge_type_alisa'] = self.get_internet_charge_type_display()
|
|
return tmp
|
|
|
|
class Meta:
|
|
db_table = 'host_extend'
|
|
|
|
|
|
class Group(models.Model, ModelMixin):
|
|
name = models.CharField(max_length=50)
|
|
parent_id = models.IntegerField(default=0)
|
|
sort_id = models.IntegerField(default=0)
|
|
hosts = models.ManyToManyField(Host, related_name='groups')
|
|
|
|
def to_view(self, with_hosts=False):
|
|
response = dict(key=self.id, value=self.id, title=self.name, children=[])
|
|
if with_hosts:
|
|
def make_item(x):
|
|
return dict(title=x.name, hostname=x.hostname, key=f'{self.id}_{x.id}', id=x.id, isLeaf=True)
|
|
|
|
response['children'] = [make_item(x) for x in self.hosts.all()]
|
|
return response
|
|
|
|
class Meta:
|
|
db_table = 'host_groups'
|
|
ordering = ('-sort_id',)
|