Escritura de la interfaz ESB para la implementación (incluido el código de documento del canal ESB)

Contenido 1: estructura del directorio de compilación de la interfaz ESB

En el paquete testxw:
clone_vmware.py: archivo de escritura de la interfaz personalizada ESB (módulo de componente)
Carpeta del kit de herramientas: para el kit de herramientas del sistema, carpeta del kit de herramientas de configuración del sistema de almacenamiento y método común
:
configs.py: para el módulo de configuración del sistema, configure el nombre del sistema, Dirección de nombre de dominio del sistema, etc.
tools.py: para el módulo de método compartido del sistema
Inserte la descripción de la imagen aquí

注意:1.SYSTEM_NAME代表系统名,ESB包名称也就是ESB的系统名的小写形式。
	 2.HOST代表系统环境的域名地址,也可以是环境所在的机器IP地址
Contenido dos: paquetes dependientes referenciados por paquetes ESB

Ingrese a la máquina donde se encuentra la plataforma de la interfaz ESB a través de xshell, ingrese al entorno virtual esb y podrá ver el paquete dependiente al que hace referencia la interfaz de la plataforma ESB, como se muestra en la figura:
Inserte la descripción de la imagen aquí
Si se hace referencia a una nueva dependencia, el paquete dependiente es no se utiliza en el entorno virtual esb, puede pasar " pip install + paquete y versión dependientes " para instalar el paquete dependiente de la interfaz.
Ahora hay paquetes dependientes: Por
Inserte la descripción de la imagen aquí
ejemplo: pip install pyvim == 0.0.21
Inserte la descripción de la imagen aquí
pip list para ver
Inserte la descripción de la imagen aquí
las dependencias introducida en el paquete ESB en el entorno virtual esb, la interfaz en el paquete ESB se puede Utilizar esta dependencia normalmente.

Contenido 3: ESB establece el sistema y el canal de registro

Hay dos formas de lograrlo:

①:手动在平台建立系统和注册系统通道
②:通过py文件进行建立系统和注册通道

El primer método: establecer manualmente el sistema y registrar el canal del sistema en la plataforma ①Establecer el sistema y completar el
establecimiento
Inserte la descripción de la imagen aquí
del canal :
Inserte la descripción de la imagen aquí
②Registrar el canal
Inserte la descripción de la imagen aquí
Registrar el canal completo:
Inserte la descripción de la imagen aquí
El segundo método: usar el archivo py para establecer el sistema y registrar el canal
Inserte la descripción de la imagen aquí
①Escribir el contenido de config.py:

# 文档分类
SYSTEM_DOC_CATEGORY = [
    {
        'label': u'默认分类', # 分类
        'priority': 100,
        'systems': ['TESTXW']
    }
]

# 系统
SYSTEMS = [
    {
        # 系统名称
        'name': 'TESTXW',
        # 系统标签
        'label': u'虚拟机管理测试',
        # 系统接口负责人
        'interface_admin': 'admin',
        # 执行类超时时长
        'execute_timeout': 100,
        # 查询类超时时长
        'query_timeout': 100,
        # 备注
        'remark': u'虚拟机管理测试'
    }
]

# 组件通道
CHANNELS = [
    ('/testxw/clone_vmware/', {
        # 对应组件代码
        'comp_codename': 'generic.testxw.clone_vmware'   # 代号编码
    })
]

② Copiar config.py y el código del paquete ESB escrito en el directorio " / data / bkee / open_paas / esb / components / generic / apis " de la máquina donde se encuentra la plataforma ESB (modificar adecuadamente según el entorno de directorio de cada empresa)

# INSTALL_PATH 表示项目安装基准目录
配置⽂件地址:[install*path]/open*paas/esb/components/generic/apis/conf.py

③ Ingrese a la máquina donde se encuentra la plataforma ESB, ingrese al entorno virtual esb y ejecute el comando de la siguiente manera:

