ESB接口编写到部署(包括ESB通道文档代码)

内容一:ESB接口编写目录结构

testxw包下:
clone_vmware.py: ESB自定义接口编写文件(组件模块)
toolkit文件夹:为系统工具包,存储系统配置及共用方法
toolkit文件夹下:
configs.py: 为系统配置模块,配置系统名称、系统域名地址等
tools.py:为系统共用方法模块
在这里插入图片描述

注意:1.SYSTEM_NAME代表系统名,ESB包名称也就是ESB的系统名的小写形式。
	 2.HOST代表系统环境的域名地址,也可以是环境所在的机器IP地址
内容二:ESB包引用的有依赖包

通过xshell进入到ESB接口平台所在机器,进入esb虚拟环境,可以看出平台ESB接口引用的依赖包,如图:
在这里插入图片描述
如果引用了新的依赖,在esb虚拟环境中没用此依赖包,可以通过“pip install + 依赖包和版本”进行安装接口依赖包
现在有的依赖包:
在这里插入图片描述
比如:pip install pyvim==0.0.21
在这里插入图片描述
pip list查看
在这里插入图片描述
在esb虚拟环境引入ESB包里的依赖,ESB包里的接口就能正常使用此依赖。

内容三:ESB建立系统、注册通道

在这有两种方法去实现:

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

第一种方法:手动在平台建立系统和注册系统通道
①建立系统
在这里插入图片描述
建立通道完成:
在这里插入图片描述
②注册通道
在这里插入图片描述
注册通道完成:
在这里插入图片描述
第二种方法:通过py文件进行建立系统和注册通道
在这里插入图片描述
①编写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'   # 代号编码
    })
]

②将config.py 和 编写好的ESB包代码拷贝到平台ESB所在的机器“/data/bkee/open_paas/esb/components/generic/apis”目录下(根据各自公司使用目录环境不同,适当做出修改)

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

③进入平台ESB所在的机器,进入esb虚拟环境,执行命令如下:

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

在这里插入图片描述
查看平台建立情况
建立系统:
在这里插入图片描述
注册通道:
在这里插入图片描述
指定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

具体如图:
在这里插入图片描述

内容四:编译ESB文档和重启ESB接口

编译ESB文档:
进入平台ESB所在的机器,进入esb虚拟环境,执行命令如下:

python manage.py sync_api_docs

在这里插入图片描述
重启ESB接口:
进入平台ESB所在的机器,进入open_paas虚拟环境,执行命令如下:

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

比如:supervisorctl -c /data/bkee/etc/supervisor-open_paas.conf restart esb
在这里插入图片描述

注意:
① 平台ESB所在的机器都需要作此操作,ESB接口才能使用。
② 自定义通道,需要把conf.pyc文件删除掉,防止命令运行后,平台esb信息不生效,其实是运行了pyc文件信息。
内容五:需要注意的地方
① 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

内容六:通过中控机进入PAAS机器环境

先连接进入中控机
在这里插入图片描述
进入第一个有paas的机器
在这里插入图片描述

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42631707/article/details/100893551
ESB