测试加速器丨探索 vSphere API 在自动化测试的应用可能

在现代软件开发中,自动化测试系统是保障软件质量的关键工具之一。在复杂的测试场景中,经常需要针对不同的测试对象部署不同的系统作为测试基底。然而,反复的人工部署、安装和克隆操作不仅耗时,而且效率低下。今天,我们就一起聊一聊如何结合 vSphere API 和 Govmomi 构建一套自动化的测试系统

首先要提到的是,该系统是基于 VMware 的自动化测试平台,通过结合规范化配置与自动化流程,将不同配置需求的虚拟机存入系统,利用编写好的自动化流程实现一键配置+安装虚拟机,从而迅速为不同的测试需求提供快速部署的测试环境。这种极大地提高测试效率,缩短测试周期,并且使团队能够更灵活地响应各种测试需求,为软件开发提供强有力的支持。

为了深入理解 vSphere API 和 Govmomi 如何协同工作以构建自动化的测试系统,我们首先需要简要介绍几个核心关键词及其在流程中的角色。

  • vSphere API

vSphere API 是 VMware 提供的一套用于管理 vSphere 环境的接口。通过这些 API,开发人员可以实现以下功能:

  • 创建和管理虚拟机

  • 配置和监控网络及存储资源

  • 进行性能监控和资源分配

vSphere API 支持 REST 和 SOAP 协议,适合不同的编程语言和应用场景。

  • Govmomi

Govmomi 是一个由 VMware 开发的开源 Go 语言库,专门用于与 vSphere API 进行交互。它封装了大部分 vSphere API 的功能,使开发者能够更方便地管理 vSphere 环境。

主要特点包括:

  • 简洁且高效的 Go 语言接口

  • 支持大部分 vSphere API 功能

  • 提供了丰富的示例代码和文档

  • govc