python manage.py sync_api_docs # 相当于编译读API文档
python manage.py sync_system_and_channel_data [--force]  # 如果系统和通道都已经存在, force强制替换做出改变

Inserte la descripción de la imagen aquí
Ver el estado de establecimiento de la plataforma
Establecer el sistema:
Inserte la descripción de la imagen aquí
Canal de registro:
Inserte la descripción de la imagen aquí
especificar el tipo de ejecución de API

注意: 指定API执行类型(POST/GET)
API_TYPE_OP  执行API
API_TYPE_Q   查询API

以内容一为例,在clone_vmware.py加入
from common.constants import API_TYPE_OP

再加入这个变量

# 组件所属系统的系统名
sys_name = configs.SYSTEM_NAME
# 自定义系统和通道
api_type = API_TYPE_OP

La figura específica es la siguiente:
Inserte la descripción de la imagen aquí

Contenido 4: compile el documento ESB y reinicie la interfaz ESB

Compile el documento ESB:
ingrese a la máquina donde se encuentra la plataforma ESB, ingrese al entorno virtual esb y ejecute el comando de la siguiente manera:

python manage.py sync_api_docs

Inserte la descripción de la imagen aquí
Reinicie la interfaz ESB:
ingrese a la máquina donde se encuentra la plataforma ESB, ingrese al entorno virtual open_paas y ejecute el comando de la siguiente manera:

# INSTALL_PATH 表示项目安装基准目录
# 重启指令
workon open_paas
supervisorctl -c $INSTALL_PATH/etc/supervisor-open_paas.conf restart esb

Por ejemplo: supervisorctl -c /data/bkee/etc/supervisor-open_paas.conf restart esb
Inserte la descripción de la imagen aquí

注意:
① 平台ESB所在的机器都需要作此操作,ESB接口才能使用。
② 自定义通道,需要把conf.pyc文件删除掉,防止命令运行后,平台esb信息不生效,其实是运行了pyc文件信息。
Contenido 5: Puntos a tener en cuenta
① esb安装依赖包可以自己创建一个类似于requirements.txt的文件,存放要安装的依赖包信息,方便管理。
② 自定义系统和通道,生成系统和通道后,不要在平台进行修改系统和通道的任何相关信息,需要在conf.py文件内进行修改,
用命令进行变更,防止以后用命令自定义系统和通道时,把平台修改的信息覆盖掉。
conf.py 目录所在:
# INSTALL_PATH 表示项目安装基准目录
配置⽂件地址:[install*path]/open*paas/esb/components/generic/apis/conf.py
③ 如果paas所在的机器环境有多台,都需要进行包上传,再esb重启,不要之重启一部分机器,防止访问平台esb接口时成功时不成功。
④ ESB组件编写代码样例
# -*- coding: utf-8 -*-
import sys
from django import forms
from common.forms import BaseComponentForm, TypeCheckField
from components.component import Component
from common.constants import API_TYPE_Q
from toolkit.tools import VmManage
from .toolkit import configs

reload(sys)
sys.setdefaultencoding('utf8')


# API_TYPE_OP  执行API
# API_TYPE_Q   查询API

