天天看點

從0到1開發自動化運維平台 Day2

作者:CharlesLai89

繼續運維平台開發分享,昨天實作了基本的區域和IDC機房管理,今天來實作産品線、項目和環境的管理.

建立模型、序列化、視圖檔案

1、新增model_cmdb.py檔案,路徑apps/cmdb/model/model_cmdb.py

添加from .model_cmdb import *到apps/cmdb/model/__init__.py,檔案内容最終如下所示:

from .model_assets import *
from .model_cmdb import *           

2、新增serialiser_cmdb.py檔案,路徑apps/cmdb/serializer/serialiser_cmdb.py

添加from .serialiser_cmdb import *到apps/cmdb/serializer/__init__.py,檔案最終内容如下:

from .serializer_assets import *
from .serialiser_cmdb import *           

3、新增view_cmdb.py,路徑apps/cmdb/view/view_cmdb.py

添加from .view_cmdb import *到apps/cmdb/view/__init__.py,最終内容如下:

from .view_assets import *
from .view_cmdb import *           

産品模型

建立産品模型

from django.db import models
from django.contrib.auth.models import User

from .model_assets import TimeAbstract, CommonParent, Region


class Product(TimeAbstract, CommonParent):
    name = models.CharField(max_length=100, unique=True, verbose_name='産品')
    alias = models.CharField(max_length=128, default='', verbose_name='産品别名')
    region = models.ForeignKey(
        Region, blank=True, null=True, on_delete=models.PROTECT, verbose_name='區域')
    desc = models.TextField(verbose_name='詳情描述', null=True, blank=True)
    prefix = models.CharField(
        max_length=100, null=True, blank=True, verbose_name='字首')
    creator = models.ForeignKey(User, on_delete=models.PROTECT, null=True, blank=True, verbose_name='産品建立人',
                                help_text='前端不需要傳遞')
    managers = models.JSONField(default=dict, verbose_name='負責人',
                                help_text='存儲格式 對象: {"product": userid, "develop": userid};product: 産品負責人, develop: 技術負責人;值為int類型,存儲使用者ID.')

    def __str__(self):
        return self.name

    class ExtMeta:
        related = True
        dashboard = True
        icon = 'asset4'

    class Meta:
        verbose_name = '産品'
        verbose_name_plural = verbose_name + '管理'           

産品序列化器

from rest_framework import serializers
from cmdb.models import Product


class ProductSerializers(serializers.ModelSerializer):

    class Meta:
        model = Product
        fields = '__all__'
           

産品視圖

from rest_framework import viewsets

from cmdb.models import Product
from cmdb.serializers import ProductSerializers


class ProductViewSet(viewsets.ModelViewSet):
    """
    産品視圖

    ### 産品權限
        {'*': ('product_all', '産品管理')},
        {'get': ('product_list', '檢視産品')},
        {'post': ('product_create', '建立産品')},
        {'put': ('product_edit', '編輯産品')},
        {'patch': ('product_edit', '編輯産品')},
        {'delete': ('product_delete', '删除産品')}
    """
    perms_map = (
        {'*': ('admin', '管理者')},
        {'*': ('product_all', '産品管理')},
        {'get': ('product_list', '檢視産品')},
        {'post': ('product_create', '建立産品')},
        {'put': ('product_edit', '編輯産品')},
        {'patch': ('product_edit', '編輯産品')},
        {'delete': ('product_delete', '删除産品')}
    )
    queryset = Product.objects.all()
    serializer_class = ProductSerializers           

添加路由

添加下面的代碼到devops_backend/urls.py

from cmdb.views import ProductViewSet

router.register('product', ProductViewSet)           

最終内容如下:

from django.contrib import admin
from django.urls import path, include

from rest_framework.routers import DefaultRouter

from cmdb.views import RegionViewSet, IdcViewSet, ProductViewSet


router = DefaultRouter()

router.register('region', RegionViewSet)
router.register('asset/idc', IdcViewSet)
router.register('product', ProductViewSet)

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include(router.urls)),
]
           

建立表

# 我這裡已經寫好産品、項目和環境模型了
(venv) ➜  ydevops-backend python manage.py makemigrations
Migrations for 'cmdb':
  apps/cmdb/migrations/0002_environment_product_project.py
    - Create model Environment
    - Create model Product
    - Create model Project
(venv) ➜  ydevops-backend python manage.py migrate       
Operations to perform:
  Apply all migrations: admin, auth, cmdb, contenttypes, sessions
Running migrations:
  Applying cmdb.0002_environment_product_project... OK           

運作項目

按以下步驟操作後,我們再次把項目跑起來

python manage.py runserver 0.0.0.0:9000           

打開浏覽器通路http://localhost:9000/api/,可以看到産品接口也已完成

從0到1開發自動化運維平台 Day2

項目和環境

按同樣的方式繼續完成項目和環境接口.

這裡有一點不一樣的是,我們在定義項目模型的時候,有個projectid字段,我們help_text也寫了前端不需要傳值的,也就是我們後端自己處理

class ProjectSerializers(ModelSerializer):

    class Meta:
        model = Project
        fields = '__all__'
        read_only_fields = ('projectid', )

    @staticmethod
    def perform_extend_save(validated_data):
        _prefix = 'default'
        if validated_data.get('product', None):
            # 如果選擇了産品,則取産品name為字首
            _prefix = validated_data['product'].name
        if validated_data.get('parent', None):
            # 存在上一級項目,則取上一級項目name為字首
            _prefix = validated_data['parent'].name
        if validated_data.get('name', None):
            validated_data['projectid'] = f"{_prefix}.{validated_data['name']}"

        return validated_data

    def create(self, validated_data):
        # 重寫建立方法
        instance = Project.objects.create(**self.perform_extend_save(validated_data))
        return instance
           

試試添加産品

從0到1開發自動化運維平台 Day2

填寫完後點選POST送出,然後點選GET擷取産品清單

OK,今天就到這......

繼續閱讀