kvm方法目录 - KPTest框架开放资料

Skip to content

# kvm方法目录

1. get_os_variant
> 描述：

    1
    2
    3

    方法功能：通过传入的os_variant获取kvm支持的OS的缩写

    命令格式：osinfo-query os | awk '{print $1}' | grep <new_variant>

> 参数：

    1

    os_variant    (str): 创建虚拟机时输入的OS名字

> 返回值：

    1

    new_variant   (str): OS名字对应的创建虚拟机时的缩写

> 异常：

    1
    2
    3
    4

    KPTestException("没有找到OS名字对应的缩写，请先在此处添加！")
    KPTestException(f"执行命令{cmd}失败：

    {stderr}")

> 举例：

    1

    self.get_os_variant(os_variant)

2. get_gateway
> 描述：

    1
    2
    3

    方法功能：如果测试床没有gateway信息，则通过ip解析出网关

    命令格式：

> 参数：

    1

    ip              (str): 虚拟机的ip地址

> 返回值：

    1

    self.gateway    (str): 虚拟机的网关

> 异常：

    1

    None

> 举例：

    1

    gateway = self.get_gateway(ip)

3. generate_ks_file
> 描述：

    1
    2
    3

    方法功能：生成创建虚拟机所需要的配置文件

    命令格式：

> 参数：

    1
    2
    3
    4
    5
    6

    params  (dict): 允许的参数如下：
    ip          (str): 虚拟机ip地址参数字典, {"ip": str, "path": str, "name": str}
    gateway     (str): 虚拟机的网关地址，允许为空，如果为空则根据ip进行解析
    netmask     (str): 虚拟机的子网掩码，允许为空，如果为空则设置为255.255.0.0
    ks_path     (str): ks文件的生成目录，默认为/kvm/config
    os_variant  (str): 虚拟机OS类型变量

> 返回值：

    1

    None

> 异常：

    1

    None

> 举例：

    1

    self.generate_ks_file(params)

4. get_vm_ip
> 描述：

    1
    2
    3

    方法功能：从self.ip_addresses里获取一个可用的虚拟机ip地址

    命令格式：

> 参数：

    1

    None

> 返回值：

    1

    vm_ip      (str): 可用的虚拟机ip地址

> 异常：

    1
    2

    KPTestException("无可用的ip地址，请在测试床中添加虚拟机ip地址资源！")
    KPTestException("虚拟机ip资源池[%s]已耗尽，无法产生新的虚拟机！" % ip_resources)

> 举例：

    1

    ip = self.get_vm_ip()

5. virt_install
> 描述：

    1
    2
    3

    方法功能：使用virt-install命令安装虚拟机

    命令格式：virt-install

> 参数：

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12

    params     (dict): 参数字典，允许输入以下信息：
    vm_name      (str): 虚拟机名称
    mem_size     (str): 虚拟机内存大小
    cpu_num      (str): 虚拟机核心数量
    os_type      (str): OS类型，通常是linux
    iso_file     (str): 用于安装OS的镜像文件绝对地址
    disk_size    (str): 虚拟机的硬盘空间大小
    host_nic     (str): 用于虚拟机业务通信的物理机网口名称
    os_variant   (str): 虚拟机OS类型变量
    file_path    (str): 用于虚拟机自动安装的ks文件绝对地址
    ks_name      (str): 用于虚拟机自动安装的ks文件名称
    boot         (str): 额外的启动参数，主要用于ubuntu系列OS

> 返回值：

    1

    None

> 异常：

    1

    raise KPTestException("执行virt-install命令失败:/r/n%s" % stderr)

> 举例：

    1

    self.virt_install(params=param_vm)

6. create_vm
> 描述：

    1
    2
    3
    4
    5
    6
    7
    8

    方法功能：根据以下步骤创建虚拟机：
                1、根据提供的虚拟机IP生成虚拟机形如centos7_192.168.100.101的虚拟机名称；
                2、从nfs下载虚拟机类型的OS安装镜像文件，如果已经存在则直接使用；
                3、生成自动安装虚拟机需要的配置文件(ks.cfg)；
                4、执行virt-install命令安装虚拟机，等待虚拟机安装完成；
                5、生成虚拟机的host对象并加入self.__hosts中，返回虚拟机名称和标志

    命令格式：

> 参数：

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13

    params      (dict): 动态参数表，允许设定以下参数：
    nfs         (obj): nfs服务器的Host对象
    ip          (str): 虚拟机ip地址
    netmask     (str): 虚拟机的子网掩码，默认为255.255.0.0
    gateway     (str): 虚拟机的网关地址，可根据ip地址生成
    os_variant  (str): 想创建的虚拟机的类型，默认创建centos7
    host_nic    (str): 物理机内创建虚拟机所使用的网口，默认是物理Host业务网口名称
    mem_size    (str): 虚拟机的内存大小，默认为4096MB
    cpu_num     (str): 虚拟机的CPU核心数量，默认为4
    os_type     (str): 虚拟机的OS类型，默认为linux
    disk_size   (str): 虚拟机的硬盘大小，默认为20GB
    ks_path     (str): 生成虚拟机时ks文件存放的目录，默认为/kvm/config/
    ks_name     (str): 生成虚拟机时ks文件名称，默认为ks.cfg

> 返回值：

    1

    vm_name     (str) : 创建的虚拟机名字

> 异常：

    1

    KPTestException("请提供nfs服务器host对象!")

> 举例：

    1

    vm_name = self.create_vm(os_variant=vm_type)

7. wait_create_finished
> 描述：

    1
    2
    3

    方法功能：等待虚拟机安装完成，10分钟没有完成报安装超时的错误

    命令格式：

> 参数：

    1

    vm_name    (str): 虚拟机名称

> 返回值：

    1

    None

> 异常：

    1

    None

> 举例：

    1

    self.wait_create_finished(vm_name)

8. init_kvm_env
> 描述：

    1
    2
    3

    方法功能：初始化KVM测试的测试环境，保证成功启动所需求的KVM

    命令格式：

> 参数：

    1

    type_list   (list): 所需求的KVM类型, 根据vm_type在当前环境已有的虚拟机内查找

> 返回值：

    1
    2
    3
    4

    kvm_met     (dick): 生成的KVM测试对象字典，来自self.hosts
    {
    centos7_71.55.210.10: {'host': host_object, 'ip': ip}}
    }

