gpt4 book ai didi

go - 使用 govmomi 库在 golang 中实现零点偏差

转载 作者:IT王子 更新时间:2023-10-29 01:56:24 24 4
gpt4 key购买 nike

我正在尝试使用 govmomi 库 ( https://github.com/vmware/govmomi ) 对 VM 进行一些自动更改,但我似乎无法解决过去几个小时第 134 行和第 136 行的 nil 指针异常。我让它在某一时刻工作,但后来我不确定我现在做错了什么,因为我尝试了很多组合,但现在似乎没有任何工作......

package main

import (
"context"
"flag"
"github.com/vmware/govmomi"
"github.com/vmware/govmomi/vim25"
"github.com/vmware/govmomi/vim25/soap"
"net/url"
"os"
"strings"

"fmt"

"github.com/vmware/govmomi/govc/flags"

"github.com/vmware/govmomi/vim25/types"
"log"
)


type change struct {
*flags.VirtualMachineFlag
}

const (
envURL = "GOVC_URL"
envUserName = "GOVC_USERNAME"
envPassword = "GOVC_PASSWORD"
envInsecure = "GOVC_INSECURE"
)

// getEnvString returns string from environment variable.
func getEnvString(v string, def string) string {
r := os.Getenv(v)
if r == "" {
return def
}

return r
}

// getEnvBool returns boolean from environment variable.
func getEnvBool(v string, def bool) bool {
r := os.Getenv(v)
if r == "" {
return def
}

switch strings.ToLower(r[0:1]) {
case "t", "y", "1":
return true
}

return false
}

var urlDescription = fmt.Sprintf("ESX or vCenter URL [%s]", envURL)
var urlFlag = flag.String("url", getEnvString(envURL, "https://username:password@host"+vim25.Path), urlDescription)

var insecureDescription = fmt.Sprintf("Don't verify the server's certificate chain [%s]", envInsecure)
var insecureFlag = flag.Bool("insecure", getEnvBool(envInsecure, false), insecureDescription)

func processOverride(u *url.URL) {
envUsername := os.Getenv(envUserName)
envPassword := os.Getenv(envPassword)

// Override username if provided
if envUsername != "" {
var password string
var ok bool

if u.User != nil {
password, ok = u.User.Password()
}

if ok {
u.User = url.UserPassword(envUsername, password)
} else {
u.User = url.User(envUsername)
}
}

// Override password if provided
if envPassword != "" {
var username string

if u.User != nil {
username = u.User.Username()
}

u.User = url.UserPassword(username, envPassword)
}
}

func NewClient(ctx context.Context) (*govmomi.Client, error) {
flag.Parse()

// Parse URL from string
u, err := soap.ParseURL(*urlFlag)
if err != nil {
return nil, err
}

// Override username and/or password as required
processOverride(u)

// Connect and log in to ESX or vCenter
return govmomi.NewClient(ctx, u, *insecureFlag)
}

func main() {

ctx := context.Background()

// Connect and login to ESX or vCenter
c, err := NewClient(ctx)
if err != nil {
log.Fatal(err)
}

defer c.Logout(ctx)

var spec *types.VirtualMachineConfigSpec

var cmd *change

var flip bool

flip = false

spec.VPMCEnabled = &flip

vm, err := cmd.VirtualMachine()

task, err := vm.Reconfigure(ctx, *spec)
if err != nil {
println(err)
}

fmt.Println(task.Wait(ctx))
}

抛出错误的两行是:

spec.VPMCEnabled = &flip

虚拟机,错误 := cmd.VirtualMachine()

两者似乎都抛出相同的 panic: runtime error: invalid memory address or nil pointer dereference。如果我注释掉第一个抛出错误,第二个抛出错误。

我认为两者无关,但我不太清楚如何正确地进行取消引用。

----更新编辑 1----------------

我用下面的响应对此进行了一些更改,但仍然无法解决 task, err := vm.Reconfigure(ctx, *spec)...

package main

import (
"context"
"flag"
"github.com/vmware/govmomi"
"github.com/vmware/govmomi/object"
"github.com/vmware/govmomi/vim25"
"github.com/vmware/govmomi/vim25/soap"
"net/url"
"os"
"strings"

"fmt"

"github.com/vmware/govmomi/vim25/types"
"log"
)


const (
envURL = "GOVC_URL"
envUserName = "GOVC_USERNAME"
envPassword = "GOVC_PASSWORD"
envInsecure = "GOVC_INSECURE"
)

// getEnvString returns string from environment variable.
func getEnvString(v string, def string) string {
r := os.Getenv(v)
if r == "" {
return def
}

return r
}

// getEnvBool returns boolean from environment variable.
func getEnvBool(v string, def bool) bool {
r := os.Getenv(v)
if r == "" {
return def
}

switch strings.ToLower(r[0:1]) {
case "t", "y", "1":
return true
}

return false
}

var urlDescription = fmt.Sprintf("ESX or vCenter URL [%s]", envURL)
var urlFlag = flag.String("url", getEnvString(envURL, "https://username:password@host"+vim25.Path), urlDescription)

var insecureDescription = fmt.Sprintf("Don't verify the server's certificate chain [%s]", envInsecure)
var insecureFlag = flag.Bool("insecure", getEnvBool(envInsecure, false), insecureDescription)

func processOverride(u *url.URL) {
envUsername := os.Getenv(envUserName)
envPassword := os.Getenv(envPassword)

// Override username if provided
if envUsername != "" {
var password string
var ok bool

if u.User != nil {
password, ok = u.User.Password()
}

if ok {
u.User = url.UserPassword(envUsername, password)
} else {
u.User = url.User(envUsername)
}
}

// Override password if provided
if envPassword != "" {
var username string

if u.User != nil {
username = u.User.Username()
}

u.User = url.UserPassword(username, envPassword)
}
}

func NewClient(ctx context.Context) (*govmomi.Client, error) {
flag.Parse()

// Parse URL from string
u, err := soap.ParseURL(*urlFlag)
if err != nil {
return nil, err
}

// Override username and/or password as required
processOverride(u)

// Connect and log in to ESX or vCenter
return govmomi.NewClient(ctx, u, *insecureFlag)
}

func main() {

ctx := context.Background()

// Connect and login to ESX or vCenter
c, err := NewClient(ctx)
if err != nil {
log.Fatal(err)
}

defer c.Logout(ctx)

var spec *types.VirtualMachineConfigSpec
spec = new(types.VirtualMachineConfigSpec)


var flip bool

flip = false

spec.VPMCEnabled = &flip

var vm *object.VirtualMachine
vm = new(object.VirtualMachine)


task, err := vm.Reconfigure(ctx, *spec)
if err != nil {
println(err)
}

fmt.Println(task.Wait(ctx))

}

我得到的完整错误是这样的:

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x280 pc=0x14e18f6]

