vSphere,通过API(govmomi)将现有的硬盘添加到虚拟机中。

huangapple go评论180阅读模式
英文:

vSphere, add existing HDD to VM via API(govmomi)

问题

我正在尝试将一个虚拟机的现有硬盘添加到另一个虚拟机中。
我使用的是golang和这个API:https://github.com/vmware/govmomi

首先,我从源虚拟机获取硬盘,代码如下:

  1. for _, device := range devices {
  2. currentDeviceLabel := device.GetVirtualDevice().DeviceInfo.GetDescription().Label
  3. if strings.Contains(strings.ToLower(currentDeviceLabel), "hard disk"){
  4. disks = append(disks, device)
  5. }
  6. }
  7. return disks

然后,我尝试将接收到的硬盘添加到另一个虚拟机中,代码如下:

  1. func addDisk(vm *object.VirtualMachine, disk types.BaseVirtualDevice) {
  2. ctx, cancel := context.WithCancel(context.Background())
  3. defer cancel()
  4. spec := types.VirtualMachineConfigSpec{
  5. DeviceChange : []types.BaseVirtualDeviceConfigSpec {
  6. &types.VirtualDeviceConfigSpec{
  7. Operation: types.VirtualDeviceConfigSpecOperationAdd,
  8. FileOperation: types.VirtualDeviceConfigSpecFileOperationCreate,
  9. Device: disk,
  10. },
  11. },
  12. }
  13. result, err := vm.Reconfigure(ctx, spec)
  14. if err != nil {
  15. log.Fatal(fmt.Sprintf("err: %s", err.Error()))
  16. }
  17. }

我从vSphere得到了错误信息:

  1. 无法完成操作,因为文件或文件夹 [xxxxx] xxxxx/xxxxx.vmdk 已经存在

我做错了什么?谢谢!

英文:

I am try to add existing HDD from one virtual machine to other.
I use golang and this api: https://github.com/vmware/govmomi

At first i get disks from source vm like this:

  1. for _, device := range devices {
  2. currentDeviceLabel := device.GetVirtualDevice().DeviceInfo.GetDescription().Label
  3. if strings.Contains(strings.ToLower(currentDeviceLabel), "hard disk"){
  4. disks = append(disks, device)
  5. }
  6. return disks

And then i trying to add received disk to other VM:

  1. func addDisk(vm *object.VirtualMachine, disk types.BaseVirtualDevice) {
  2. ctx, cancel := context.WithCancel(context.Background())
  3. defer cancel()
  4. spec := types.VirtualMachineConfigSpec{
  5. DeviceChange : []types.BaseVirtualDeviceConfigSpec {
  6. &types.VirtualDeviceConfigSpec{
  7. Operation: types.VirtualDeviceConfigSpecOperationAdd,
  8. FileOperation: types.VirtualDeviceConfigSpecFileOperationCreate,
  9. Device: disk,
  10. },
  11. },
  12. }
  13. result, err := vm.Reconfigure(ctx, spec)
  14. if err != nil {
  15. log.Fatal(fmt.Sprintf("err: %s", err.Error()))
  16. }

I get error from vSphere:

  1. Cannot complete the operation because the file or folder [xxxxx] xxxxx/xxxxx.vmdk already exists

What i am doing wrong? Thanks!

答案1

得分: 1

我在这里找到了答案:https://github.com/vmware/govmomi/issues/790

工作代码:

  1. spec := types.VirtualMachineConfigSpec{}
  2. config := &types.VirtualDeviceConfigSpec{
  3. Device: disk,
  4. Operation: types.VirtualDeviceConfigSpecOperationAdd,
  5. }
  6. spec.DeviceChange = append(spec.DeviceChange, config)
  7. result, err := vm.Reconfigure(ctx, spec)
  8. if err != nil {
  9. log.Fatal(fmt.Sprintf("err: %s", err.Error()))
  10. }
英文:

I got answer here: https://github.com/vmware/govmomi/issues/790

Working code:

  1. spec := types.VirtualMachineConfigSpec{}
  2. config := &types.VirtualDeviceConfigSpec{
  3. Device: disk,
  4. Operation: types.VirtualDeviceConfigSpecOperationAdd,
  5. }
  6. spec.DeviceChange = append(spec.DeviceChange, config)
  7. result, err := vm.Reconfigure(ctx, spec)
  8. if err != nil {
  9. log.Fatal(fmt.Sprintf("err: %s", err.Error()))
  10. }

huangapple
  • 本文由 发表于 2017年7月18日 02:57:12
  • 转载请务必保留本文链接:https://go.coder-hub.com/45151679.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定