> 异常：

    1
    2

    KPTestException(f"不支持创建类型为{vm_type}的KVM虚拟机!")
    KPTestException('没有获取到足够的KVM测试对象')

> 举例：

    1

    kvm = self.os_host.kvm.init_kvm_env(type_list=self.vm_type)

9. update_hosts
> 描述：

    1
    2
    3

    方法功能：创建新的虚拟机之后以及kvm初始化的时候更新虚拟机对象列表self.hosts

    命令格式：

> 参数：

    1

    None

> 返回值：

    1

    None

> 异常：

    1

    None

> 举例：

    1

    self.update_hosts()

10. get_all_vms
> 描述：

    1
    2
    3

    方法功能：解析机器中kvm虚拟机的信息

    命令格式：virsh list --all

> 参数：

    1

    None

> 返回值：

    1
    2

    result      (list): kvm虚拟机的列表，列表的每一个元素为一个虚拟机信息字典
    [{"id":"-","name":"1_test","state":"running"}]

> 异常：

    1

    KPTestException: 'Run cmd [%s] failed:/r/n%s' % (cmd, stderr)

> 举例：

    1

    vm_list = self.get_all_vms()

11. get_vm_list
> 描述：

    1
    2
    3

    方法功能：获取VM虚拟机列表，如果为True仅返回满足centos7_192.168.1.1格式的名称列表

    命令格式：

> 参数：

    1

    os_filter    (str) : 是否进行OS名称过滤, 默认为True

> 返回值：

    1
    2

    vm_list      (list): VM列表, [{'name': 'centos7_71.55.210.16',
    'state': 'running', 'id': ' 1', 'ip': 'xx.xx.xx.xx'}]

> 异常：

    1

    None

> 举例：

    1

    vm_list = self.kvm.get_vm_list(True)

12. get_vm_data
> 描述：

    1
    2
    3

    方法功能：获取vm的完整信息

    命令格式：

> 参数：

    1

    None

> 返回值：

    1
    2
    3
    4
    5
    6

    vm_data     (dict): 返回一个字典，以虚拟机名称为键, 值为一个包含虚拟机的ip、虚拟机os类型、虚拟机id、虚拟机状态的字典
    {
    "centos7_192.168.1.1": {
    "ip":str, "type": str, "id": str, "state": str
    }
    }

> 异常：

    1

    None

> 举例：

    1

    all_vm = self.get_vm_data()

13. get_vm_status
> 描述：

    1
    2
    3

    方法功能：获取指定虚拟机的状态

    命令格式：

> 参数：

    1

    vm_name    (str): 要查询的虚拟机的名字

> 返回值：

    1

    status     (str): 查询出来的状态

> 异常：

    1

    None

> 举例：

    1

    self.kvm.get_vm_status(vm_name)

14. get_iso_file
> 描述：

    1
    2
    3

    方法功能：获取所需OS的ISO文件地址，如果没有则从nfs服务器下载

    命令格式：ls <iso_dir>

> 参数：

    1

    os_variant      (str): 虚拟机类型,目前支持['centos7', 'openeuler20', 'sles15']

> 返回值：

    1

    iso_abspath     (str): iso的地址

> 异常：

    1
    2

    KPTestException("当前不支持类型为%s的虚拟机安装" % os_variant)
    KPTestException("下载ISO文件失败,目标目录[%s]未找到文件[%s]" % (dir_path, iso_name))

> 举例：

    1

    iso_file = self.get_iso_file(os_variant)

15. change_vm_state
> 描述：

    1
    2
    3

    方法功能：开关机挂起唤醒虚拟机

    命令格式：virsh <option> <vm_name>

> 参数：

    1
    2

    vm_name     (str) : 虚拟机名称
    action      (str) : 期望改变为何种状态，允许的操作有["on", "off", "pause", "start", "force_off"]

> 返回值：

    1

    result      (bool): 操作是否成功

> 异常：

    1
    2

    KPTestException("虚拟机名称不能为空！")
    KPTestException('非法操作[%s], 仅允许["on", "off", "pause", "start", "force_off"]' % action)

> 举例：

    1

    res = self.change_vm_state(vm_name, 'on')

16. is_vm_running
> 描述：

    1
    2
    3

    方法功能：判断vm虚拟机是否能够运行

    命令格式：

> 参数：

    1

    vm_name     (str) : 虚拟机host对象列表中的虚拟机名称

> 返回值：

    1

    result      (bool): True代表虚拟机能连通，False代表不能连通

> 异常：

    1

    None

> 举例：

    1

    self.host.kvm.is_vm_running(self.vm_name)

17. ensure_vm_running
> 描述：

    1
    2
    3

    方法功能：

    命令格式：

> 参数：

    1
    2

    vm_name     (str) : 虚拟机host对象列表中的ID
    time_out    (int) : 超时时间

> 返回值：

    1

    result      (bool): True代表虚拟机能连通，False代表不能连通