# class类名 是py文件名的大写驼峰
# 文件名字 clone_vmware.py  类名 CloneVmware
# 如果自定义系统和通道,apiLabel代表通道名称
class CloneVmware(Component):
    """
       apiLabel 克隆虚拟机测试 
       apiMethod  GET

       ### 功能描述

       克隆虚拟机测试

       ### 请求参数

       {
   
   { common_args_desc }}

       #### 接口参数

       | 字段  |  类型 | 必选   |  描述     |
       |-----------|------------|--------|------------|
       | ip  |  str    | 是  | vcenter主机ip  |
       | user |  str  | 是  | vcenter用户名  |
       | password |  str  | 是  | vcenter密码  |
       | port |  int | 是  | vcenter端口  |
       | datacenter_name |  str | 是  | 数据中心名称  |
       | vm_exi_ip |  str | 否  | 宿主机IP  |
       | vm_name |  str | 是  | 虚拟机名称  |
       | template_name |  str | 是  | 模版名称  |
       | datastore_name |  str | 否  | 存储名称  |
       | vm_folder |  str | 否  | 虚拟机文件夹名称  |
       | cpu_num |  int | 否  | cpu大小  |
       | memory |  int | 否  | 内存大小(单位:G)  |
       | vm_disk |  int | 否  | 追加硬盘大小(单位:G)  |
       | ip_data |  dict | 否  | 虚拟机指定ip参数  |

       ### ip_data

       | 字段  |  类型 | 必选   |  描述     |
       |-----------|------------|--------|------------|
       | vm_hostname |  str | 是  | 虚拟机主机名  |
       | vm_ip |  str | 是  | 虚拟机ip  |
       | vm_subnetmask |  str | 是  | 子网掩码  |
       | vm_gateway |  str | 是  | 网关  |
       | vm_dns |  str | 否  | DNS  |
       | vm_domain |  str | 否  | 域名  |


       ### 请求参数示例

       ```python
       {
           "bk_app_code": "esb_test",
           "bk_app_secret": "xxx",
           "bk_token": "xxx-xxx-xxx-xxx-xxx",
           "ip": '192.169.10.1',
           "user": '[email protected]',
           "password": '123456',
           "port": 443,
           "datacenter_name": 'xxxx',
           "vm_exi_ip": '192.169.1.10',
           "vm_name": 'xxxx',
           "template_name": 'xxxx',
           "datastore_name": 'xxxx',
           "vm_folder": 'xxxx',
           "cpu_num": 1,
           "memory": 1024,
           "vm_disk": 100,
           "ip_data": {
               "vm_ip": '192.168.1.1',
               "vm_subnetmask": '255.255.255.0',
               "vm_gateway": '192.168.1.0',
               "vm_dns": 'xxx',
               "vm_domain": 'xxx',
               "vm_hostname": 'xxx'
           }
       }
       ```

       ### 返回结果示例

       ```python
       {
           "result": true,
           "code": 0,
           "message": "克隆虚拟机成功",
           "data": {}
       }
       ```
    """
    # 组件所属系统的系统名
    sys_name = configs.SYSTEM_NAME
    # 自定义系统和通道
    api_type = API_TYPE_Q

    class Form(BaseComponentForm):
		# form验证 required 的值是false代表不必传或者true代表必穿
		# form的类型  CharField、IntegerField、TypeCheckField(promise_type=dict、或者promise_type=list)、
		# DefaultBooleanField、ListField,也可以用Django的form其他的类型
        ip = forms.CharField(label=u'vcenter主机ip', required=True)
        user = forms.CharField(label=u'vcenter用户名', required=True)
        password = forms.CharField(label=u'vcenter密码', required=True)
        port = forms.IntegerField(label=u'vcenter端口', required=True)
        datacenter_name = forms.CharField(label=u'数据中心名称', required=True)
        vm_name = forms.CharField(label=u'虚拟机名称', required=True)
        vm_exi_ip = forms.CharField(label=u'宿主机IP', required=True)
        template_name = forms.CharField(label=u'模版名称', required=True)
        datastore_name = forms.CharField(label=u'存储名称', required=False)
        vm_folder = forms.CharField(label=u'虚拟机文件夹名称', required=False)
        cpu_num = forms.IntegerField(label=u'cpu大小', required=False)
        memory = forms.IntegerField(label=u'内存大小', required=False)
        vm_disk = forms.IntegerField(label=u'追加硬盘大小', required=False)
        ip_data = TypeCheckField(label=u'虚拟机指定ip数据', promise_type=dict, required=False)

        # clean方法返回的数据可通过组件的form_data属性获取
        # 进行数据清洗
        def clean(self):
            return self.get_cleaned_data_when_exist(
                keys=['ip', 'user', 'password', 'port',
                      'datacenter_name', 'vm_name',
                      'template_name', 'datastore_name', 'vm_folder', 'vm_exi_ip',
                      'cpu_num', 'memory', 'vm_disk', 'ip_data'])

    # 组件处理入口,
    def handle(self):
        data = self.form_data # 获取form表单的数据
		# 必传取值方式
        ip = data['ip']
        user = data['user']
        password = data['password']
        port = data['port']
        datacenter_name = data['datacenter_name']
        vm_name = data['vm_name']
        template_name = data['template_name']
        # 不必传取值方式
        datastore_name = data.get('datastore_name')
        vm_folder = data.get('vm_folder')
        vm_exi_ip = data.get('vm_exi_ip')
        cpu_num = data.get('cpu_num')
        memory = data.get('memory')
        vm_disk = data.get('vm_disk')
        ip_data = data.get('ip_data')
        vm_ip = None
        vm_subnetmask = None
        vm_gateway = None
        vm_dns = None
        vm_domain = None
        vm_hostname = None
        ip_result = True

        response = {}
        try:
            vm = VmManage(host=ip,
                          user=user,
                          password=password,
                          port=port, ssl=None)

            if ip_data:
                vm_ip = ip_data.get('vm_ip', None)
                vm_subnetmask = ip_data.get('vm_subnetmask', None)
                vm_gateway = ip_data.get('vm_gateway', None)
                vm_dns = ip_data.get('vm_gateway', None)
                vm_domain = ip_data.get('vm_domain', None)
                vm_hostname = ip_data.get('vm_hostname', None)
                if vm_ip is None or vm_ip == '':
                    response['message'] = '虚拟机IP [vm_ip] This field is required.'
                    ip_result = False
                elif vm_subnetmask is None or vm_subnetmask == '':
                    response['message'] = '子网掩码 [vm_subnetmask] This field is required.'
                    ip_result = False
                elif vm_gateway is None or vm_gateway is '':
                    response['message'] = '网关 [vm_gateway] This field is required.'
                    ip_result = False
                elif vm_hostname is None or vm_hostname is '':
                    response['message'] = '虚拟机主机名 [vm_hostname] This field is required.'
                    ip_result = False
                else:
                    ip_result = True
            if ip_result:
                data = vm.clone(
                    template_name=template_name,
                    vm_name=vm_name,
                    datacenter_name=datacenter_name,
                    datastore_name=datastore_name,
                    vm_folder=vm_folder,
                    vm_exi_ip=vm_exi_ip,
                    cup_num=cpu_num,
                    memory=memory,
                    vm_disk=vm_disk,
                    vm_ip=vm_ip,
                    vm_subnetmask=vm_subnetmask,
                    vm_gateway=vm_gateway,
                    vm_dns=vm_dns,
                    vm_domain=vm_domain,
                    vm_hostname=vm_hostname
                )
                response = data
                if data['result']:
                    response['code'] = 0
            else:
                response['code'] = 1
                response['result'] = False
        except Exception, e:
            response = {
                'code': 500,
                'message': e.message,
                'result': False,
                'data': {}
            }
        # 返回信息数据
        self.response.payload = response

Contenido 6: Ingrese al entorno de la máquina PAAS a través de la máquina de control central

Primero conéctese a la máquina de control central e
Inserte la descripción de la imagen aquí
ingrese la primera máquina con paas
Inserte la descripción de la imagen aquí

注意:
① PAAS_IP   有多台paas时,从PAAS_IP0开始 代表机器台数从第一台开始 ,第二台就是PAAS_IP1,类似于数组。
② 进入到paas机器后,如果要切换到其他的中控机下的机器,一定要exit退出当前所在的paas环境

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_42631707/article/details/100893551
Recomendado
Clasificación