CMDB服務器管理系統【s5day89】:部分數據表結構-資產入庫思路

一、用django的app做爲統一調用庫的好處

一、建立repository app截圖以下:

 

二、好處以下:

一、app的本質就是一個文件夾python

二、之後全部的app調用數據就只去repository調用django

三、不用每一個app創建一個庫服務器

四、也避免了多個app同事修改同一條數據的衝突app

二、表結構設計類

 

三、具體代碼

from django.db import modelsspa

一、服務器信息信息表設計

    hostname = models.CharField(max_length=128, unique=True)
    sn = models.CharField('SN號', max_length=64, db_index=True)
    manufacturer = models.CharField(verbose_name='製造商', max_length=64, null=True, blank=True)
    model = models.CharField('型號', max_length=64, null=True, blank=True)

    manage_ip = models.GenericIPAddressField('管理IP', null=True, blank=True)

    os_platform = models.CharField('系統', max_length=16, null=True, blank=True)
    os_version = models.CharField('系統版本', max_length=16, null=True, blank=True)

    cpu_count = models.IntegerField('CPU個數', null=True, blank=True)
    cpu_physical_count = models.IntegerField('CPU物理個數', null=True, blank=True)
    cpu_model = models.CharField('CPU型號', max_length=128, null=True, blank=True)

    create_at = models.DateTimeField(auto_now_add=True, blank=True)

    class Meta:
        verbose_name_plural = "服務器表"

    def __str__(self):
        return self.hostname

二、硬盤信息表orm

class Disk(models.Model):
    """
    硬盤信息
    """
    slot = models.CharField('插槽位', max_length=8)
    model = models.CharField('磁盤型號', max_length=32)
    capacity = models.FloatField('磁盤容量GB')
    pd_type = models.CharField('磁盤類型', max_length=32)
    server_obj = models.ForeignKey('Server',related_name='disk')

    class Meta:
        verbose_name_plural = "硬盤表"

    def __str__(self):
        return self.slot

三、網卡信息表server

class NIC(models.Model):
    """
    網卡信息
    """
    name = models.CharField('網卡名稱', max_length=128)
    hwaddr = models.CharField('網卡mac地址', max_length=64)
    netmask = models.CharField(max_length=64)
    ipaddrs = models.CharField('ip地址', max_length=256)
    up = models.BooleanField(default=False)
    server_obj = models.ForeignKey('Server',related_name='nic')


    class Meta:
        verbose_name_plural = "網卡表"

    def __str__(self):
        return self.name

四、內存信息表對象

class Memory(models.Model):
    """
    內存信息
    """
    slot = models.CharField('插槽位', max_length=32)
    manufacturer = models.CharField('製造商', max_length=32, null=True, blank=True)
    model = models.CharField('型號', max_length=64)
    capacity = models.FloatField('容量', null=True, blank=True)
    sn = models.CharField('內存SN號', max_length=64, null=True, blank=True)
    speed = models.CharField('速度', max_length=16, null=True, blank=True)

    server_obj = models.ForeignKey('Server',related_name='memory')


    class Meta:
        verbose_name_plural = "內存表"

    def __str__(self):
        return self.slot

四、資產入庫思路

一、邏輯思路圖

1. 檢查server表中是否有當前資產信息【主機名是惟一標識】blog

    if not server_dict['basic']['status']:
        return HttpResponse('臣妾作不到')
    hostname = server_dict['basic']['data']['hostname']
    server_obj = models.Server.objects.filter(hostname=hostname).first()

二、沒有就建立,服務器和網卡,內存,硬盤...

if not server_obj:
        pass # 沒有就建立,服務器和網卡,內存,硬盤...

三、不然再也不建立server對象,新老數據對比

 else:
        # 再也不建立server對象,新老數據對比
        # 硬盤

二、以硬盤數據爲示例

一、新數據(客戶端發送過來的數據)

   new_disk = server_dict['disk']['data']
        """
        {
            '0': {'slot': '0', 'pd_type': 'SAS', 'capacity': '279.396', 'model': 'SEAGATE ST300MM0006     LS08S0K2B5NV'},
            '1': {'slot': '1', 'pd_type': 'SAS', 'capacity': '279.396', 'model': 'SEAGATE ST300MM0006     LS08S0K2B5AH'},
            '2': {'slot': '2', 'pd_type': 'SATA', 'capacity': '476.939', 'model': 'S1SZNSAFA01085L     Samsung SSD 850 PRO 512GB               EXM01B6Q'},
            '3': {'slot': '3', 'pd_type': 'SATA', 'capacity': '476.939', 'model': 'S1AXNSAF912433K     Samsung SSD 840 PRO Series              DXM06B0Q'},
            '4': {'slot': '4', 'pd_type': 'SATA', 'capacity': '476.939', 'model': 'S1AXNSAF303909M     Samsung SSD 840 PRO Series              DXM05B0Q'},
            '5': {'slot': '5', 'pd_type': 'SATA', 'capacity': '476.939', 'model': 'S1AXNSAFB00549A     Samsung SSD 840 PRO Series
		}"""

二、老數據(服務器端庫的數據)

old_disk = server_obj.disk_set.values('slot','model','capacity','pd_type')
        """
        [
            {'slot': 1, 'model':'xx', 'capacity':'xxx', 'pd_type':'xx'},
            {'slot': 2, 'model':'xx', 'capacity':'xxx', 'pd_type':'xx'},
            {'slot': 3, 'model':'xx', 'capacity':'xxx', 'pd_type':'xx'},
            {'slot': 9, 'model':'xx', 'capacity':'xxx', 'pd_type':'xx'},
        ]
        """

三、set集合實現思路

一、根據槽位進行比較: new_disk有,old_disk沒有 -> 0,4,5     使用create(**dic)方法

二、 根據槽位進行比較: old_disk有,new_disk沒有 -> 0,4,5    使用delete方法

三、 根據槽位進行比較: old_disk有,new_disk有 -> 1,2,3       使用update方法

相關文章
相關標籤/搜索