> 异常：

    1

    KPTestException('获取名称%s的虚拟机host对象失败：对象不存在' % vm_name)

> 举例：

    1

18. add_virtual_nic
> 描述：

    1
    2
    3

    方法功能：

    命令格式：

> 参数：

    1
    2

    vm_name     (str): 虚拟机的名字
    nic_name    (str): 物理设备Host下的网口名称

> 返回值：

    1

    result      (bool): 操作是否成功

> 异常：

    1
    2

    KPTestException("虚拟机名称不能为空！")
    KPTestException("物理设备Host下的网口名称不能为空！")

> 举例：

    1

19. get_domiflist
> 描述：

    1
    2
    3

    方法功能：获取虚拟机的网络接口列表

    命令格式：virsh domiflist <vm_name>

> 参数：

    1

    vm_name     (str): 虚拟机的名字

> 返回值：

    1
    2
    3
    4
    5
    6
    7
    8

    if_list     (list): 返回虚拟机的网口列表
    [
    {
    'Interface': 'macvtap1', 'Source': 'enp4s0f1',
    'Model': 'virtio', 'Type': 'direct', 'MAC': '52:54:00:8d:94:89'
    }
    ...
    ]

> 异常：

    1

    KPTestException(res)

> 举例：

    1

    before = self.get_domiflist(vm_name)

20. get_ifdom_by_mac
> 描述：

    1
    2
    3

    方法功能：判断mac是否在虚拟机的domiflist列表中

    命令格式：

> 参数：

    1
    2
    3

    vm_name                 (str): 虚拟机的名字
    mac                     (str) : mac地址
    connection_type         (str) : 接口类型

> 返回值：

    1
    2

    True 在列表里
    False 不在列表里

> 异常：

    1
    2

    KPTestException("虚拟机名称不能为空！")
    raise KPTestException("MAC地址不能为空！")

> 举例：

    1

    if not self.get_ifdom_by_mac(vm_name, br_mac):

21. add_nic
> 描述：

    1
    2
    3

    方法功能：增加网口

    命令格式：virsh attach-interface --domain <vm_name>

> 参数：

    1
    2
    3
    4
    5

    vm_name     (str): 虚拟机的名字
    nic_name    (str): 指定网络接口的源，网络名称或物理设备名称
    nic_type    (str): 网络接口类型
    hot         (bool): 热修改，添加网卡时是否需要提前关闭虚拟机
    method      (str) : 添加网卡使用的方法, 支持['config', 'persistent']

> 返回值：

    1

    mac         (str) : 添加后的virsh domiflist显示的网口mac

> 异常：

    1
    2
    3
    4
    5

    KPTestException("虚拟机名称不能为空！")
    KPTestException("物理设备Host下的网络接口源不能为空！")
    KPTestException("网络接口类型不能为空！")
    KPTestException('虚拟机%s添加%s类型网口命令执行失败: %s' % (vm_name, nic_type, res['stderr']))
    KPTestException("虚拟机%s添加%s类型网口失败" % (vm_name, nic_type))

> 举例：

    1

    self.os_host.kvm.add_nic(self.vm_name, self.br_name)

22. delete_nic
> 描述：

    1
    2
    3

    方法功能：根据MAC地址删除网口

    命令格式：sudo virsh detach-interface --domain <vm_name>

> 参数：

    1
    2
    3
    4
    5

    vm_name     (str): 虚拟机的名字
    nic_mac     (str): 网络接口的MAC地址
    nic_type    (str): 网络接口的类型
    hot         (bool): 热修改，添加网卡时是否需要提前关闭虚拟机
    method      (str) : 添加网卡使用的方法, 支持['config', 'persistent']

> 返回值：

    1

    None

> 异常：

    1
    2
    3
    4
    5

    KPTestException("虚拟机名称不能为空！")
    KPTestException("网口MAC地址不能为空！")
    KPTestException("网口类型不能为空！")
    KPTestException('mac地址%s不在kvm%s的domiflist中' % (nic_mac, vm_name))
    KPTestException('虚拟机%s删除%s类型网口失败: %s' % (vm_name, nic_type, res['stderr']))

> 举例：

    1

    res = self.os_host.kvm.delete_nic(self.vm_name, self.br_name)

23. undefine_vm
> 描述：

    1
    2
    3

    方法功能：删除kvm虚拟机

    命令格式：virsh undefine <vm_name> --nvram

> 参数：

    1

    vm_name     (str) : 要删除的虚拟机名字

> 返回值：

    1

    result      (bool): 操作是否成功

> 异常：

    1

    KPTestException("虚拟机名称不能为空！")

> 举例：

    1

    res = self.host.kvm.undefine_vm(self.vm_name)

24. dump_vm_xml
> 描述：

    1
    2
    3

    方法功能：获取虚拟机xml配置文件内容

    命令格式：virsh dumpxml <vm_name>

> 参数：

    1
    2

    vm_name     (str) : 要删除的虚拟机名字
    xml_path    (str) : 如果不为空则存储到该路径

> 返回值：

    1

    vm_xml      (str) : dump出来的虚拟机xml信息

> 异常：

    1

    KPTestException("虚拟机名称不能为空！")

> 举例：

    1

    res = self.host.kvm.dump_vm_xml(vm_name, xml_path=xml_file)

25. is_vm_exist
> 描述：

    1
    2
    3

    方法功能：判断某个虚拟机是否存在

    命令格式：

> 参数：

    1

    vm_name     (str):   虚拟机名字

> 返回值：

    1

    True if it exists else False

> 异常：

    1

    None