goroutine 1 [running]:
github.com/vmware/govmomi/vim25.(*Client).RoundTrip(0x0, 0x1886f00, 0xc000016088, 0x1884140, 0xc000298720, 0x1884140, 0xc000298740, 0x300, 0x16e8ac0)
/Users/ronakpatel/go/src/github.com/vmware/govmomi/vim25/client.go:89 +0x26
github.com/vmware/govmomi/vim25/methods.ReconfigVM_Task(0x1886f00, 0xc000016088, 0x1884060, 0x0, 0xc0002d0000, 0xc000288000, 0xc000080400, 0x0)
/Users/ronakpatel/go/src/github.com/vmware/govmomi/vim25/methods/methods.go:10879 +0xb8
github.com/vmware/govmomi/object.VirtualMachine.Reconfigure(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1886f00, 0xc000016088, 0x0, ...)
/Users/ronakpatel/go/src/github.com/vmware/govmomi/object/virtual_machine.go:207 +0x19b
main.main()
/Users/ronakpatel/go/src/awesomeProject1/main.go:143 +0x1ec
exit status 2

----更新编辑2------------

我改变了一些东西并使用了下面提供的答案但现在我再次收到错误但在这部分:task, err := vm.Reconfigure(ctx, spec1)

错误:

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x153d05a]

goroutine 1 [running]:
main.main()
/Users/ronakpatel/go/src/awesomeProject1/main.go:134 +0x19a
exit status 2

代码:

spec1 := types.VirtualMachineConfigSpec{
VPMCEnabled: &[]bool{false}[0],
}

var vm *object.VirtualMachine

var vmf *flags.VirtualMachineFlag

vmf, ctx = flags.NewVirtualMachineFlag(ctx)

vm, _ = vmf.VirtualMachine()

task, err := vm.Reconfigure(ctx, spec1)
if err != nil {
println(err)
}

fmt.Println(task.Wait(ctx))

最佳答案

    var spec *types.VirtualMachineConfigSpec // error: spec is nil pointer
spec = new(types.VirtualMachineConfigSpec) // fix: spec is not nil

var cmd *change

var flip bool

flip = false

// used here
spec.VPMCEnabled = &flip

vm, err := cmd.VirtualMachine()

关于go - 使用 govmomi 库在 golang 中实现零点偏差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55391608/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com