From 8940c604af72c57cadcf0f85366699f5ee66c074 Mon Sep 17 00:00:00 2001 From: Volodymyr Bobyr Date: Mon, 13 Nov 2017 23:47:33 +0200 Subject: [PATCH] Implemened vm.upgrade operation. --- govc/test/vm.bats | 10 +++++ govc/vm/upgrade.go | 81 +++++++++++++++++++++++++++++++++++++++ object/virtual_machine.go | 14 +++++++ 3 files changed, 105 insertions(+) create mode 100644 govc/vm/upgrade.go diff --git a/govc/test/vm.bats b/govc/test/vm.bats index 391ddc034..b421af07a 100755 --- a/govc/test/vm.bats +++ b/govc/test/vm.bats @@ -649,3 +649,13 @@ load test_helper run govc vm.console -capture - "$vm" assert_success } + +@test "vm.upgrade" { + esx_env + + vm=$(new_empty_vm) + + govc vm.upgrade -vm "$vm" + assert_success + +} diff --git a/govc/vm/upgrade.go b/govc/vm/upgrade.go new file mode 100644 index 000000000..e4f4ec8af --- /dev/null +++ b/govc/vm/upgrade.go @@ -0,0 +1,81 @@ +package vm + +import ( + "context" + "flag" + + "fmt" + + "github.com/vmware/govmomi/govc/cli" + "github.com/vmware/govmomi/govc/flags" + "github.com/vmware/govmomi/task" + "github.com/vmware/govmomi/vim25/types" +) + +type upgrade struct { + *flags.VirtualMachineFlag + version int +} + +func init() { + cli.Register("vm.upgrade", &upgrade{}) +} + +func isAlreadyUpgraded(err error) bool { + if fault, ok := err.(task.Error); ok { + _, ok = fault.Fault().(*types.AlreadyUpgraded) + return ok + } + + return false +} + +func (cmd *upgrade) Register(ctx context.Context, f *flag.FlagSet) { + cmd.VirtualMachineFlag, ctx = flags.NewVirtualMachineFlag(ctx) + cmd.VirtualMachineFlag.Register(ctx, f) + + f.IntVar(&cmd.version, "version", 0, "Target vm hardware version, by default -- latest available") +} + +func (cmd *upgrade) Process(ctx context.Context) error { + if err := cmd.VirtualMachineFlag.Process(ctx); err != nil { + return err + } + return nil +} + +func (cmd *upgrade) Description() string { + return `Upgrade VMs to latest hardware version + +Examples: + govc vm.upgrade -vm $vm_name + govc vm.upgrade -version=$version -vm $vm_name + govc vm.upgrade -version=$version -vm.uuid $vm_uuid` +} + +func (cmd *upgrade) Run(ctx context.Context, f *flag.FlagSet) error { + vm, err := cmd.VirtualMachine() + if err != nil { + return err + } + + var version = "" + if cmd.version != 0 { + version = fmt.Sprintf("vmx-%02d", cmd.version) + } + + task, err := vm.UpgradeVM(ctx, version) + if err != nil { + return err + } + err = task.Wait(ctx) + if err != nil { + if isAlreadyUpgraded(err) { + fmt.Println(err.Error()) + } else { + return err + } + } + + return nil +} diff --git a/object/virtual_machine.go b/object/virtual_machine.go index 4c36ee10e..511f55723 100644 --- a/object/virtual_machine.go +++ b/object/virtual_machine.go @@ -785,3 +785,17 @@ func (v VirtualMachine) Export(ctx context.Context) (*nfc.Lease, error) { return nfc.NewLease(v.c, res.Returnval), nil } + +func (v VirtualMachine) UpgradeVM(ctx context.Context, version string) (*Task, error) { + req := types.UpgradeVM_Task{ + This: v.Reference(), + Version: version, + } + + res, err := methods.UpgradeVM_Task(ctx, v.Client(), &req) + if err != nil { + return nil, err + } + + return NewTask(v.c, res.Returnval), nil +}