> 举例：

    1

    self.host.kvm.is_vm_exist(self.vm_name)

26. get_disk_info
> 描述：

    1
    2
    3

    方法功能：获取虚拟机硬盘信息列表

    命令格式：

> 参数：

    1

    vm_name     (str) : 虚拟机名字

> 返回值：

    1
    2
    3
    4
    5

    disk_info   (list): 虚拟机的硬盘信息
    [
    {'path': '/var/lib/libvirt/images/cs76_10.175.34.228_disk', 'type': 'disk'},
    {'path': '/var/lib/libvirt/images/rhel76_10.175.34.227_disk', 'type': 'disk'}
    ]

> 异常：

    1

    KPTestException("虚拟机名称不能为空！")

> 举例：

    1

    self.host.kvm.get_disk_info(self.vm_name)

27. delete_vm
> 描述：

    1
    2
    3

    方法功能：undefine虚拟机并删除image文件

    命令格式：

> 参数：

    1
    2

    vm_name (str) : 要删除的虚拟机名字
    force   (bool): 是否彻底删除虚拟机(连虚拟机硬盘文件一起删除)

> 返回值：

    1

    None

> 异常：

    1

    None

> 举例：

    1

    self.host.kvm.delete_vm(self.vm_name)

28. get_vm_host
> 描述：

    1
    2
    3

    方法功能：获取虚拟机的host对象

    命令格式：

> 参数：

    1

    vm_name     (str): 虚拟机名称

> 返回值：

    1

    vm_host     (obj): 虚拟机的host对象

> 异常：

    1

    KPTestException("虚拟机名称不能为空！")

> 举例：

    1

    self.host.kvm.get_vm_host(self.vm_name)

29. delete_virtual_nic
> 描述：

    1
    2
    3

    方法功能：删除虚拟机中的网卡

    命令格式：virsh detach-interface <vm_name> direct <mac_address> --persistent

> 参数：

    1
    2

    vm_name         (str) : 虚拟机名字
    mac_address     (str) : 要删除的网卡的mac 地址

> 返回值：

    1

    result          (bool): 操作是否成功

> 异常：

    1
    2

    KPTestException("虚拟机名称不能为空！")
    KPTestException("要删除的虚拟机网卡mac地址不能为空！")

> 举例：

    1

    self.host.kvm.delete_virtual_nic(self.vm_name, self.mac_address)

30. add_virtual_disk
> 描述：

    1
    2
    3

    方法功能：向虚拟机添加硬盘

    命令格式：virsh attach-disk <disk_info> --cache none --subdriver <disk_type> --persistent

> 参数：

    1
    2
    3
    4

    vm_name         (str) : 虚拟机名字
    disk_path       (str) : 新增的硬盘地址
    drive_letter    (str) : 新增硬盘在虚拟机中的盘符
    disk_type       (str) : 新增硬盘类型, raw或者qcow2, 默认qcow2

> 返回值：

    1

    result         (bool): 操作是否成功

> 异常：

    1
    2
    3

    KPTestException("虚拟机名称不能为空！")
    KPTestException("新增的硬盘地址及盘符不能为空！")
    KPTestException("新增硬盘类型必须是raw或者qcow2！")

> 举例：

    1

    self.os_host.kvm.add_virtual_disk(self.vm_name, self.img_path, self.vdisk)

31. delete_virtual_disk
> 描述：

    1
    2
    3

    方法功能：虚拟机删除硬盘

    命令格式：virsh detach-disk <vm_name> <drive_letter> --persistent

> 参数：

    1
    2

    vm_name         (str) : 虚拟机名字
    drive_letter    (str) : 新增硬盘在虚拟机中的盘符

> 返回值：

    1

    result         (bool): 操作是否成功

