原文地址:http://mp.weixin.qq.com/s?__biz=MjM5NTczODkyOA==&mid=2650948165&idx=1&sn=d6bee9c94975b020bf73d1cd266b43cb&scene=4#wechat_redirect
XAPI 调用是使用XML-RPC协议通过网络发送到安装有XenServer 的主机上。XAPI对象的引用不保证对象的永久标识符,引用不允许对象进行相等比较。对同一物体的两个引用,不保证是文本相同的。对象UUID(Universally UniqueIdentifier,通用唯一识别码)的目的是永久的名字,客户可以通过比较对象的UUID 字符串测试平等。XenServer的XAPI 提供UUID 和不透明引用之间的转换机制,每个类都包含有一个UUID 字段。
XenServer API 是基于XML-RPC 协议进行通信的。XML-RPC 是在Internet 上实现远程方法调用的一种规范,它利用HTTP 作为传输协议,使用XML 作为消息请求的传输主体。XML-RPC 将一个XML 格式的消息体作为HTTP POST 请求发送给服务器,该消息包括名称、运行服务的程序以及输入参数,服务器将执行结果以XML 格式返回,其原理如图所示:
通过XenServer XAPI,用户可以管理虚拟机、存储、网络、主机配置和XenServer 池。调用XenServer API 的步骤如下:
(1)选择传输级别
可以通过以下两种传输发出API 调用:
-
远程管理使用HTTPS
-
本地管理通过Unix 的Domain Sockets 使用HTTP
(2)身份验证和会话处理
在执行其余的API 前,客户端需要先调用login_with_password 函数连接到XenServer主机进行身份验证,该函数会在服务器端创建一个会话并将该会话的引用返回给客户端。
(3)查找操作对象的引用
为了查询操作对象的状态或在其上调用操作,客户端需要获取操作对象的引用,获取对象引用的方法有以下几种:
-
get_by_name_label:返回具有特定标签的特定类的所有对象列表;
-
get by uuid:每个类都有一个UUID,通过这个引用可以返回指定的对象;
-
get_all:返回一组对特定类的所有对象的引用;
-
get all records:返回对特定类的每个对象的记录的引用映射。
(4)通过对象调用执行同步或异步操作
每个方法调用都可以是同步或异步的,除了会话、任务、设置的一些字段。同步RPC调用块,是指直到返回值被接收;同步RPC 调用块返回值完全按照RPC 返回值/状态码来说。本文中只有同步调用的API,所有的异步调用是在特殊的异步命名空间。异步RPC 调用返回一个任务ID,而不是直接返回结果;这个标识符随后被用来跟踪正在运行的异步RPC 的状态。但是异步调用可能立即失败,在一个任务ID 被创建之前可能代替这种可能性,然后返回的任务ID是包裹在一个XML-RPC 结构中,包括错误描述和字段值。
API 对象模型
在对XenServer API类型、XenServer API 主要类及其类之间的映射关系的研究基础上给出API 对象模型调用关系。
XenServer API 类型简单,共有六种数据类型,如下表所示。
类型 | 描述 |
String | 文本串 |
Int | 64 位的整数 |
Float IEEE | 双精度浮点数 |
Bool | 布尔型 |
DateTime | 日期和时间戳 |
Ref(对象名) | 引用一个类的对象名 |
XenServer API 的类多种多样,如下表所示为XenServer 提供的所有类,并给出每个类的描述。
名称 | 描述 |
Session | 一个会话 |
auth | 远程身份验证服务的管理 |
subject | 一个可以登录xAPI 的用户或组 |
role | 与用户或组有关的一组权限 |
task | 一个长时间运行的异步任务 |
event | 异步事件注册和处理 |
pool | 池信息 |
pool _patch | 池补丁 |
VM | 虚拟机 |
VM_metrics | 与虚拟机相关的属性 |
Vm_guest_metrics | 虚拟机报告的属性 |
VMPP | 虚拟机保护机制 |
VM_appliance | 虚拟机设备 |
DR_task | 数据接收任务 |
host | 物理主机 |
host_crashdump | 代表一个主机崩溃转储 |
host_patch | 代表一个补丁存储在一个服务器上 |
host_metrics | 与主机相关的属性 |
host_cpu | 物理CPU |
network | 虚拟网络 |
VIF | 虚拟网络接口 |
VIF_ metrics | 虚拟网络接口的属性 |
PIF | 物理网络接口 |
PIF _metrics | 物理网络接口的属性 |
Bond | 绑定 |
VLAN | 虚拟局域网多路复用器 |
SM | 存储管理器插件 |
SR | 存储库 |
VDI | 虚拟磁盘映像 |
VBD | 虚拟块设备 |
VBD _metrics | 虚拟块设备属性 |
PBD | 通过主机访问SR 的物理块设备 |
crashdump | 虚拟机故障转移 |
VTPM | 虚拟TPM 设备 |
console | 控制台 |
user | 系统用户 |
data source RRDs | 数据源 |
blob | 一个二进制blob 的占位符 |
message | 管理员注意的消息 |
secret | 秘密 |
tunnel | 网络流量通道 |
PCI | PCI 设备 |
PGPU | 物理 GPU (pGPU) |
GPU group | 一组兼容GPU 的资源池 |
VGPU | 虚拟GPU (vGPU) |
XenServer API 的类之间是以何种关系进行关联的,完成一个功能需要多个类的相互调用才能完成,如图给出主要类之间的映射关系:
在XenServer XAPI 类的类型、主要类和类之间的映射关系基础上,得出API 对象模型之间的关系。
(5) API 的一些核心类:
VM:VM 对象表示XenServer 主机或资源池上的特定虚拟机实例。
主机:主机对象表示资源池中的安装XenServer 物理主机。
VDI:VDI 对象表示虚拟磁盘映像。
SR: SR(存储库)聚合VDI 的集合并封装VDI 位所在的物理存储的属性。
网络:网络对象表示存在于 XenServer 主机实例所在的环境中的第二层网络。
(6) 4 个用作连接器的类,用于指定VM 和主机、存储和网络之间的关系:
VBD:VBD(虚拟块设备)对象表示VM 和VDI 之间的连接。
VIF:VIF(虚拟网络接口)对象表示VM 和网络对象之间的连接。
PIF:PIF(物理接口)对象表示主机和网络对象之间的连接。
PBD:PBD(物理块设备)对象表示主机和SR(存储库)对象之间的连接。
虚拟机的创建由Domain 0 来控制,虚拟机的存储和网络是如何创建的,如图所示为虚拟机的网络配置模型:
如图为虚拟机的磁盘配置模型。