govc (https://github.com/vmware/govmomi/tree/main/govc) 是使用 Golang 编写的高性能 CLI 工具,基于 Govmomi 构建,通过它可以方便地调用 vSphere API。对于小规模的自动化测试,可以考虑通过封装一系列 govc 命令组合的方式来快速投入使用。

由于 govc 通过 Govmomi 实现了大部分 vSphere API usages,基于 Govmomi 进行自动化测试的开发,当需要实现 govc 已有的功能时,可以参考 govc 源码,查看对应的 CLI 命令实现方式,作为自行封装的参考。从后文可以看到,部分功能需要 govc 的支持。因此,我们建议读者尝试使用 govc ,以便更高效地利用 vSphere API 进行自动化测试。

在充分理解这些核心关键词后,接下来,我们介绍一下利用 vSphere API 和 Govmomi 构建自动化的测试系统所需的开发环境以及实施过程中的常用操作。在这一过程中,我们会提供相关的代码演示,以便于更好地理解。

环境准备

首先,需确保开发环境已安装 Go 语言,并能够访问 vSphere 环境。然后,通过执行以下命令安装 Govmomi 库:

go get -u github.com/vmware/govmomi

同时,安装 govc CLI 工具:

go install github.com/vmware/govmomi/govc@latest

安装完成后,使用 Govmomi 库连接到 vSphere 服务器。下面是一个简单的示例代码:

vc := os.Getenv("VSPHERE_SERVER")user := os.Getenv("VSPHERE_USER")password := os.Getenv("VSPHERE_PASSWORD")
u, err := soap.ParseURL(vc)// 省略 err 处理u.User = url.UserPassword(user, password)
client, err := govmomi.NewClient(ctx, u, true) // NewClient 第三个 insecure 参数为 true 时会允许不安全 HTTPS 链接

在构建自动化测试系统中,经常需要执行对虚拟机的克隆、删除等操作。vSphere 通过类似磁盘文件系统的方式来管理虚拟机。例如,一台虚拟机的路径可以表示为Datacenter/Host/(FolderA/FolderB/FolderC.../)VM,其中 FolderX 为可选。从这条路径中,我们可以看到Datacenter、Host、VM等概念,这些都是 vSphere 相关的管理元素。

在实际实施过程中,我们会频繁地与这些元素打交道。因此,我们必须要掌握一些 vSphere 相关概念。这里简要概述几种常见的概念,更多更详细的信息请参考 VMware 官方概念文档及 vSphere 管理对象(详见文末链接)。

  • Finder,顾名思义,常用来发现虚拟机和其他设施,如 datacenter, datastore, resource pool, host system 等。

    获取 finder

    finder := find.NewFinder(client.Client, true)
  • Datacenter,代表数据中心,可视为 vSphere 集群内最顶端的一层,一个 vSphere 集群可能会有多个数据中心。

    获取 datacenter

    dc, err := finder.Datacenter(ctx, "datacenterName")

    获取 datacenter 成功后,最好使用 SetDatacenter 函数将 dc 与 finder 绑定,否则在后续查找隶属于 datacenter 的对象时,会报错未指定 dc:

    finder.SetDatacenter(dc)
  • Host 主机,通常为多台具体的机器,拥有独立的 CPU、内存、IP、网络及 Datastore 数据存储。
  • 获取 host

    host, err := finder.HostSystem(ctx, "192.168.0.17")
  • Finder 查找函数,实际上,finder 的一系列查找函数(HostSystem, Datastore, Folder, ResourcePool 等),除了类似 finder.HostSystem 这样以目标类型命名的函数,还有另外三种搜索函数。以 host 为例:

  1. ObjectList,返回对象列表,支持通配符,若未搜索到结果,会返回空数组而非报错。

    hosts, err := finder.HostSystemList(context.Background(), "192.168.1*")// 省略 err 处理for _, host := range hosts {    fmt.Println(host.Name())}
  2. DefaultObject,在确定只存在一个查找对象时直接取,如果存在多个对象会报错 default host resolves to multiple instances, please specify。

    host, err := finder.DefaultHostSystem(context.Background())// 省略 err 处理fmt.Println(host.Name())
  3. ObjectOrDefault,指定一个对象名,若存在则取该对象,若不存在则尝试取默认值,如果默认值仍不存在则返回错误。该函数支持通配符,如果通配符匹配到多个结果,同样会返回错误。

    host, err := finder.HostSystemOrDefault(context.Background(), "192.168.1.*")// 省略 err 处理fmt.Println(host.Name())​​​​​​​
  • Datastore 数据存储,可理解为虚拟机磁盘所在的位置。

    获取 datastore

    ds, err := finder.Datastore(context.Background(), "192.168.1.17-SSD")
  • Folder 目录,允许存在多个,并支持多级目录结构,以实现对数据中心、集群、数据存储、网络和虚拟机等的进一步管理。需要注意的是,每个目录下必须存储相同类型的对象。

    获取 folder

    folder, err := finder.Folder(context.Background(), "folderName")
  • VM 虚拟机,当需要直接对虚拟机进行操作时,可以通过 finder 配合虚拟机路径进行搜索。

    vm, err := finder.VirtualMachine(context.Background(), "path/vmName") // 单台虚拟机vms, err := finder.VirtualMachineList(context.Background(), "path/vmName*") // 多台虚拟机​​​​​​​

常用操作

确保正确配置开发环境并连接到 vSphere 服务器后,便可以开始构建自动化测试系统了。接下来,我们介绍几种在实际开发过程中会经常用到的操作。

  • 虚拟机开/关机

在使用 finder 获取到虚拟机后,直接执行 VirtualMachine 对象的对应方法即可。

vm, err := finder.VirtualMachine(ctx, vmName)// 省略 err 处理
// PowerOn / PowerOfftask, err := vm.PowerOn(ctx)_, err = task.WaitForResult(ctx)
  • 克隆虚拟机

在实际应用中,很少会通过 API 直接创建虚拟机,因为这样创建出来的环境仍是裸机,需要人工干预操作镜像安装过程。建议使用已安装好的虚拟机作为克隆模版,通过克隆操作来创建新的测试节点。

下面是一个克隆虚拟机的例子。

​​​​​​​

relocateSpec := types.VirtualMachineRelocateSpec{}dsRef := datastore.Reference()relocateSpec.Datastore = &dsRef
spec := types.VirtualMachineCloneSpec{    Location: relocateSpec,}
task, err := vm.Clone(ctx, folder, params.Name, spec)// 省略 err 处理_, err = task.WaitForResult(ctx)
  • 获取虚拟机属性

该操作稍微复杂,使用者必须对要获取的属性对应的 VC/ESX 键有一定的了解,而相关的键却缺少具体的文档。不过,好在 govc 提供了 object.collect 命令,详细内容可参考 govc usage(详见文末链接)。

下面为获取 CPU 核数的例子。​​​​​​​

host, err := finder.HostSystem(ctx, "hostName")// 省略 err 处理var contents []string{    "hardware.cpuInfo.numCpuCores",}var h mo.HostSystemerr = host.Properties(ctx, host.Reference(), contents, &h)
fmt.Println(h.Hardware.CpuInfo.NumCpuCores)
  • 删除虚拟机

该操作非常简单,参考下面示例。

task, err := vm.Destroy(ctx)

自动化测试工作流

至此,我们已经具备了构建自动化测试系统的关键能力。利用对虚拟机的创建、管理和销毁的功能组合,便能够实现自动化测试工作流,提高测试效率。下图是一个简单的自动化测试工作流示例,以便直观地展示整个流程。

图片

结合企业具体的测试业务需要,我们可以在更改虚拟机网络时增加自动探测指定 CIDR 内可用 IP、实时监控虚拟机性能参数、自动抓取 RPM 包存储库、自动生成 ansible 脚本及自动重启虚拟机的功能。具体内容限于篇幅就不再一一演示。

通过利用Govmomi 对 vSphere 进行深入操作,我们不仅能够实现基本的自动化测试目标,还能进一步构建复杂且精细的测试逻辑。此外,我们还可以借助 SSH、arping、ansible 等第三方组件进一步完善虚拟机配置和测试流程。未来,我们期待更多基于 vSphere API 的创新应用,为自动化测试领域带来更大的进步和发展。

【文中所涉参考资料链接】

VMware 官方概念文档:

https://docs.vmware.com/en/VMware-vSphere/7.0/com.vmware.vsphere.vcenterhost.doc/GUID-302A4F73-CA2D-49DC-8727-81052727A763.html

vSphere 管理对象:

https://docs.vmware.com/en/VMware-vSphere/7.0/com.vmware.vsphere.vcenterhost.doc/GUID-4D4B3DF2-D033-4782-A030-3C3600DE5A7F.html?hWord=N4IghgNiBcIGYHsIBMCmAnEBfIA

govc usage:

https://github.com/vmware/govmomi/blob/main/govc/USAGE.md#objectcollect

  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值