> 异常：

    1
    2

    KPTestException("虚拟机名称不能为空！"
    KPTestException("新增的硬盘地址及盘符不能为空！")

> 举例：

    1

    self.os_host.kvm.delete_virtual_disk(self.vm_name, self.vdisk)

32. create_virtual_disk
> 描述：

    1
    2
    3

    方法功能：创建一块虚拟硬盘

    命令格式：virsh detach-disk <vm_name> <drive_letter> --persistent

> 参数：

    1
    2
    3
    4

    disk_path           (str) : 新建的虚拟硬盘的路径
    disk_name           (str) : 新建虚拟硬盘的名字
    disk_size           (str) : 新建虚拟硬盘的大小, 单位为G
    disk_type           (str) : 新建虚拟硬盘的类型, "raw"和"qcow2"可选, 默认"qcow2"

> 返回值：

    1
    2

    result              (bool): 操作是否成功
    abs_disk_path       (str) : 返回创建的虚拟硬盘的路径

> 异常：

    1
    2

    KPTestException("新增的硬盘名字、大小、路径不能为空！")
    KPTestException("新增硬盘类型必须是raw或者qcow2！")

> 举例：

    1
    2
    3

    self.img_path = self.os_host.kvm.create_virtual_disk(
    disk_name='testdisk.img', disk_size='10',
    disk_path="/home/", disk_type="qcow2")[1]

33. save_vm
> 描述：

    1
    2
    3

    方法功能：保存虚拟机

    命令格式：virsh save <vm_name> <file_path>

> 参数：

    1
    2

    vm_name     (str) : 虚拟机名字
    path        (str) : 保存的路径

> 返回值：

    1
    2

    result      (bool): 操作是否成功
    file_path   (str) : 虚拟机还原点文件名字的完整路径

> 异常：

    1

    KPTestException("虚拟机名称不能为空！")

> 举例：

    1

    self.host.kvm.save_vm(self.vm_name)

34. restore_vm
> 描述：

    1
    2
    3

    方法功能：还原虚拟机

    命令格式：virsh restore <file_name>

> 参数：

    1

    file_name   (str) : 还原点文件名字, 通过save保存得到

> 返回值：

    1

    result      (bool): 操作是否成功

> 异常：

    1

    KPTestException("还原点文件名字不能为空！")

> 举例：

    1

    self.host.kvm.restore_vm(self.status_file)

35. generate_pci_xml
> 描述：

    1
    2
    3

    方法功能：生成向kvm添加pci设备所用的xml

    命令格式：

> 参数：

    1
    2

    xml_path     (str): 生成的xml路径
    bdf          (str): 所用设备bdf号

> 返回值：

    1

    None

> 异常：

    1
    2

    KPTestException("xml文件路径不能为空!")
    KPTestException("输入的bdf号为空或非法!")

> 举例：

    1

    self.generate_pci_xml(KvmConfig.xml_path, _bdf)

36. switch_kvm_status
> 描述：

    1
    2
    3

    方法功能：切换虚拟机的状态，并保证处于此状态

    命令格式：

> 参数：

    1
    2

    vm_name     (str) : 需要设置的kvm的名字
    state       (str) : 需要切换的状态

> 返回值：

    1

    result      (bool): 操作是否成功

> 异常：

    1
    2
    3
    4

    KPTestException("虚拟机名称不能为空！")
    KPTestException('传入的状态参数错误')
    KPTestException(f"设置虚拟机[{vm_name}]状态异常")
    KPTestException(f"启动虚拟机[{vm_name}]失败")

> 举例：

    1

    self.os_host.kvm.switch_kvm_status(self.vm_name, 'on')

37. add_pci_device
> 描述：

    1
    2
    3

    方法功能：将PCI设备添加到KVM中，添加完后启动虚拟机

    命令格式：virsh attach-device <vm_name> <KvmConfig.xml_path> --config

> 参数：

    1
    2

    vm_name   (str)     : 所要添加的KVM名字
    bdf       (str|list): 要添加的pci设备bdf号，形式为列表或字符串

> 返回值：

    1

    result    (bool)    : 操作是否成功

> 异常：

    1
    2
    3

    KPTestException("虚拟机名称不能为空!")
    KPTestException("输入的bdf号为空或非法!")
    KPTestException("尝试关闭虚拟机失败!")

> 举例：

    1

    self.host.kvm.add_pci_device(self.vm_name, _bdf)

38. del_pci_device
> 描述：

    1
    2
    3

    方法功能：将PCI设备从KVM删除

    命令格式：virsh detach-device <vm_name> <KvmConfig.xml_path> --config

> 参数：

    1
    2

    vm_name   (str)     : 所要添加的KVM名字
    bdf       (str|list): 要添加的pci设备bdf号，形式为列表或字符串

> 返回值：

    1

    result    (bool)    : 操作是否成功

> 异常：

    1
    2

    KPTestException("虚拟机名称不能为空!")
    KPTestException("输入的bdf号为空或非法!")

> 举例：

    1

    self.host.kvm.del_pci_device(self.vm_name, _bdf)

39. get_dom_info
> 描述：

    1
    2
    3

    方法功能：查询虚拟机基本信息

    命令格式：virsh dominfo <vm_name>

> 参数：

    1

    vm_name     (str) : 虚拟机名字

> 返回值：

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

    success     (bool): 操作是否成功
    result      (dict): 虚拟机的基本信息字典
    {
    'CPU(s)': '8',
    'UUID': 'eed92637-2b10-4635-9a07-56aa7fd083fd',
    'Persistent': 'yes',
    'Security label': 'system_u:system_r:svirt_t:s0:c37,c910 (enforcing)',
    'Security model': 'selinux',
    'Max memory': '4193280 KiB',
    'Id': '12',
    'State': 'running',
    'Used memory': '4193280 KiB',
    'Autostart': 'disable',
    'Security DOI': '0',
    'CPU time': '337.5s',
    'OS Type': 'hvm',
    'Managed save': 'no',
    'Name': 'cs76_10.175.34.228'
    }

> 异常：

    1

    KPTestException("虚拟机名称不能为空!")

> 举例：

    1

    self.os_host.kvm.get_dom_info(self.vm_name)

40. get_interface_info
> 描述：

    1
    2
    3

    方法功能：虚拟机网卡信息查询

    命令格式：

> 参数：

    1

    vm_name         (str) : 虚拟机名字

> 返回值：

    1
    2
    3
    4
    5

    interface_info  (list): 网卡信息列表
    [{
    'name': 'eth0', 'address': '52:54:00:f7:46:08',
    'dev': 'enp135s0f0', 'type': 'virtio',
    }]

> 异常：

    1

    KPTestException("虚拟机名称不能为空!")

> 举例：

    1

    self.os_host.kvm.get_interface_info(self.vm_name)

41. set_interface_dev
> 描述：

    1
    2
    3

    方法功能：设置虚拟机xml配置文件中interface字段中的source dev

    命令格式：sed -i "s#<source dev=\(.*\) mode=#<source dev=\'<eth>\' mode=#g" <xml_path>

> 参数：

    1
    2

    eth            (str): 目标网口名称
    xml_path       (str): 虚拟机xml文件

> 返回值：

    1

    None

> 异常：

    1
    2

    KPTestException("目标网口名称不能为空!")
    KPTestException("虚拟机xml文件路径不能为空!")

> 举例：

    1

    self.host.kvm.set_interface_dev(supt_eth, self.xml_path)

42. backup_vm
> 描述：

    1
    2
    3

    方法功能：备份虚拟机到路径base_dir

    命令格式：

> 参数：

    1
    2

    vm_name            (str):   虚拟机名字
    base_dir           (str):   备份该虚拟机的存储根路径,默认为/home/kvm

> 返回值：

    1
    2
    3
    4
    5

    backup_info        (dict):  包含恢复该虚拟机的image和xml路径
    {
    'image': '/home/kvm/images/centos7_170.44.2.12',
    'xml': '/home/kvm/xml/centos7_170.44.2.12.xml'
    }

> 异常：

    1
    2
    3

    KPTestException("不能备份不存在的虚拟机%s！" % vm_name)
    KPTestException(f"保存虚拟机[{vm_name}]失败")
    KPTestException(f"dump虚拟机[{vm_name}]信息到xml文件{xml_file}失败！")

> 举例：

    1

    self.os_host.kvm.backup_vm(self.vm_name)

43. get_blk_list
> 描述：

    1
    2
    3

    方法功能：解析virsh domblklist <vm_name> 的返回值，得到硬盘存储位置列表

    命令格式：virsh domblklist <vm_name>

> 参数：

    1

    vm_name     (str) : 虚拟机名称

> 返回值：

    1
    2

    blk_list    (list): 硬盘存储位置列表
    ['/var/lib/libvirt/images/centos7_170.44.2.12.qcow2']

> 异常：

    1

    KPTestException("虚拟机%s不存在！" % vm_name)

> 举例：

    1

    image_files = self.host.kvm.get_blk_list(vm_name)

44. get_vm_mgr_info
> 描述：

    1
    2
    3

    方法功能：获取虚拟机磁盘文件路径和xml文件路径(生成)

    命令格式：

> 参数：

    1
    2

    vm_name         (str) : 虚拟机名字
    base_dir        (str) : 虚拟机配置的存储根路径,默认为/home/kvm/xml/

> 返回值：

    1
    2
    3
    4
    5

    mgr_info        (dict): 包含迁移该虚拟机的image和xml路径
    {
    'image': ['/home/kvm/images/centos7_170.44.2.12.qcow2'],
    'xml': '/home/kvm/xml/centos7_170.44.2.12.xml'
    }

> 异常：

    1
    2

    KPTestException("虚拟机%s不存在！" % vm_name)
    KPTestException(f"dump虚拟机[{vm_name}]信息到xml文件{xml_file}失败！")

> 举例：

    1

    mgr_info = self.host.kvm.get_vm_mgr_info(self.vm_name)

45. define_vm_from_xml
> 描述：

    1
    2
    3

    方法功能：从xml文件define虚拟机

    命令格式：virsh define <xml_path>

> 参数：

    1

    xml_path    (str): 虚拟机的xml文件绝对路径

> 返回值：

    1

    result      (bool): 操作是否成功

> 异常：

    1

    KPTestException("虚拟机xml文件[%s]不存在！" % xml_path)

> 举例：

    1

    self.host.kvm.define_vm_from_xml(self.xml_path)

46. redefine_vm
> 描述：

    1
    2
    3

    方法功能：重新define已备份的虚拟机

    命令格式：

> 参数：

    1
    2
    3

    vm_name         (str) : 虚拟机名字
    backup_info     (dict): 包含恢复该虚拟机的image和xml,可由函数backup_vm获得
    is_migrate      (bool): 是否正在迁移

> 返回值：

    1

    result          (bool): 操作是否成功

> 异常：

    1

    None

> 举例：

    1

    self.os_host.kvm.redefine_vm(self.vm_name, self.backup_info)

47. restart_vm
> 描述：

    1
    2
    3

    方法功能：重启虚拟机

    命令格式：

> 参数：

    1

    vm_name     (str) : kvm名称

> 返回值：

    1

    result      (bool): 操作是否成功

> 异常：

    1

    None

> 举例：

    1

    self.host.kvm.restart_vm(vm_name)

48. set_cpu
> 描述：

    1
    2
    3

    方法功能：更改虚拟机内存大小

    命令格式：virsh setvcpus <vm_name> <cpu_num> --config

> 参数：

    1
    2

    vm_name     (str) : kvm名称
    cpu_list    (list): 绑定的物理CPU列表，例如[0,1,2,3,4,5,6,7]表示物理上第0到第7个核

> 返回值：

    1

    result      (bool): 操作是否成功

> 异常：

    1
    2

    KPTestException("虚拟机%s不存在！" % vm_name)
    KPTestException("绑定的物理CPU列表不能为空！")

> 举例：

    1

    self.host.kvm.set_cpu(vm_name, cpu_list)

49. set_max_cpu
> 描述：

    1
    2
    3

    方法功能：更改虚拟机最大CP数量大小

    命令格式：virsh setvcpus <vm_name> --maximum <max_cpu> --config

> 参数：

    1
    2

    vm_name     (str) : kvm名称
    max_cpu     (int) : 虚拟机最大CPU数量，如果小于1或大于32则使用默认值4

> 返回值：

    1

    result      (bool): 操作是否成功

> 异常：

    1

    KPTestException("虚拟机%s不存在！" % vm_name)

> 举例：

    1

    self.host.kvm.set_max_cpu(vm_name, len(cpu_list))

50. bond_cpu
> 描述：

    1
    2
    3

    方法功能：将虚拟机的CPU核与物理CPU核进行绑定

    命令格式：virsh vcpupin <vm_name> <vcpu_index> <cpu_index> --config

> 参数：

    1
    2
    3

    vm_name     (str) : kvm名称
    cpu_index   (int) : 绑定的物理CPU核索引
    vcpu_index  (int) : 虚拟机的CPU核索引

> 返回值：

    1

    result      (bool): 操作是否成功

> 异常：

    1
    2

    KPTestException("虚拟机%s不存在！" % vm_name)
    KPTestException("cpu核索引必须是非负整数！")

> 举例：

    1

    self.host.kvm.bond_cpu(vm_name, cpu_index, vcpu_index)

51. bind_cpu_list
> 描述：

    1
    2
    3

    方法功能：将虚拟机的CPU与物理CPU按顺序绑定

    命令格式：

> 参数：

    1
    2

    vm_name     (str) : kvm名称
    cpu_list    (list): 绑定的物理CPU列表，例如[0,1,2,3,4,5,6,7]表示物理上第0到第7个核

> 返回值：

    1

    result      (bool): 操作是否成功

> 异常：

    1
    2

    KPTestException('更改虚拟机最大CPU数量失败')
    KPTestException('更改虚拟机CPU数量失败')

> 举例：

    1

    self.host.kvm.bind_cpu_list(vm_name, cpu_list)

52. unbind_cpu
> 描述：

    1
    2
    3

    方法功能：将虚拟机CPU与物理CPU解除绑定

    命令格式：virsh dumpxml <vm_name> | grep -v cputune | grep -v vcpupin > <xml_path>

> 参数：

    1
    2

    vm_name    (str) : kvm名称
    xml_path   (str) : 虚拟机的xml文件绝对路径

> 返回值：

    1

    result      (bool): 操作是否成功

> 异常：

    1
    2

    KPTestException("虚拟机名称%s不能为空！" % vm_name)
    KPTestException('解除虚拟机CPU绑定失败'

> 举例：

    1

    self.host.kvm.unbind_cpu(vm_name, xml_path)

53. set_memory
> 描述：

    1
    2
    3
    4
    5

    方法功能：更改虚拟机内存大小
                该接口只能修改虚拟机配置文件中的<currentMemory>值，无法修改静态内存<memory>值
                virsh setmem命令调整运行时的内存大小

    命令格式：virsh setmem <vm_name> <size>G --config

> 参数：

    1
    2

    vm_name     (str) : kvm名称
    size        (int) : 准备设置的虚拟机内存大小，单位为G

> 返回值：

    1

    result      (bool): 操作是否成功

> 异常：

    1
    2

    KPTestException("虚拟机名称%s不能为空！" % vm_name)
    KPTestException("准备设置的虚拟机内存大小必须为正整数!")

> 举例：

    1

    self.host.kvm.set_memory(vm_name, size)

54. set_max_memory
> 描述：

    1
    2
    3
    4
    5

    方法功能：更改虚拟机最大内存大小
                该接口只能修改虚拟机配置文件中的<maxmemory>值，
                可以使用virsh setmaxmem命令修改静态内存大小

    命令格式：virsh setmaxmem <vm_name> <max_size>G --config

> 参数：

    1
    2

    vm_name     (str) : kvm名称
    max_size    (int) : 准备设置的虚拟机内存最大值，单位为G

> 返回值：

    1

    result      (bool): 操作是否成功

> 异常：

    1
    2

    KPTestException("虚拟机名称%s不能为空！" % vm_name)
    KPTestException("准备设置的虚拟机内存最大值必须为正整数!")

> 举例：

    1

    res = self.os_host.kvm.set_max_memory(self.vm_name, max_size)

55. get_available_disk
> 描述：

    1
    2
    3

    方法功能：获取未使用的虚拟磁盘设备名

    命令格式：

> 参数：

    1

    used_disks  (list) : 已使用的虚拟磁盘设备名

> 返回值：

    1

    disk    (str) : 未使用的虚拟磁盘设备名

> 异常：

    1

    KPTestException("获取未使用的虚拟磁盘设备名失败")

> 举例：

    1

    vdisk = self.os_host.kvm.get_available_disk(use_disks)

56. set_cpu_num
> 描述：

    1
    2
    3

    方法功能：设置vm的CPU数量为target，兼容live参数

    命令格式：virt setvcpus <vm_name> <core> --config

> 参数：

    1
    2
    3

    vm_name     (str) : 虚拟机名字
    target      (int) : 目标核数
    is_live     (bool): 是否运行

> 返回值：

    1

    target      (int) : vm_name的虚拟核数

> 异常：

    1
    2

    raise KPTestException('最大虚拟CPU数量设置无效')
    raise KPTestException('实时运行虚拟机CPU配置无效')

> 举例：

    1

    vcpus = self.os_host.kvm.set_cpu_num(self.vm_name)

57. check_vm_state
> 描述：

    1
    2
    3

    方法功能：检查虚拟机是否处于某种状态

    命令格式：

> 参数：

    1
    2

    vm_name         (str) : 虚拟机名称
    state           (str) : 需检查的状态

> 返回值：

    1

    True/False      (bool): 是否为检查的状态

> 异常：

    1

    None

> 举例：

    1

    if not self.check_vm_state(vm_name, 'paused'):

58. clone_vm
> 描述：

    1
    2
    3

    方法功能：克隆虚拟机

    命令格式：virt-clone -o <vm_name> -n <clone_name> -f <clone_path>

> 参数：

    1
    2
    3
    4

    vm_name         (str) : 要克隆的虚拟机名字
    timeout_val     (int) : 每次克隆的超时时间
    retry           (int) : 克隆虚拟机最大重试次数
    base_dir        (str) : 存放克隆虚拟机硬盘文件的根路径

> 返回值：

    1

    clone_info      (dict): 包含虚拟机名字和硬盘文件路径

> 异常：

    1

    None

> 举例：

    1

    clone_info = self.os_host.kvm.clone_vm(self.vm_name)

59. clear_clones
> 描述：

    1
    2
    3

    方法功能：清除环境上的clone虚拟机

    命令格式：virsh destroy <vm_name>, virsh undefine <vm_name> --nvram

> 参数：

    1

    base_dir        (str): 克隆虚拟机的硬盘文件存放位置

> 返回值：

    1

    None

> 异常：

    1

    raise KPTestException("执行virsh undefine命令失败:/r/n%s" % stderr)

> 举例：

    1

    self.os_host.kvm.clear_clones()

60. connect_console
> 描述：

    1
    2
    3

    方法功能：连接虚拟机控制台的操作

    命令格式：virsh console centos7_192.168.100.102

> 参数：

    1

    vm_name      (str): 虚拟机名称

> 返回值：

    1

    None

> 异常：

    1

    KPTestException(f"连接到vm[{vm_name}]console失败！")

> 举例：

    1

    self.host.kvm.connect_console(vm_name)

61. suspend_vm
> 描述：

    1
    2
    3

    方法功能：挂起（暂停）虚拟机

    命令格式：virsh suspend <vm_name>

> 参数：

    1

    vm_name      (str): 虚拟机名称

> 返回值：

    1

    None

> 异常：

    1

    raise KPTestException("暂停虚拟机失败")

> 举例：

    1

    self.host.kvm.suspend_vm(vm_name)

62. resume_vm
> 描述：

    1
    2
    3

    方法功能：恢复之前被挂起（暂停）的虚拟机

    命令格式：virsh resume <vm_name>

> 参数：

    1

    vm_name      (str): 虚拟机名称

> 返回值：

    1

    None

> 异常：

    1

    raise KPTestException("恢复虚拟机失败")

> 举例：

    1

    self.host.kvm.resume_vm(vm_name)

63. change_xml
> 描述：

    1
    2
    3

    方法功能：替换虚拟机xml文件字符串

    命令格式：sed -i 's#<old_str>#<new_str>#g

> 参数：

    1
    2
    3

    xml_path        (str)    : xml文件的绝对路径
    old_str         (str)    : 需要被替换的字符串
    new_str         (str)    : 新的字符串

> 返回值：

    1

    True if success else False

> 异常：

    1

    None

> 举例：

    1

    is_success = change_xml()

64. dynamic_migrate
> 描述：

    1
    2
    3

    方法功能：动态迁移虚拟机

    命令格式：virsh migrate --live --unsafe <vm_name>

> 参数：

    1
    2

    params          (dict): 参数列表, 详细说明见Examples
    if_sh           (bool): 是否在虚拟机中运行计数脚本

> 返回值：

    1
    2

    num             (str) : 测试虚拟机中运行的计数脚本的返回值
    pid             (int) : 计数脚本shell脚本的PID

> 异常：

    1
    2
    3
    4
    5

    KPTestException('从host1迁移虚拟机到host2失败')
    KPTestException('动态迁移后未找到虚拟机 %s ' % vm_name)
    KPTestException('动态迁移%s失败.

    ' % vm_name)

> 举例：

    1
    2
    3
    4
    5
    6
    7
    8

    params = {
    'vm_name': self.vm_name,        # 测试虚拟机的名称
    'vm_host': self.test_vm_host,   # 测试虚拟机host对象
    'password': self.supt_passwd,   # 对端环境的root密码
    's_kvm': self.supt_kvm,         # 对端环境的kvm对象
    'migrate_dir': self.migrate_dir,# 动态迁移方向 ’target‘：正向迁移 'source'：逆向迁移
    }
    self.host.kvm.dynamic_migrate(params)

65. read_counter
> 描述：

    1
    2
    3

    方法功能：读取虚拟机计数脚本echo_int.sh生成的文件tc_os_kvm_migrate.txt内的内容

    命令格式：sed -i 's#<old_str>#<new_str>#g

> 参数：

    1
    2
    3

    vm_host         (obj): 虚拟机主机对象
    txt_path        (str): tc_os_kvm_migrate.txt的绝对路径
    retry           (int): 如果未读到内容则重试的最大次数

> 返回值：

    1

    counter         (str): tc_os_kvm_migrate.txt的内容

> 异常：

    1

    None

> 举例：

    1

    num = self.host.kvm.read_counter(vm_host, txt_path)

66. check_counter_status
> 描述：

    1
    2
    3

    方法功能：检查虚拟机执行计数shell脚本输出值是否变动

    命令格式：echo '#!/bin/bash

> 参数：

    1
    2
    3

    vm_host         (obj) : 虚拟机主机对象
    num             (str) : 计数脚本的初值
    txt_path        (str) : 脚本生成的结果文件路径

> 返回值：

    1

    None

> 异常：

    1

    KPTestException("对比失败, 计数脚本已停止运行")

> 举例：

    1

    self.host.kvm.check_counter_status(self.vm_host, num_before)

67. excute_echo_int_sh
> 描述：

    1
    2
    3

    方法功能：在虚拟机/root下创建并执行计数shell脚本

    命令格式：echo '#!/bin/bash

> 参数：

    1

    vm_host         (object) : 虚拟机主机对象

> 返回值：

    1
    2

    txt_path        (str)    : 脚本生成的结果文件路径
    pid             (str)    : bash /root/echo_int.sh 的pid

> 异常：

    1
    2

    KPTestException("在虚拟机中创建脚本失败：%s" % str(e))
    KPTestException("在虚拟机中执行脚本失败")

> 举例：

    1

    txt_path, pid = self.host.kvm.excute_echo_int_sh(vm_host)