diff --git a/go.mod b/go.mod index c8fcdc0259..3ecaf66030 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,7 @@ require ( github.com/coreos/go-systemd/v22 v22.5.0 github.com/coreos/stream-metadata-go v0.4.1 github.com/cyphar/filepath-securejoin v0.2.3 - github.com/digitalocean/go-qemu v0.0.0-20210326154740-ac9e0b687001 + github.com/digitalocean/go-qemu v0.0.0-20221209210016-f035778c97f7 github.com/docker/docker v23.0.5+incompatible github.com/docker/go-connections v0.4.1-0.20210727194412-58542c764a11 github.com/docker/go-plugins-helpers v0.0.0-20211224144127-6eecb7beb651 @@ -87,7 +87,7 @@ require ( github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f // indirect github.com/cyberphone/json-canonicalization v0.0.0-20220623050100-57a0ce2678a7 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/digitalocean/go-libvirt v0.0.0-20201209184759-e2a69bcd5bd1 // indirect + github.com/digitalocean/go-libvirt v0.0.0-20220804181439-8648fbde413e // indirect github.com/disiqueira/gotree/v3 v3.0.2 // indirect github.com/docker/distribution v2.8.1+incompatible // indirect github.com/docker/docker-credential-helpers v0.7.0 // indirect diff --git a/go.sum b/go.sum index e4f607ffd3..9fd4fc5b4c 100644 --- a/go.sum +++ b/go.sum @@ -303,10 +303,10 @@ github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8l github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/digitalocean/go-libvirt v0.0.0-20201209184759-e2a69bcd5bd1 h1:j6vGflaQ2T7yOWqVgPdiRF73j/U2Zmpbbzab8nyDCRQ= -github.com/digitalocean/go-libvirt v0.0.0-20201209184759-e2a69bcd5bd1/go.mod h1:QS1XzqZLcDniNYrN7EZefq3wIyb/M2WmJbql4ZKoc1Q= -github.com/digitalocean/go-qemu v0.0.0-20210326154740-ac9e0b687001 h1:WAg57gnaAWWjMAELcwHjc2xy0PoXQ5G+vn3+XS6s1jI= -github.com/digitalocean/go-qemu v0.0.0-20210326154740-ac9e0b687001/go.mod h1:IetBE52JfFxK46p2n2Rqm+p5Gx1gpu2hRHsrbnPOWZQ= +github.com/digitalocean/go-libvirt v0.0.0-20220804181439-8648fbde413e h1:SCnqm8SjSa0QqRxXbo5YY//S+OryeJioe17nK+iDZpg= +github.com/digitalocean/go-libvirt v0.0.0-20220804181439-8648fbde413e/go.mod h1:o129ljs6alsIQTc8d6eweihqpmmrbxZ2g1jhgjhPykI= +github.com/digitalocean/go-qemu v0.0.0-20221209210016-f035778c97f7 h1:3OVJAbR131SnAXao7c9w8bFlAGH0oa29DCwsa88MJGk= +github.com/digitalocean/go-qemu v0.0.0-20221209210016-f035778c97f7/go.mod h1:K4+o74YGNjOb9N6yyG+LPj1NjHtk+Qz0IYQPvirbaLs= github.com/disiqueira/gotree/v3 v3.0.2 h1:ik5iuLQQoufZBNPY518dXhiO5056hyNBIK9lWhkNRq8= github.com/disiqueira/gotree/v3 v3.0.2/go.mod h1:ZuyjE4+mUQZlbpkI24AmruZKhg3VHEgPLDY8Qk+uUu8= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= @@ -352,7 +352,6 @@ github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLi github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a h1:yDWHCSQ40h88yih2JAcL6Ls/kVkSE8GFACTGVnMPruw= github.com/facebookgo/limitgroup v0.0.0-20150612190941-6abd8d71ec01 h1:IeaD1VDVBPlx3viJT9Md8if8IxxJnO+x0JCGb054heg= github.com/facebookgo/muster v0.0.0-20150708232844-fd3d7953fd52 h1:a4DFiKFJiDRGFD1qIcqGLX/WlUMD9dyLSLDt+9QZgt8= -github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= @@ -1019,7 +1018,6 @@ github.com/ysmood/goob v0.4.0 h1:HsxXhyLBeGzWXnqVKtmT9qM7EuVs/XOgkX7T6r1o1AQ= github.com/ysmood/gson v0.7.3 h1:QFkWbTH8MxyUTKPkVWAENJhxqdBa4lYTQWqZCiLG6kE= github.com/ysmood/leakless v0.8.0 h1:BzLrVoiwxikpgEQR0Lk8NyBN5Cit2b1z+u0mgL4ZJak= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= @@ -1146,7 +1144,6 @@ golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -1252,7 +1249,6 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1345,7 +1341,6 @@ golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200711155855-7342f9734a7d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= diff --git a/vendor/github.com/digitalocean/go-libvirt/.gitignore b/vendor/github.com/digitalocean/go-libvirt/.gitignore new file mode 100644 index 0000000000..62c893550a --- /dev/null +++ b/vendor/github.com/digitalocean/go-libvirt/.gitignore @@ -0,0 +1 @@ +.idea/ \ No newline at end of file diff --git a/vendor/github.com/digitalocean/go-libvirt/.travis.yml b/vendor/github.com/digitalocean/go-libvirt/.travis.yml deleted file mode 100644 index 5852afcfd9..0000000000 --- a/vendor/github.com/digitalocean/go-libvirt/.travis.yml +++ /dev/null @@ -1,62 +0,0 @@ -language: go -os: linux -dist: bionic -sudo: require - -cache: - directories: - - $HOME/.ccache - -go: - - "1.15" - -env: - global: - - CCACHE_TEMPDIR=/tmp/.ccache-temp - matrix: - - LIBVIRT=2.3.0 EXT=xz - - LIBVIRT=3.1.0 EXT=xz - - LIBVIRT=5.1.0 EXT=xz - -before_install: - - go get golang.org/x/lint/golint - - go get golang.org/x/tools/cmd/goyacc - -install: - # credit here goes to the go-libvirt authors, - # see: https://github.com/rgbkrk/libvirt-go/blob/master/.travis.yml - - sudo apt-get -qqy build-dep libvirt - - sudo apt-get -qqy install curl qemu-system-x86 - - sudo mkdir -p /usr/src && sudo chown $(id -u) /usr/src - - curl -O -s https://libvirt.org/sources/libvirt-${LIBVIRT}.tar.${EXT} - - tar -C /usr/src -xf libvirt-${LIBVIRT}.tar.${EXT} - - pushd /usr/src/libvirt-${LIBVIRT} - - ccache --show-stats - - | - env PATH=/usr/lib/ccache:$PATH \ - ./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc \ - --without-polkit \ - --without-esx --without-vbox --without-xen --without-libxl --without-lxc \ - --with-qemu - - make - - sudo make install - - ccache --show-stats - - popd - - sudo libvirtd -d -l -f libvirtd.conf - - sudo virtlogd -d || true - -before_script: - - go get -d ./... - - sudo qemu-img create -f raw -o size=10M /var/lib/libvirt/images/test.raw - - sudo virsh define .travis/test-domain.xml - - sudo virsh start test - - sudo virsh pool-create .travis/test-pool.xml - - sudo virsh secret-define .travis/test-secret.xml - -script: - - ./scripts/licensecheck.sh - - LIBVIRT_SOURCE=/usr/src/libvirt-${LIBVIRT} go generate ./... - - go build ./... - - golint -set_exit_status ./... - - go vet ./... - - go test -v -tags=integration ./... diff --git a/vendor/github.com/digitalocean/go-libvirt/AUTHORS b/vendor/github.com/digitalocean/go-libvirt/AUTHORS index e004ab7a1e..aea2144dd1 100644 --- a/vendor/github.com/digitalocean/go-libvirt/AUTHORS +++ b/vendor/github.com/digitalocean/go-libvirt/AUTHORS @@ -21,4 +21,8 @@ Yuriy Taraday Sylvain Baubeau David Schneider Alec Hothan -Akos Varga \ No newline at end of file +Akos Varga +Peter Kurfer +Sam Roberts +Moritz Wanzenböck +Jenni Griesmann diff --git a/vendor/github.com/digitalocean/go-libvirt/CONTRIBUTING.md b/vendor/github.com/digitalocean/go-libvirt/CONTRIBUTING.md index 1b5b741063..ada1e95fd8 100644 --- a/vendor/github.com/digitalocean/go-libvirt/CONTRIBUTING.md +++ b/vendor/github.com/digitalocean/go-libvirt/CONTRIBUTING.md @@ -25,6 +25,3 @@ under the "Contributors" section using the format: `First Last `. Finally, submit a pull request for review! - -Questions? Feel free to join us in [`#go-qemu` on freenode](https://webchat.freenode.net/) -if you'd like to discuss the project. diff --git a/vendor/github.com/digitalocean/go-libvirt/README.md b/vendor/github.com/digitalocean/go-libvirt/README.md index 1252626120..c42c5604b1 100644 --- a/vendor/github.com/digitalocean/go-libvirt/README.md +++ b/vendor/github.com/digitalocean/go-libvirt/README.md @@ -1,10 +1,13 @@ -libvirt [![GoDoc](http://godoc.org/github.com/digitalocean/go-libvirt?status.svg)](http://godoc.org/github.com/digitalocean/go-libvirt) [![Build Status](https://travis-ci.org/digitalocean/go-libvirt.svg?branch=master)](https://travis-ci.org/digitalocean/go-libvirt) [![Report Card](https://goreportcard.com/badge/github.com/digitalocean/go-libvirt)](https://goreportcard.com/report/github.com/digitalocean/go-libvirt) +libvirt +[![GoDoc](http://godoc.org/github.com/digitalocean/go-libvirt?status.svg)](http://godoc.org/github.com/digitalocean/go-libvirt) +[![Build Status](https://github.com/digitalocean/go-libvirt/actions/workflows/main.yml/badge.svg)](https://github.com/digitalocean/go-libvirt/actions/) +[![Report Card](https://goreportcard.com/badge/github.com/digitalocean/go-libvirt)](https://goreportcard.com/report/github.com/digitalocean/go-libvirt) ==== Package `go-libvirt` provides a pure Go interface for interacting with libvirt. Rather than using libvirt's C bindings, this package makes use of -libvirt's RPC interface, as documented [here](https://libvirt.org/internals/rpc.html). +libvirt's RPC interface, as documented [here](https://libvirt.org/kbase/internals/rpc.html). Connections to the libvirt server may be local, or remote. RPC packets are encoded using the XDR standard as defined by [RFC 4506](https://tools.ietf.org/html/rfc4506.html). @@ -30,10 +33,15 @@ re-run the code generator. To do this, follow these steps: - First, download a copy of the libvirt sources corresponding to the version you want to use. -- Next, run `autogen.sh` in the libvirt directory. The autotools will check for - necessary libraries and prepare libvirt for building. We don't actually need - to build libvirt, but we do require some header files that are produced in - this step. +- Change directories into where you've unpacked your distribution of libvirt. +- The second step depends on the version of libvirt you'd like to build against. + It's not necessary to actually build libvirt, but it is necessary to run libvirt's + "configure" step because it generates required files. + - For libvirt < v6.7.0: + - `$ mkdir build; cd build` + - `$ ../autogen.sh` + - For libvirt >= v6.7.0: + - `$ meson setup build` - Finally, set the environment variable `LIBVIRT_SOURCE` to the directory you put libvirt into, and run `go generate ./...` from the go-libvirt directory. This runs both of the go-libvirt's code generators. @@ -169,3 +177,104 @@ ID Name UUID 1 Test-1 dc329f87d4de47198cfd2e21c6105b01 2 Test-2 dc229f87d4de47198cfd2e21c6105b01 ``` + +Example (Connect to libvirt via TLS over TCP) +------- + +```go +package main + +import ( + "crypto/tls" + "crypto/x509" + + "fmt" + "io/ioutil" + "log" + + "github.com/digitalocean/go-libvirt" +) + +func main() { + // This dials libvirt on the local machine + // It connects to libvirt via TLS over TCP + // To connect to a remote machine, you need to have the ca/cert/key of it. + keyFileXML, err := ioutil.ReadFile("/etc/pki/libvirt/private/clientkey.pem") + if err != nil { + log.Fatalf("%v", err) + } + + certFileXML, err := ioutil.ReadFile("/etc/pki/libvirt/clientcert.pem") + if err != nil { + log.Fatalf("%v", err) + } + + caFileXML, err := ioutil.ReadFile("/etc/pki/CA/cacert.pem") + if err != nil { + log.Fatalf("%v", err) + } + cert, err := tls.X509KeyPair([]byte(certFileXML), []byte(keyFileXML)) + if err != nil { + log.Fatalf("%v", err) + } + + roots := x509.NewCertPool() + roots.AppendCertsFromPEM([]byte(caFileXML)) + + config := &tls.Config{ + Certificates: []tls.Certificate{cert}, + RootCAs: roots, + } + + // Use host name or IP which is valid in certificate + addr := "10.10.10.10" + port := "16514" + c, err := tls.Dial("tcp", addr + ":" + port, config) + if err != nil { + log.Fatalf("failed to dial libvirt: %v", err) + } + + // Drop a byte before libvirt.New(c) + // More details at https://github.com/digitalocean/go-libvirt/issues/89 + // Remove this line if the issue does not exist any more + c.Read(make([]byte, 1)) + + l := libvirt.New(c) + if err := l.Connect(); err != nil { + log.Fatalf("failed to connect: %v", err) + } + + v, err := l.Version() + if err != nil { + log.Fatalf("failed to retrieve libvirt version: %v", err) + } + fmt.Println("Version:", v) + + // Return both running and stopped VMs + flags := libvirt.ConnectListDomainsActive | libvirt.ConnectListDomainsInactive + domains, _, err := l.ConnectListAllDomains(1, flags) + if err != nil { + log.Fatalf("failed to retrieve domains: %v", err) + } + + fmt.Println("ID\tName\t\tUUID") + fmt.Println("--------------------------------------------------------") + for _, d := range domains { + fmt.Printf("%d\t%s\t%x\n", d.ID, d.Name, d.UUID) + } + + if err := l.Disconnect(); err != nil { + log.Fatalf("failed to disconnect: %v", err) + } +} +``` + +Running the Integration Tests +----------------------------- + +Github actions workflows are defined in .github/worflows and can be triggered +manually in the github GUI after pushing a branch. There are not currently +convenient scripts for setting up and running integration tests locally, but +installing libvirt and defining only the artifacts described by the files in +testdata should be sufficient to be able to run the integration test file against. + diff --git a/vendor/github.com/digitalocean/go-libvirt/const.gen.go b/vendor/github.com/digitalocean/go-libvirt/const.gen.go index 6e581d22c0..fb1e421d62 100644 --- a/vendor/github.com/digitalocean/go-libvirt/const.gen.go +++ b/vendor/github.com/digitalocean/go-libvirt/const.gen.go @@ -167,313 +167,323 @@ const ( MigrateParamMigrateDisks = "migrate_disks" // MigrateParamDisksPort as defined in libvirt/libvirt-domain.h:982 MigrateParamDisksPort = "disks_port" - // MigrateParamCompression as defined in libvirt/libvirt-domain.h:992 + // MigrateParamDisksURI as defined in libvirt/libvirt-domain.h:995 + MigrateParamDisksURI = "disks_uri" + // MigrateParamCompression as defined in libvirt/libvirt-domain.h:1005 MigrateParamCompression = "compression" - // MigrateParamCompressionMtLevel as defined in libvirt/libvirt-domain.h:1001 + // MigrateParamCompressionMtLevel as defined in libvirt/libvirt-domain.h:1014 MigrateParamCompressionMtLevel = "compression.mt.level" - // MigrateParamCompressionMtThreads as defined in libvirt/libvirt-domain.h:1009 + // MigrateParamCompressionMtThreads as defined in libvirt/libvirt-domain.h:1022 MigrateParamCompressionMtThreads = "compression.mt.threads" - // MigrateParamCompressionMtDthreads as defined in libvirt/libvirt-domain.h:1017 + // MigrateParamCompressionMtDthreads as defined in libvirt/libvirt-domain.h:1030 MigrateParamCompressionMtDthreads = "compression.mt.dthreads" - // MigrateParamCompressionXbzrleCache as defined in libvirt/libvirt-domain.h:1025 + // MigrateParamCompressionXbzrleCache as defined in libvirt/libvirt-domain.h:1038 MigrateParamCompressionXbzrleCache = "compression.xbzrle.cache" - // MigrateParamAutoConvergeInitial as defined in libvirt/libvirt-domain.h:1034 + // MigrateParamAutoConvergeInitial as defined in libvirt/libvirt-domain.h:1047 MigrateParamAutoConvergeInitial = "auto_converge.initial" - // MigrateParamAutoConvergeIncrement as defined in libvirt/libvirt-domain.h:1044 + // MigrateParamAutoConvergeIncrement as defined in libvirt/libvirt-domain.h:1057 MigrateParamAutoConvergeIncrement = "auto_converge.increment" - // MigrateParamParallelConnections as defined in libvirt/libvirt-domain.h:1052 + // MigrateParamParallelConnections as defined in libvirt/libvirt-domain.h:1065 MigrateParamParallelConnections = "parallel.connections" - // MigrateParamTLSDestination as defined in libvirt/libvirt-domain.h:1066 + // MigrateParamTLSDestination as defined in libvirt/libvirt-domain.h:1079 MigrateParamTLSDestination = "tls.destination" - // DomainCPUStatsCputime as defined in libvirt/libvirt-domain.h:1326 + // MigrateParamSuseMaxIters as defined in libvirt/libvirt-domain.h:1086 + MigrateParamSuseMaxIters = "max_iters" + // MigrateParamSuseMinRemaining as defined in libvirt/libvirt-domain.h:1092 + MigrateParamSuseMinRemaining = "min_remaining" + // MigrateParamSuseAbortIfBusy as defined in libvirt/libvirt-domain.h:1098 + MigrateParamSuseAbortIfBusy = "abort_if_busy" + // DomainCPUStatsCputime as defined in libvirt/libvirt-domain.h:1358 DomainCPUStatsCputime = "cpu_time" - // DomainCPUStatsUsertime as defined in libvirt/libvirt-domain.h:1332 + // DomainCPUStatsUsertime as defined in libvirt/libvirt-domain.h:1364 DomainCPUStatsUsertime = "user_time" - // DomainCPUStatsSystemtime as defined in libvirt/libvirt-domain.h:1338 + // DomainCPUStatsSystemtime as defined in libvirt/libvirt-domain.h:1370 DomainCPUStatsSystemtime = "system_time" - // DomainCPUStatsVcputime as defined in libvirt/libvirt-domain.h:1345 + // DomainCPUStatsVcputime as defined in libvirt/libvirt-domain.h:1377 DomainCPUStatsVcputime = "vcpu_time" - // DomainBlkioWeight as defined in libvirt/libvirt-domain.h:1374 + // DomainBlkioWeight as defined in libvirt/libvirt-domain.h:1406 DomainBlkioWeight = "weight" - // DomainBlkioDeviceWeight as defined in libvirt/libvirt-domain.h:1384 + // DomainBlkioDeviceWeight as defined in libvirt/libvirt-domain.h:1416 DomainBlkioDeviceWeight = "device_weight" - // DomainBlkioDeviceReadIops as defined in libvirt/libvirt-domain.h:1395 + // DomainBlkioDeviceReadIops as defined in libvirt/libvirt-domain.h:1427 DomainBlkioDeviceReadIops = "device_read_iops_sec" - // DomainBlkioDeviceWriteIops as defined in libvirt/libvirt-domain.h:1406 + // DomainBlkioDeviceWriteIops as defined in libvirt/libvirt-domain.h:1438 DomainBlkioDeviceWriteIops = "device_write_iops_sec" - // DomainBlkioDeviceReadBps as defined in libvirt/libvirt-domain.h:1417 + // DomainBlkioDeviceReadBps as defined in libvirt/libvirt-domain.h:1449 DomainBlkioDeviceReadBps = "device_read_bytes_sec" - // DomainBlkioDeviceWriteBps as defined in libvirt/libvirt-domain.h:1428 + // DomainBlkioDeviceWriteBps as defined in libvirt/libvirt-domain.h:1460 DomainBlkioDeviceWriteBps = "device_write_bytes_sec" - // DomainMemoryParamUnlimited as defined in libvirt/libvirt-domain.h:1447 + // DomainMemoryParamUnlimited as defined in libvirt/libvirt-domain.h:1479 DomainMemoryParamUnlimited = 9007199254740991 - // DomainMemoryHardLimit as defined in libvirt/libvirt-domain.h:1456 + // DomainMemoryHardLimit as defined in libvirt/libvirt-domain.h:1488 DomainMemoryHardLimit = "hard_limit" - // DomainMemorySoftLimit as defined in libvirt/libvirt-domain.h:1465 + // DomainMemorySoftLimit as defined in libvirt/libvirt-domain.h:1497 DomainMemorySoftLimit = "soft_limit" - // DomainMemoryMinGuarantee as defined in libvirt/libvirt-domain.h:1474 + // DomainMemoryMinGuarantee as defined in libvirt/libvirt-domain.h:1506 DomainMemoryMinGuarantee = "min_guarantee" - // DomainMemorySwapHardLimit as defined in libvirt/libvirt-domain.h:1484 + // DomainMemorySwapHardLimit as defined in libvirt/libvirt-domain.h:1516 DomainMemorySwapHardLimit = "swap_hard_limit" - // DomainNumaNodeset as defined in libvirt/libvirt-domain.h:1529 + // DomainNumaNodeset as defined in libvirt/libvirt-domain.h:1561 DomainNumaNodeset = "numa_nodeset" - // DomainNumaMode as defined in libvirt/libvirt-domain.h:1537 + // DomainNumaMode as defined in libvirt/libvirt-domain.h:1569 DomainNumaMode = "numa_mode" - // DomainBandwidthInAverage as defined in libvirt/libvirt-domain.h:1653 + // DomainBandwidthInAverage as defined in libvirt/libvirt-domain.h:1691 DomainBandwidthInAverage = "inbound.average" - // DomainBandwidthInPeak as defined in libvirt/libvirt-domain.h:1660 + // DomainBandwidthInPeak as defined in libvirt/libvirt-domain.h:1698 DomainBandwidthInPeak = "inbound.peak" - // DomainBandwidthInBurst as defined in libvirt/libvirt-domain.h:1667 + // DomainBandwidthInBurst as defined in libvirt/libvirt-domain.h:1705 DomainBandwidthInBurst = "inbound.burst" - // DomainBandwidthInFloor as defined in libvirt/libvirt-domain.h:1674 + // DomainBandwidthInFloor as defined in libvirt/libvirt-domain.h:1712 DomainBandwidthInFloor = "inbound.floor" - // DomainBandwidthOutAverage as defined in libvirt/libvirt-domain.h:1681 + // DomainBandwidthOutAverage as defined in libvirt/libvirt-domain.h:1719 DomainBandwidthOutAverage = "outbound.average" - // DomainBandwidthOutPeak as defined in libvirt/libvirt-domain.h:1688 + // DomainBandwidthOutPeak as defined in libvirt/libvirt-domain.h:1726 DomainBandwidthOutPeak = "outbound.peak" - // DomainBandwidthOutBurst as defined in libvirt/libvirt-domain.h:1695 + // DomainBandwidthOutBurst as defined in libvirt/libvirt-domain.h:1733 DomainBandwidthOutBurst = "outbound.burst" - // DomainIothreadPollMaxNs as defined in libvirt/libvirt-domain.h:1995 + // DomainIothreadPollMaxNs as defined in libvirt/libvirt-domain.h:2038 DomainIothreadPollMaxNs = "poll_max_ns" - // DomainIothreadPollGrow as defined in libvirt/libvirt-domain.h:2005 + // DomainIothreadPollGrow as defined in libvirt/libvirt-domain.h:2048 DomainIothreadPollGrow = "poll_grow" - // DomainIothreadPollShrink as defined in libvirt/libvirt-domain.h:2016 + // DomainIothreadPollShrink as defined in libvirt/libvirt-domain.h:2059 DomainIothreadPollShrink = "poll_shrink" - // PerfParamCmt as defined in libvirt/libvirt-domain.h:2208 + // PerfParamCmt as defined in libvirt/libvirt-domain.h:2251 PerfParamCmt = "cmt" - // PerfParamMbmt as defined in libvirt/libvirt-domain.h:2219 + // PerfParamMbmt as defined in libvirt/libvirt-domain.h:2262 PerfParamMbmt = "mbmt" - // PerfParamMbml as defined in libvirt/libvirt-domain.h:2229 + // PerfParamMbml as defined in libvirt/libvirt-domain.h:2272 PerfParamMbml = "mbml" - // PerfParamCacheMisses as defined in libvirt/libvirt-domain.h:2239 + // PerfParamCacheMisses as defined in libvirt/libvirt-domain.h:2282 PerfParamCacheMisses = "cache_misses" - // PerfParamCacheReferences as defined in libvirt/libvirt-domain.h:2249 + // PerfParamCacheReferences as defined in libvirt/libvirt-domain.h:2292 PerfParamCacheReferences = "cache_references" - // PerfParamInstructions as defined in libvirt/libvirt-domain.h:2259 + // PerfParamInstructions as defined in libvirt/libvirt-domain.h:2302 PerfParamInstructions = "instructions" - // PerfParamCPUCycles as defined in libvirt/libvirt-domain.h:2269 + // PerfParamCPUCycles as defined in libvirt/libvirt-domain.h:2312 PerfParamCPUCycles = "cpu_cycles" - // PerfParamBranchInstructions as defined in libvirt/libvirt-domain.h:2279 + // PerfParamBranchInstructions as defined in libvirt/libvirt-domain.h:2322 PerfParamBranchInstructions = "branch_instructions" - // PerfParamBranchMisses as defined in libvirt/libvirt-domain.h:2289 + // PerfParamBranchMisses as defined in libvirt/libvirt-domain.h:2332 PerfParamBranchMisses = "branch_misses" - // PerfParamBusCycles as defined in libvirt/libvirt-domain.h:2299 + // PerfParamBusCycles as defined in libvirt/libvirt-domain.h:2342 PerfParamBusCycles = "bus_cycles" - // PerfParamStalledCyclesFrontend as defined in libvirt/libvirt-domain.h:2310 + // PerfParamStalledCyclesFrontend as defined in libvirt/libvirt-domain.h:2353 PerfParamStalledCyclesFrontend = "stalled_cycles_frontend" - // PerfParamStalledCyclesBackend as defined in libvirt/libvirt-domain.h:2321 + // PerfParamStalledCyclesBackend as defined in libvirt/libvirt-domain.h:2364 PerfParamStalledCyclesBackend = "stalled_cycles_backend" - // PerfParamRefCPUCycles as defined in libvirt/libvirt-domain.h:2332 + // PerfParamRefCPUCycles as defined in libvirt/libvirt-domain.h:2375 PerfParamRefCPUCycles = "ref_cpu_cycles" - // PerfParamCPUClock as defined in libvirt/libvirt-domain.h:2343 + // PerfParamCPUClock as defined in libvirt/libvirt-domain.h:2386 PerfParamCPUClock = "cpu_clock" - // PerfParamTaskClock as defined in libvirt/libvirt-domain.h:2354 + // PerfParamTaskClock as defined in libvirt/libvirt-domain.h:2397 PerfParamTaskClock = "task_clock" - // PerfParamPageFaults as defined in libvirt/libvirt-domain.h:2364 + // PerfParamPageFaults as defined in libvirt/libvirt-domain.h:2407 PerfParamPageFaults = "page_faults" - // PerfParamContextSwitches as defined in libvirt/libvirt-domain.h:2374 + // PerfParamContextSwitches as defined in libvirt/libvirt-domain.h:2417 PerfParamContextSwitches = "context_switches" - // PerfParamCPUMigrations as defined in libvirt/libvirt-domain.h:2384 + // PerfParamCPUMigrations as defined in libvirt/libvirt-domain.h:2427 PerfParamCPUMigrations = "cpu_migrations" - // PerfParamPageFaultsMin as defined in libvirt/libvirt-domain.h:2394 + // PerfParamPageFaultsMin as defined in libvirt/libvirt-domain.h:2437 PerfParamPageFaultsMin = "page_faults_min" - // PerfParamPageFaultsMaj as defined in libvirt/libvirt-domain.h:2404 + // PerfParamPageFaultsMaj as defined in libvirt/libvirt-domain.h:2447 PerfParamPageFaultsMaj = "page_faults_maj" - // PerfParamAlignmentFaults as defined in libvirt/libvirt-domain.h:2414 + // PerfParamAlignmentFaults as defined in libvirt/libvirt-domain.h:2457 PerfParamAlignmentFaults = "alignment_faults" - // PerfParamEmulationFaults as defined in libvirt/libvirt-domain.h:2424 + // PerfParamEmulationFaults as defined in libvirt/libvirt-domain.h:2467 PerfParamEmulationFaults = "emulation_faults" - // DomainBlockCopyBandwidth as defined in libvirt/libvirt-domain.h:2592 + // DomainBlockCopyBandwidth as defined in libvirt/libvirt-domain.h:2635 DomainBlockCopyBandwidth = "bandwidth" - // DomainBlockCopyGranularity as defined in libvirt/libvirt-domain.h:2603 + // DomainBlockCopyGranularity as defined in libvirt/libvirt-domain.h:2646 DomainBlockCopyGranularity = "granularity" - // DomainBlockCopyBufSize as defined in libvirt/libvirt-domain.h:2612 + // DomainBlockCopyBufSize as defined in libvirt/libvirt-domain.h:2655 DomainBlockCopyBufSize = "buf-size" - // DomainBlockIotuneTotalBytesSec as defined in libvirt/libvirt-domain.h:2653 + // DomainBlockIotuneTotalBytesSec as defined in libvirt/libvirt-domain.h:2696 DomainBlockIotuneTotalBytesSec = "total_bytes_sec" - // DomainBlockIotuneReadBytesSec as defined in libvirt/libvirt-domain.h:2661 + // DomainBlockIotuneReadBytesSec as defined in libvirt/libvirt-domain.h:2704 DomainBlockIotuneReadBytesSec = "read_bytes_sec" - // DomainBlockIotuneWriteBytesSec as defined in libvirt/libvirt-domain.h:2669 + // DomainBlockIotuneWriteBytesSec as defined in libvirt/libvirt-domain.h:2712 DomainBlockIotuneWriteBytesSec = "write_bytes_sec" - // DomainBlockIotuneTotalIopsSec as defined in libvirt/libvirt-domain.h:2677 + // DomainBlockIotuneTotalIopsSec as defined in libvirt/libvirt-domain.h:2720 DomainBlockIotuneTotalIopsSec = "total_iops_sec" - // DomainBlockIotuneReadIopsSec as defined in libvirt/libvirt-domain.h:2685 + // DomainBlockIotuneReadIopsSec as defined in libvirt/libvirt-domain.h:2728 DomainBlockIotuneReadIopsSec = "read_iops_sec" - // DomainBlockIotuneWriteIopsSec as defined in libvirt/libvirt-domain.h:2692 + // DomainBlockIotuneWriteIopsSec as defined in libvirt/libvirt-domain.h:2735 DomainBlockIotuneWriteIopsSec = "write_iops_sec" - // DomainBlockIotuneTotalBytesSecMax as defined in libvirt/libvirt-domain.h:2700 + // DomainBlockIotuneTotalBytesSecMax as defined in libvirt/libvirt-domain.h:2743 DomainBlockIotuneTotalBytesSecMax = "total_bytes_sec_max" - // DomainBlockIotuneReadBytesSecMax as defined in libvirt/libvirt-domain.h:2708 + // DomainBlockIotuneReadBytesSecMax as defined in libvirt/libvirt-domain.h:2751 DomainBlockIotuneReadBytesSecMax = "read_bytes_sec_max" - // DomainBlockIotuneWriteBytesSecMax as defined in libvirt/libvirt-domain.h:2716 + // DomainBlockIotuneWriteBytesSecMax as defined in libvirt/libvirt-domain.h:2759 DomainBlockIotuneWriteBytesSecMax = "write_bytes_sec_max" - // DomainBlockIotuneTotalIopsSecMax as defined in libvirt/libvirt-domain.h:2724 + // DomainBlockIotuneTotalIopsSecMax as defined in libvirt/libvirt-domain.h:2767 DomainBlockIotuneTotalIopsSecMax = "total_iops_sec_max" - // DomainBlockIotuneReadIopsSecMax as defined in libvirt/libvirt-domain.h:2732 + // DomainBlockIotuneReadIopsSecMax as defined in libvirt/libvirt-domain.h:2775 DomainBlockIotuneReadIopsSecMax = "read_iops_sec_max" - // DomainBlockIotuneWriteIopsSecMax as defined in libvirt/libvirt-domain.h:2739 + // DomainBlockIotuneWriteIopsSecMax as defined in libvirt/libvirt-domain.h:2782 DomainBlockIotuneWriteIopsSecMax = "write_iops_sec_max" - // DomainBlockIotuneTotalBytesSecMaxLength as defined in libvirt/libvirt-domain.h:2747 + // DomainBlockIotuneTotalBytesSecMaxLength as defined in libvirt/libvirt-domain.h:2790 DomainBlockIotuneTotalBytesSecMaxLength = "total_bytes_sec_max_length" - // DomainBlockIotuneReadBytesSecMaxLength as defined in libvirt/libvirt-domain.h:2755 + // DomainBlockIotuneReadBytesSecMaxLength as defined in libvirt/libvirt-domain.h:2798 DomainBlockIotuneReadBytesSecMaxLength = "read_bytes_sec_max_length" - // DomainBlockIotuneWriteBytesSecMaxLength as defined in libvirt/libvirt-domain.h:2763 + // DomainBlockIotuneWriteBytesSecMaxLength as defined in libvirt/libvirt-domain.h:2806 DomainBlockIotuneWriteBytesSecMaxLength = "write_bytes_sec_max_length" - // DomainBlockIotuneTotalIopsSecMaxLength as defined in libvirt/libvirt-domain.h:2771 + // DomainBlockIotuneTotalIopsSecMaxLength as defined in libvirt/libvirt-domain.h:2814 DomainBlockIotuneTotalIopsSecMaxLength = "total_iops_sec_max_length" - // DomainBlockIotuneReadIopsSecMaxLength as defined in libvirt/libvirt-domain.h:2779 + // DomainBlockIotuneReadIopsSecMaxLength as defined in libvirt/libvirt-domain.h:2822 DomainBlockIotuneReadIopsSecMaxLength = "read_iops_sec_max_length" - // DomainBlockIotuneWriteIopsSecMaxLength as defined in libvirt/libvirt-domain.h:2787 + // DomainBlockIotuneWriteIopsSecMaxLength as defined in libvirt/libvirt-domain.h:2830 DomainBlockIotuneWriteIopsSecMaxLength = "write_iops_sec_max_length" - // DomainBlockIotuneSizeIopsSec as defined in libvirt/libvirt-domain.h:2794 + // DomainBlockIotuneSizeIopsSec as defined in libvirt/libvirt-domain.h:2837 DomainBlockIotuneSizeIopsSec = "size_iops_sec" - // DomainBlockIotuneGroupName as defined in libvirt/libvirt-domain.h:2801 + // DomainBlockIotuneGroupName as defined in libvirt/libvirt-domain.h:2844 DomainBlockIotuneGroupName = "group_name" - // KeycodeSetRfb as defined in libvirt/libvirt-domain.h:2882 + // KeycodeSetRfb as defined in libvirt/libvirt-domain.h:2925 KeycodeSetRfb = 0 - // DomainSendKeyMaxKeys as defined in libvirt/libvirt-domain.h:2889 + // DomainSendKeyMaxKeys as defined in libvirt/libvirt-domain.h:2932 DomainSendKeyMaxKeys = 16 - // DomainJobOperationStr as defined in libvirt/libvirt-domain.h:3304 + // DomainJobOperationStr as defined in libvirt/libvirt-domain.h:3406 DomainJobOperationStr = "operation" - // DomainJobTimeElapsed as defined in libvirt/libvirt-domain.h:3314 + // DomainJobTimeElapsed as defined in libvirt/libvirt-domain.h:3416 DomainJobTimeElapsed = "time_elapsed" - // DomainJobTimeElapsedNet as defined in libvirt/libvirt-domain.h:3324 + // DomainJobTimeElapsedNet as defined in libvirt/libvirt-domain.h:3426 DomainJobTimeElapsedNet = "time_elapsed_net" - // DomainJobTimeRemaining as defined in libvirt/libvirt-domain.h:3334 + // DomainJobTimeRemaining as defined in libvirt/libvirt-domain.h:3436 DomainJobTimeRemaining = "time_remaining" - // DomainJobDowntime as defined in libvirt/libvirt-domain.h:3344 + // DomainJobDowntime as defined in libvirt/libvirt-domain.h:3446 DomainJobDowntime = "downtime" - // DomainJobDowntimeNet as defined in libvirt/libvirt-domain.h:3353 + // DomainJobDowntimeNet as defined in libvirt/libvirt-domain.h:3455 DomainJobDowntimeNet = "downtime_net" - // DomainJobSetupTime as defined in libvirt/libvirt-domain.h:3362 + // DomainJobSetupTime as defined in libvirt/libvirt-domain.h:3464 DomainJobSetupTime = "setup_time" - // DomainJobDataTotal as defined in libvirt/libvirt-domain.h:3377 + // DomainJobDataTotal as defined in libvirt/libvirt-domain.h:3479 DomainJobDataTotal = "data_total" - // DomainJobDataProcessed as defined in libvirt/libvirt-domain.h:3387 + // DomainJobDataProcessed as defined in libvirt/libvirt-domain.h:3489 DomainJobDataProcessed = "data_processed" - // DomainJobDataRemaining as defined in libvirt/libvirt-domain.h:3397 + // DomainJobDataRemaining as defined in libvirt/libvirt-domain.h:3499 DomainJobDataRemaining = "data_remaining" - // DomainJobMemoryTotal as defined in libvirt/libvirt-domain.h:3407 + // DomainJobMemoryTotal as defined in libvirt/libvirt-domain.h:3509 DomainJobMemoryTotal = "memory_total" - // DomainJobMemoryProcessed as defined in libvirt/libvirt-domain.h:3417 + // DomainJobMemoryProcessed as defined in libvirt/libvirt-domain.h:3519 DomainJobMemoryProcessed = "memory_processed" - // DomainJobMemoryRemaining as defined in libvirt/libvirt-domain.h:3427 + // DomainJobMemoryRemaining as defined in libvirt/libvirt-domain.h:3529 DomainJobMemoryRemaining = "memory_remaining" - // DomainJobMemoryConstant as defined in libvirt/libvirt-domain.h:3439 + // DomainJobMemoryConstant as defined in libvirt/libvirt-domain.h:3541 DomainJobMemoryConstant = "memory_constant" - // DomainJobMemoryNormal as defined in libvirt/libvirt-domain.h:3449 + // DomainJobMemoryNormal as defined in libvirt/libvirt-domain.h:3551 DomainJobMemoryNormal = "memory_normal" - // DomainJobMemoryNormalBytes as defined in libvirt/libvirt-domain.h:3459 + // DomainJobMemoryNormalBytes as defined in libvirt/libvirt-domain.h:3561 DomainJobMemoryNormalBytes = "memory_normal_bytes" - // DomainJobMemoryBps as defined in libvirt/libvirt-domain.h:3467 + // DomainJobMemoryBps as defined in libvirt/libvirt-domain.h:3569 DomainJobMemoryBps = "memory_bps" - // DomainJobMemoryDirtyRate as defined in libvirt/libvirt-domain.h:3475 + // DomainJobMemoryDirtyRate as defined in libvirt/libvirt-domain.h:3577 DomainJobMemoryDirtyRate = "memory_dirty_rate" - // DomainJobMemoryPageSize as defined in libvirt/libvirt-domain.h:3486 + // DomainJobMemoryPageSize as defined in libvirt/libvirt-domain.h:3588 DomainJobMemoryPageSize = "memory_page_size" - // DomainJobMemoryIteration as defined in libvirt/libvirt-domain.h:3497 + // DomainJobMemoryIteration as defined in libvirt/libvirt-domain.h:3599 DomainJobMemoryIteration = "memory_iteration" - // DomainJobMemoryPostcopyReqs as defined in libvirt/libvirt-domain.h:3507 + // DomainJobMemoryPostcopyReqs as defined in libvirt/libvirt-domain.h:3609 DomainJobMemoryPostcopyReqs = "memory_postcopy_requests" - // DomainJobDiskTotal as defined in libvirt/libvirt-domain.h:3517 + // DomainJobDiskTotal as defined in libvirt/libvirt-domain.h:3619 DomainJobDiskTotal = "disk_total" - // DomainJobDiskProcessed as defined in libvirt/libvirt-domain.h:3527 + // DomainJobDiskProcessed as defined in libvirt/libvirt-domain.h:3629 DomainJobDiskProcessed = "disk_processed" - // DomainJobDiskRemaining as defined in libvirt/libvirt-domain.h:3537 + // DomainJobDiskRemaining as defined in libvirt/libvirt-domain.h:3639 DomainJobDiskRemaining = "disk_remaining" - // DomainJobDiskBps as defined in libvirt/libvirt-domain.h:3545 + // DomainJobDiskBps as defined in libvirt/libvirt-domain.h:3647 DomainJobDiskBps = "disk_bps" - // DomainJobCompressionCache as defined in libvirt/libvirt-domain.h:3554 + // DomainJobCompressionCache as defined in libvirt/libvirt-domain.h:3656 DomainJobCompressionCache = "compression_cache" - // DomainJobCompressionBytes as defined in libvirt/libvirt-domain.h:3562 + // DomainJobCompressionBytes as defined in libvirt/libvirt-domain.h:3664 DomainJobCompressionBytes = "compression_bytes" - // DomainJobCompressionPages as defined in libvirt/libvirt-domain.h:3570 + // DomainJobCompressionPages as defined in libvirt/libvirt-domain.h:3672 DomainJobCompressionPages = "compression_pages" - // DomainJobCompressionCacheMisses as defined in libvirt/libvirt-domain.h:3579 + // DomainJobCompressionCacheMisses as defined in libvirt/libvirt-domain.h:3681 DomainJobCompressionCacheMisses = "compression_cache_misses" - // DomainJobCompressionOverflow as defined in libvirt/libvirt-domain.h:3589 + // DomainJobCompressionOverflow as defined in libvirt/libvirt-domain.h:3691 DomainJobCompressionOverflow = "compression_overflow" - // DomainJobAutoConvergeThrottle as defined in libvirt/libvirt-domain.h:3598 + // DomainJobAutoConvergeThrottle as defined in libvirt/libvirt-domain.h:3700 DomainJobAutoConvergeThrottle = "auto_converge_throttle" - // DomainJobSuccess as defined in libvirt/libvirt-domain.h:3606 + // DomainJobSuccess as defined in libvirt/libvirt-domain.h:3708 DomainJobSuccess = "success" - // DomainJobDiskTempUsed as defined in libvirt/libvirt-domain.h:3613 + // DomainJobErrmsg as defined in libvirt/libvirt-domain.h:3716 + DomainJobErrmsg = "errmsg" + // DomainJobDiskTempUsed as defined in libvirt/libvirt-domain.h:3724 DomainJobDiskTempUsed = "disk_temp_used" - // DomainJobDiskTempTotal as defined in libvirt/libvirt-domain.h:3620 + // DomainJobDiskTempTotal as defined in libvirt/libvirt-domain.h:3731 DomainJobDiskTempTotal = "disk_temp_total" - // DomainTunableCPUVcpupin as defined in libvirt/libvirt-domain.h:4175 + // DomainTunableCPUVcpupin as defined in libvirt/libvirt-domain.h:4286 DomainTunableCPUVcpupin = "cputune.vcpupin%u" - // DomainTunableCPUEmulatorpin as defined in libvirt/libvirt-domain.h:4183 + // DomainTunableCPUEmulatorpin as defined in libvirt/libvirt-domain.h:4294 DomainTunableCPUEmulatorpin = "cputune.emulatorpin" - // DomainTunableCPUIothreadspin as defined in libvirt/libvirt-domain.h:4192 + // DomainTunableCPUIothreadspin as defined in libvirt/libvirt-domain.h:4303 DomainTunableCPUIothreadspin = "cputune.iothreadpin%u" - // DomainTunableCPUCpuShares as defined in libvirt/libvirt-domain.h:4200 + // DomainTunableCPUCpuShares as defined in libvirt/libvirt-domain.h:4311 DomainTunableCPUCpuShares = "cputune.cpu_shares" - // DomainTunableCPUGlobalPeriod as defined in libvirt/libvirt-domain.h:4208 + // DomainTunableCPUGlobalPeriod as defined in libvirt/libvirt-domain.h:4319 DomainTunableCPUGlobalPeriod = "cputune.global_period" - // DomainTunableCPUGlobalQuota as defined in libvirt/libvirt-domain.h:4216 + // DomainTunableCPUGlobalQuota as defined in libvirt/libvirt-domain.h:4327 DomainTunableCPUGlobalQuota = "cputune.global_quota" - // DomainTunableCPUVCPUPeriod as defined in libvirt/libvirt-domain.h:4224 + // DomainTunableCPUVCPUPeriod as defined in libvirt/libvirt-domain.h:4335 DomainTunableCPUVCPUPeriod = "cputune.vcpu_period" - // DomainTunableCPUVCPUQuota as defined in libvirt/libvirt-domain.h:4232 + // DomainTunableCPUVCPUQuota as defined in libvirt/libvirt-domain.h:4343 DomainTunableCPUVCPUQuota = "cputune.vcpu_quota" - // DomainTunableCPUEmulatorPeriod as defined in libvirt/libvirt-domain.h:4241 + // DomainTunableCPUEmulatorPeriod as defined in libvirt/libvirt-domain.h:4352 DomainTunableCPUEmulatorPeriod = "cputune.emulator_period" - // DomainTunableCPUEmulatorQuota as defined in libvirt/libvirt-domain.h:4250 + // DomainTunableCPUEmulatorQuota as defined in libvirt/libvirt-domain.h:4361 DomainTunableCPUEmulatorQuota = "cputune.emulator_quota" - // DomainTunableCPUIothreadPeriod as defined in libvirt/libvirt-domain.h:4258 + // DomainTunableCPUIothreadPeriod as defined in libvirt/libvirt-domain.h:4369 DomainTunableCPUIothreadPeriod = "cputune.iothread_period" - // DomainTunableCPUIothreadQuota as defined in libvirt/libvirt-domain.h:4266 + // DomainTunableCPUIothreadQuota as defined in libvirt/libvirt-domain.h:4377 DomainTunableCPUIothreadQuota = "cputune.iothread_quota" - // DomainTunableBlkdevDisk as defined in libvirt/libvirt-domain.h:4274 + // DomainTunableBlkdevDisk as defined in libvirt/libvirt-domain.h:4385 DomainTunableBlkdevDisk = "blkdeviotune.disk" - // DomainTunableBlkdevTotalBytesSec as defined in libvirt/libvirt-domain.h:4282 + // DomainTunableBlkdevTotalBytesSec as defined in libvirt/libvirt-domain.h:4393 DomainTunableBlkdevTotalBytesSec = "blkdeviotune.total_bytes_sec" - // DomainTunableBlkdevReadBytesSec as defined in libvirt/libvirt-domain.h:4290 + // DomainTunableBlkdevReadBytesSec as defined in libvirt/libvirt-domain.h:4401 DomainTunableBlkdevReadBytesSec = "blkdeviotune.read_bytes_sec" - // DomainTunableBlkdevWriteBytesSec as defined in libvirt/libvirt-domain.h:4298 + // DomainTunableBlkdevWriteBytesSec as defined in libvirt/libvirt-domain.h:4409 DomainTunableBlkdevWriteBytesSec = "blkdeviotune.write_bytes_sec" - // DomainTunableBlkdevTotalIopsSec as defined in libvirt/libvirt-domain.h:4306 + // DomainTunableBlkdevTotalIopsSec as defined in libvirt/libvirt-domain.h:4417 DomainTunableBlkdevTotalIopsSec = "blkdeviotune.total_iops_sec" - // DomainTunableBlkdevReadIopsSec as defined in libvirt/libvirt-domain.h:4314 + // DomainTunableBlkdevReadIopsSec as defined in libvirt/libvirt-domain.h:4425 DomainTunableBlkdevReadIopsSec = "blkdeviotune.read_iops_sec" - // DomainTunableBlkdevWriteIopsSec as defined in libvirt/libvirt-domain.h:4322 + // DomainTunableBlkdevWriteIopsSec as defined in libvirt/libvirt-domain.h:4433 DomainTunableBlkdevWriteIopsSec = "blkdeviotune.write_iops_sec" - // DomainTunableBlkdevTotalBytesSecMax as defined in libvirt/libvirt-domain.h:4330 + // DomainTunableBlkdevTotalBytesSecMax as defined in libvirt/libvirt-domain.h:4441 DomainTunableBlkdevTotalBytesSecMax = "blkdeviotune.total_bytes_sec_max" - // DomainTunableBlkdevReadBytesSecMax as defined in libvirt/libvirt-domain.h:4338 + // DomainTunableBlkdevReadBytesSecMax as defined in libvirt/libvirt-domain.h:4449 DomainTunableBlkdevReadBytesSecMax = "blkdeviotune.read_bytes_sec_max" - // DomainTunableBlkdevWriteBytesSecMax as defined in libvirt/libvirt-domain.h:4346 + // DomainTunableBlkdevWriteBytesSecMax as defined in libvirt/libvirt-domain.h:4457 DomainTunableBlkdevWriteBytesSecMax = "blkdeviotune.write_bytes_sec_max" - // DomainTunableBlkdevTotalIopsSecMax as defined in libvirt/libvirt-domain.h:4354 + // DomainTunableBlkdevTotalIopsSecMax as defined in libvirt/libvirt-domain.h:4465 DomainTunableBlkdevTotalIopsSecMax = "blkdeviotune.total_iops_sec_max" - // DomainTunableBlkdevReadIopsSecMax as defined in libvirt/libvirt-domain.h:4362 + // DomainTunableBlkdevReadIopsSecMax as defined in libvirt/libvirt-domain.h:4473 DomainTunableBlkdevReadIopsSecMax = "blkdeviotune.read_iops_sec_max" - // DomainTunableBlkdevWriteIopsSecMax as defined in libvirt/libvirt-domain.h:4370 + // DomainTunableBlkdevWriteIopsSecMax as defined in libvirt/libvirt-domain.h:4481 DomainTunableBlkdevWriteIopsSecMax = "blkdeviotune.write_iops_sec_max" - // DomainTunableBlkdevSizeIopsSec as defined in libvirt/libvirt-domain.h:4378 + // DomainTunableBlkdevSizeIopsSec as defined in libvirt/libvirt-domain.h:4489 DomainTunableBlkdevSizeIopsSec = "blkdeviotune.size_iops_sec" - // DomainTunableBlkdevGroupName as defined in libvirt/libvirt-domain.h:4386 + // DomainTunableBlkdevGroupName as defined in libvirt/libvirt-domain.h:4497 DomainTunableBlkdevGroupName = "blkdeviotune.group_name" - // DomainTunableBlkdevTotalBytesSecMaxLength as defined in libvirt/libvirt-domain.h:4395 + // DomainTunableBlkdevTotalBytesSecMaxLength as defined in libvirt/libvirt-domain.h:4506 DomainTunableBlkdevTotalBytesSecMaxLength = "blkdeviotune.total_bytes_sec_max_length" - // DomainTunableBlkdevReadBytesSecMaxLength as defined in libvirt/libvirt-domain.h:4404 + // DomainTunableBlkdevReadBytesSecMaxLength as defined in libvirt/libvirt-domain.h:4515 DomainTunableBlkdevReadBytesSecMaxLength = "blkdeviotune.read_bytes_sec_max_length" - // DomainTunableBlkdevWriteBytesSecMaxLength as defined in libvirt/libvirt-domain.h:4413 + // DomainTunableBlkdevWriteBytesSecMaxLength as defined in libvirt/libvirt-domain.h:4524 DomainTunableBlkdevWriteBytesSecMaxLength = "blkdeviotune.write_bytes_sec_max_length" - // DomainTunableBlkdevTotalIopsSecMaxLength as defined in libvirt/libvirt-domain.h:4422 + // DomainTunableBlkdevTotalIopsSecMaxLength as defined in libvirt/libvirt-domain.h:4533 DomainTunableBlkdevTotalIopsSecMaxLength = "blkdeviotune.total_iops_sec_max_length" - // DomainTunableBlkdevReadIopsSecMaxLength as defined in libvirt/libvirt-domain.h:4431 + // DomainTunableBlkdevReadIopsSecMaxLength as defined in libvirt/libvirt-domain.h:4542 DomainTunableBlkdevReadIopsSecMaxLength = "blkdeviotune.read_iops_sec_max_length" - // DomainTunableBlkdevWriteIopsSecMaxLength as defined in libvirt/libvirt-domain.h:4440 + // DomainTunableBlkdevWriteIopsSecMaxLength as defined in libvirt/libvirt-domain.h:4551 DomainTunableBlkdevWriteIopsSecMaxLength = "blkdeviotune.write_iops_sec_max_length" - // DomainSchedFieldLength as defined in libvirt/libvirt-domain.h:4728 + // DomainSchedFieldLength as defined in libvirt/libvirt-domain.h:4865 DomainSchedFieldLength = 80 - // DomainBlkioFieldLength as defined in libvirt/libvirt-domain.h:4772 + // DomainBlkioFieldLength as defined in libvirt/libvirt-domain.h:4909 DomainBlkioFieldLength = 80 - // DomainMemoryFieldLength as defined in libvirt/libvirt-domain.h:4816 + // DomainMemoryFieldLength as defined in libvirt/libvirt-domain.h:4953 DomainMemoryFieldLength = 80 - // DomainLaunchSecuritySevMeasurement as defined in libvirt/libvirt-domain.h:4942 + // DomainLaunchSecuritySevMeasurement as defined in libvirt/libvirt-domain.h:5079 DomainLaunchSecuritySevMeasurement = "sev-measurement" // NetworkPortBandwidthInAverage as defined in libvirt/libvirt-network.h:391 NetworkPortBandwidthInAverage = "inbound.average" @@ -586,27 +596,28 @@ const ( CPUCompareSuperset CPUCompareResult = 2 ) -// ConnectCompareCPUFlags as declared in libvirt/libvirt-host.h:757 +// ConnectCompareCPUFlags as declared in libvirt/libvirt-host.h:759 type ConnectCompareCPUFlags int32 -// ConnectCompareCPUFlags enumeration from libvirt/libvirt-host.h:757 +// ConnectCompareCPUFlags enumeration from libvirt/libvirt-host.h:759 const ( ConnectCompareCPUFailIncompatible ConnectCompareCPUFlags = 1 + ConnectCompareCPUValidateXML ConnectCompareCPUFlags = 2 ) -// ConnectBaselineCPUFlags as declared in libvirt/libvirt-host.h:783 +// ConnectBaselineCPUFlags as declared in libvirt/libvirt-host.h:785 type ConnectBaselineCPUFlags int32 -// ConnectBaselineCPUFlags enumeration from libvirt/libvirt-host.h:783 +// ConnectBaselineCPUFlags enumeration from libvirt/libvirt-host.h:785 const ( ConnectBaselineCPUExpandFeatures ConnectBaselineCPUFlags = 1 ConnectBaselineCPUMigratable ConnectBaselineCPUFlags = 2 ) -// NodeAllocPagesFlags as declared in libvirt/libvirt-host.h:813 +// NodeAllocPagesFlags as declared in libvirt/libvirt-host.h:815 type NodeAllocPagesFlags int32 -// NodeAllocPagesFlags enumeration from libvirt/libvirt-host.h:813 +// NodeAllocPagesFlags enumeration from libvirt/libvirt-host.h:815 const ( NodeAllocPagesAdd NodeAllocPagesFlags = iota NodeAllocPagesSet NodeAllocPagesFlags = 1 @@ -846,18 +857,18 @@ const ( MigrateParallel DomainMigrateFlags = 131072 ) -// DomainMigrateMaxSpeedFlags as declared in libvirt/libvirt-domain.h:1118 +// DomainMigrateMaxSpeedFlags as declared in libvirt/libvirt-domain.h:1150 type DomainMigrateMaxSpeedFlags int32 -// DomainMigrateMaxSpeedFlags enumeration from libvirt/libvirt-domain.h:1118 +// DomainMigrateMaxSpeedFlags enumeration from libvirt/libvirt-domain.h:1150 const ( DomainMigrateMaxSpeedPostcopy DomainMigrateMaxSpeedFlags = 1 ) -// DomainShutdownFlagValues as declared in libvirt/libvirt-domain.h:1184 +// DomainShutdownFlagValues as declared in libvirt/libvirt-domain.h:1216 type DomainShutdownFlagValues int32 -// DomainShutdownFlagValues enumeration from libvirt/libvirt-domain.h:1184 +// DomainShutdownFlagValues enumeration from libvirt/libvirt-domain.h:1216 const ( DomainShutdownDefault DomainShutdownFlagValues = iota DomainShutdownAcpiPowerBtn DomainShutdownFlagValues = 1 @@ -867,10 +878,10 @@ const ( DomainShutdownParavirt DomainShutdownFlagValues = 16 ) -// DomainRebootFlagValues as declared in libvirt/libvirt-domain.h:1197 +// DomainRebootFlagValues as declared in libvirt/libvirt-domain.h:1229 type DomainRebootFlagValues int32 -// DomainRebootFlagValues enumeration from libvirt/libvirt-domain.h:1197 +// DomainRebootFlagValues enumeration from libvirt/libvirt-domain.h:1229 const ( DomainRebootDefault DomainRebootFlagValues = iota DomainRebootAcpiPowerBtn DomainRebootFlagValues = 1 @@ -880,29 +891,29 @@ const ( DomainRebootParavirt DomainRebootFlagValues = 16 ) -// DomainDestroyFlagsValues as declared in libvirt/libvirt-domain.h:1215 +// DomainDestroyFlagsValues as declared in libvirt/libvirt-domain.h:1247 type DomainDestroyFlagsValues int32 -// DomainDestroyFlagsValues enumeration from libvirt/libvirt-domain.h:1215 +// DomainDestroyFlagsValues enumeration from libvirt/libvirt-domain.h:1247 const ( DomainDestroyDefault DomainDestroyFlagsValues = iota DomainDestroyGraceful DomainDestroyFlagsValues = 1 ) -// DomainSaveRestoreFlags as declared in libvirt/libvirt-domain.h:1247 +// DomainSaveRestoreFlags as declared in libvirt/libvirt-domain.h:1279 type DomainSaveRestoreFlags int32 -// DomainSaveRestoreFlags enumeration from libvirt/libvirt-domain.h:1247 +// DomainSaveRestoreFlags enumeration from libvirt/libvirt-domain.h:1279 const ( DomainSaveBypassCache DomainSaveRestoreFlags = 1 DomainSaveRunning DomainSaveRestoreFlags = 2 DomainSavePaused DomainSaveRestoreFlags = 4 ) -// DomainMemoryModFlags as declared in libvirt/libvirt-domain.h:1503 +// DomainMemoryModFlags as declared in libvirt/libvirt-domain.h:1535 type DomainMemoryModFlags int32 -// DomainMemoryModFlags enumeration from libvirt/libvirt-domain.h:1503 +// DomainMemoryModFlags enumeration from libvirt/libvirt-domain.h:1535 const ( DomainMemCurrent DomainMemoryModFlags = iota DomainMemLive DomainMemoryModFlags = 1 @@ -910,30 +921,39 @@ const ( DomainMemMaximum DomainMemoryModFlags = 4 ) -// DomainNumatuneMemMode as declared in libvirt/libvirt-domain.h:1521 +// DomainNumatuneMemMode as declared in libvirt/libvirt-domain.h:1553 type DomainNumatuneMemMode int32 -// DomainNumatuneMemMode enumeration from libvirt/libvirt-domain.h:1521 +// DomainNumatuneMemMode enumeration from libvirt/libvirt-domain.h:1553 const ( DomainNumatuneMemStrict DomainNumatuneMemMode = iota DomainNumatuneMemPreferred DomainNumatuneMemMode = 1 DomainNumatuneMemInterleave DomainNumatuneMemMode = 2 ) -// DomainMetadataType as declared in libvirt/libvirt-domain.h:1583 +// DomainGetHostnameFlags as declared in libvirt/libvirt-domain.h:1606 +type DomainGetHostnameFlags int32 + +// DomainGetHostnameFlags enumeration from libvirt/libvirt-domain.h:1606 +const ( + DomainGetHostnameLease DomainGetHostnameFlags = 1 + DomainGetHostnameAgent DomainGetHostnameFlags = 2 +) + +// DomainMetadataType as declared in libvirt/libvirt-domain.h:1621 type DomainMetadataType int32 -// DomainMetadataType enumeration from libvirt/libvirt-domain.h:1583 +// DomainMetadataType enumeration from libvirt/libvirt-domain.h:1621 const ( DomainMetadataDescription DomainMetadataType = iota DomainMetadataTitle DomainMetadataType = 1 DomainMetadataElement DomainMetadataType = 2 ) -// DomainXMLFlags as declared in libvirt/libvirt-domain.h:1613 +// DomainXMLFlags as declared in libvirt/libvirt-domain.h:1651 type DomainXMLFlags int32 -// DomainXMLFlags enumeration from libvirt/libvirt-domain.h:1613 +// DomainXMLFlags enumeration from libvirt/libvirt-domain.h:1651 const ( DomainXMLSecure DomainXMLFlags = 1 DomainXMLInactive DomainXMLFlags = 2 @@ -941,43 +961,43 @@ const ( DomainXMLMigratable DomainXMLFlags = 8 ) -// DomainSaveImageXMLFlags as declared in libvirt/libvirt-domain.h:1617 +// DomainSaveImageXMLFlags as declared in libvirt/libvirt-domain.h:1655 type DomainSaveImageXMLFlags int32 -// DomainSaveImageXMLFlags enumeration from libvirt/libvirt-domain.h:1617 +// DomainSaveImageXMLFlags enumeration from libvirt/libvirt-domain.h:1655 const ( DomainSaveImageXMLSecure DomainSaveImageXMLFlags = 1 ) -// DomainBlockResizeFlags as declared in libvirt/libvirt-domain.h:1722 +// DomainBlockResizeFlags as declared in libvirt/libvirt-domain.h:1760 type DomainBlockResizeFlags int32 -// DomainBlockResizeFlags enumeration from libvirt/libvirt-domain.h:1722 +// DomainBlockResizeFlags enumeration from libvirt/libvirt-domain.h:1760 const ( DomainBlockResizeBytes DomainBlockResizeFlags = 1 ) -// DomainMemoryFlags as declared in libvirt/libvirt-domain.h:1785 +// DomainMemoryFlags as declared in libvirt/libvirt-domain.h:1823 type DomainMemoryFlags int32 -// DomainMemoryFlags enumeration from libvirt/libvirt-domain.h:1785 +// DomainMemoryFlags enumeration from libvirt/libvirt-domain.h:1823 const ( MemoryVirtual DomainMemoryFlags = 1 MemoryPhysical DomainMemoryFlags = 2 ) -// DomainDefineFlags as declared in libvirt/libvirt-domain.h:1795 +// DomainDefineFlags as declared in libvirt/libvirt-domain.h:1833 type DomainDefineFlags int32 -// DomainDefineFlags enumeration from libvirt/libvirt-domain.h:1795 +// DomainDefineFlags enumeration from libvirt/libvirt-domain.h:1833 const ( DomainDefineValidate DomainDefineFlags = 1 ) -// DomainUndefineFlagsValues as declared in libvirt/libvirt-domain.h:1822 +// DomainUndefineFlagsValues as declared in libvirt/libvirt-domain.h:1860 type DomainUndefineFlagsValues int32 -// DomainUndefineFlagsValues enumeration from libvirt/libvirt-domain.h:1822 +// DomainUndefineFlagsValues enumeration from libvirt/libvirt-domain.h:1860 const ( DomainUndefineManagedSave DomainUndefineFlagsValues = 1 DomainUndefineSnapshotsMetadata DomainUndefineFlagsValues = 2 @@ -986,10 +1006,10 @@ const ( DomainUndefineCheckpointsMetadata DomainUndefineFlagsValues = 16 ) -// ConnectListAllDomainsFlags as declared in libvirt/libvirt-domain.h:1861 +// ConnectListAllDomainsFlags as declared in libvirt/libvirt-domain.h:1899 type ConnectListAllDomainsFlags int32 -// ConnectListAllDomainsFlags enumeration from libvirt/libvirt-domain.h:1861 +// ConnectListAllDomainsFlags enumeration from libvirt/libvirt-domain.h:1899 const ( ConnectListDomainsActive ConnectListAllDomainsFlags = 1 ConnectListDomainsInactive ConnectListAllDomainsFlags = 2 @@ -1009,20 +1029,29 @@ const ( ConnectListDomainsNoCheckpoint ConnectListAllDomainsFlags = 32768 ) -// VCPUState as declared in libvirt/libvirt-domain.h:1892 +// VCPUState as declared in libvirt/libvirt-domain.h:1930 type VCPUState int32 -// VCPUState enumeration from libvirt/libvirt-domain.h:1892 +// VCPUState enumeration from libvirt/libvirt-domain.h:1930 const ( VCPUOffline VCPUState = iota VCPURunning VCPUState = 1 VCPUBlocked VCPUState = 2 ) -// DomainVCPUFlags as declared in libvirt/libvirt-domain.h:1914 +// VCPUHostCPUState as declared in libvirt/libvirt-domain.h:1935 +type VCPUHostCPUState int32 + +// VCPUHostCPUState enumeration from libvirt/libvirt-domain.h:1935 +const ( + VCPUInfoCPUOffline VCPUHostCPUState = -1 + VCPUInfoCPUUnavailable VCPUHostCPUState = -2 +) + +// DomainVCPUFlags as declared in libvirt/libvirt-domain.h:1957 type DomainVCPUFlags int32 -// DomainVCPUFlags enumeration from libvirt/libvirt-domain.h:1914 +// DomainVCPUFlags enumeration from libvirt/libvirt-domain.h:1957 const ( DomainVCPUCurrent DomainVCPUFlags = iota DomainVCPULive DomainVCPUFlags = 1 @@ -1032,10 +1061,10 @@ const ( DomainVCPUHotpluggable DomainVCPUFlags = 16 ) -// DomainDeviceModifyFlags as declared in libvirt/libvirt-domain.h:2131 +// DomainDeviceModifyFlags as declared in libvirt/libvirt-domain.h:2174 type DomainDeviceModifyFlags int32 -// DomainDeviceModifyFlags enumeration from libvirt/libvirt-domain.h:2131 +// DomainDeviceModifyFlags enumeration from libvirt/libvirt-domain.h:2174 const ( DomainDeviceModifyCurrent DomainDeviceModifyFlags = iota DomainDeviceModifyLive DomainDeviceModifyFlags = 1 @@ -1043,10 +1072,10 @@ const ( DomainDeviceModifyForce DomainDeviceModifyFlags = 4 ) -// DomainStatsTypes as declared in libvirt/libvirt-domain.h:2164 +// DomainStatsTypes as declared in libvirt/libvirt-domain.h:2207 type DomainStatsTypes int32 -// DomainStatsTypes enumeration from libvirt/libvirt-domain.h:2164 +// DomainStatsTypes enumeration from libvirt/libvirt-domain.h:2207 const ( DomainStatsState DomainStatsTypes = 1 DomainStatsCPUTotal DomainStatsTypes = 2 @@ -1059,10 +1088,10 @@ const ( DomainStatsMemory DomainStatsTypes = 256 ) -// ConnectGetAllDomainStatsFlags as declared in libvirt/libvirt-domain.h:2182 +// ConnectGetAllDomainStatsFlags as declared in libvirt/libvirt-domain.h:2225 type ConnectGetAllDomainStatsFlags int32 -// ConnectGetAllDomainStatsFlags enumeration from libvirt/libvirt-domain.h:2182 +// ConnectGetAllDomainStatsFlags enumeration from libvirt/libvirt-domain.h:2225 const ( ConnectGetAllDomainsStatsActive ConnectGetAllDomainStatsFlags = 1 ConnectGetAllDomainsStatsInactive ConnectGetAllDomainStatsFlags = 2 @@ -1077,10 +1106,10 @@ const ( ConnectGetAllDomainsStatsEnforceStats ConnectGetAllDomainStatsFlags = -2147483648 ) -// DomainBlockJobType as declared in libvirt/libvirt-domain.h:2470 +// DomainBlockJobType as declared in libvirt/libvirt-domain.h:2513 type DomainBlockJobType int32 -// DomainBlockJobType enumeration from libvirt/libvirt-domain.h:2470 +// DomainBlockJobType enumeration from libvirt/libvirt-domain.h:2513 const ( DomainBlockJobTypeUnknown DomainBlockJobType = iota DomainBlockJobTypePull DomainBlockJobType = 1 @@ -1090,43 +1119,43 @@ const ( DomainBlockJobTypeBackup DomainBlockJobType = 5 ) -// DomainBlockJobAbortFlags as declared in libvirt/libvirt-domain.h:2482 +// DomainBlockJobAbortFlags as declared in libvirt/libvirt-domain.h:2525 type DomainBlockJobAbortFlags int32 -// DomainBlockJobAbortFlags enumeration from libvirt/libvirt-domain.h:2482 +// DomainBlockJobAbortFlags enumeration from libvirt/libvirt-domain.h:2525 const ( DomainBlockJobAbortAsync DomainBlockJobAbortFlags = 1 DomainBlockJobAbortPivot DomainBlockJobAbortFlags = 2 ) -// DomainBlockJobInfoFlags as declared in libvirt/libvirt-domain.h:2491 +// DomainBlockJobInfoFlags as declared in libvirt/libvirt-domain.h:2534 type DomainBlockJobInfoFlags int32 -// DomainBlockJobInfoFlags enumeration from libvirt/libvirt-domain.h:2491 +// DomainBlockJobInfoFlags enumeration from libvirt/libvirt-domain.h:2534 const ( DomainBlockJobInfoBandwidthBytes DomainBlockJobInfoFlags = 1 ) -// DomainBlockJobSetSpeedFlags as declared in libvirt/libvirt-domain.h:2520 +// DomainBlockJobSetSpeedFlags as declared in libvirt/libvirt-domain.h:2563 type DomainBlockJobSetSpeedFlags int32 -// DomainBlockJobSetSpeedFlags enumeration from libvirt/libvirt-domain.h:2520 +// DomainBlockJobSetSpeedFlags enumeration from libvirt/libvirt-domain.h:2563 const ( DomainBlockJobSpeedBandwidthBytes DomainBlockJobSetSpeedFlags = 1 ) -// DomainBlockPullFlags as declared in libvirt/libvirt-domain.h:2530 +// DomainBlockPullFlags as declared in libvirt/libvirt-domain.h:2573 type DomainBlockPullFlags int32 -// DomainBlockPullFlags enumeration from libvirt/libvirt-domain.h:2530 +// DomainBlockPullFlags enumeration from libvirt/libvirt-domain.h:2573 const ( DomainBlockPullBandwidthBytes DomainBlockPullFlags = 64 ) -// DomainBlockRebaseFlags as declared in libvirt/libvirt-domain.h:2554 +// DomainBlockRebaseFlags as declared in libvirt/libvirt-domain.h:2597 type DomainBlockRebaseFlags int32 -// DomainBlockRebaseFlags enumeration from libvirt/libvirt-domain.h:2554 +// DomainBlockRebaseFlags enumeration from libvirt/libvirt-domain.h:2597 const ( DomainBlockRebaseShallow DomainBlockRebaseFlags = 1 DomainBlockRebaseReuseExt DomainBlockRebaseFlags = 2 @@ -1137,20 +1166,20 @@ const ( DomainBlockRebaseBandwidthBytes DomainBlockRebaseFlags = 64 ) -// DomainBlockCopyFlags as declared in libvirt/libvirt-domain.h:2573 +// DomainBlockCopyFlags as declared in libvirt/libvirt-domain.h:2616 type DomainBlockCopyFlags int32 -// DomainBlockCopyFlags enumeration from libvirt/libvirt-domain.h:2573 +// DomainBlockCopyFlags enumeration from libvirt/libvirt-domain.h:2616 const ( DomainBlockCopyShallow DomainBlockCopyFlags = 1 DomainBlockCopyReuseExt DomainBlockCopyFlags = 2 DomainBlockCopyTransientJob DomainBlockCopyFlags = 4 ) -// DomainBlockCommitFlags as declared in libvirt/libvirt-domain.h:2638 +// DomainBlockCommitFlags as declared in libvirt/libvirt-domain.h:2681 type DomainBlockCommitFlags int32 -// DomainBlockCommitFlags enumeration from libvirt/libvirt-domain.h:2638 +// DomainBlockCommitFlags enumeration from libvirt/libvirt-domain.h:2681 const ( DomainBlockCommitShallow DomainBlockCommitFlags = 1 DomainBlockCommitDelete DomainBlockCommitFlags = 2 @@ -1159,20 +1188,20 @@ const ( DomainBlockCommitBandwidthBytes DomainBlockCommitFlags = 16 ) -// DomainDiskErrorCode as declared in libvirt/libvirt-domain.h:2829 +// DomainDiskErrorCode as declared in libvirt/libvirt-domain.h:2872 type DomainDiskErrorCode int32 -// DomainDiskErrorCode enumeration from libvirt/libvirt-domain.h:2829 +// DomainDiskErrorCode enumeration from libvirt/libvirt-domain.h:2872 const ( DomainDiskErrorNone DomainDiskErrorCode = iota DomainDiskErrorUnspec DomainDiskErrorCode = 1 DomainDiskErrorNoSpace DomainDiskErrorCode = 2 ) -// KeycodeSet as declared in libvirt/libvirt-domain.h:2875 +// KeycodeSet as declared in libvirt/libvirt-domain.h:2918 type KeycodeSet int32 -// KeycodeSet enumeration from libvirt/libvirt-domain.h:2875 +// KeycodeSet enumeration from libvirt/libvirt-domain.h:2918 const ( KeycodeSetLinux KeycodeSet = iota KeycodeSetXt KeycodeSet = 1 @@ -1186,10 +1215,10 @@ const ( KeycodeSetQnum KeycodeSet = 9 ) -// DomainProcessSignal as declared in libvirt/libvirt-domain.h:2984 +// DomainProcessSignal as declared in libvirt/libvirt-domain.h:3027 type DomainProcessSignal int32 -// DomainProcessSignal enumeration from libvirt/libvirt-domain.h:2984 +// DomainProcessSignal enumeration from libvirt/libvirt-domain.h:3027 const ( DomainProcessSignalNop DomainProcessSignal = iota DomainProcessSignalHup DomainProcessSignal = 1 @@ -1258,10 +1287,10 @@ const ( DomainProcessSignalRt32 DomainProcessSignal = 64 ) -// DomainEventType as declared in libvirt/libvirt-domain.h:3022 +// DomainEventType as declared in libvirt/libvirt-domain.h:3065 type DomainEventType int32 -// DomainEventType enumeration from libvirt/libvirt-domain.h:3022 +// DomainEventType enumeration from libvirt/libvirt-domain.h:3065 const ( DomainEventDefined DomainEventType = iota DomainEventUndefined DomainEventType = 1 @@ -1274,10 +1303,10 @@ const ( DomainEventCrashed DomainEventType = 8 ) -// DomainEventDefinedDetailType as declared in libvirt/libvirt-domain.h:3038 +// DomainEventDefinedDetailType as declared in libvirt/libvirt-domain.h:3081 type DomainEventDefinedDetailType int32 -// DomainEventDefinedDetailType enumeration from libvirt/libvirt-domain.h:3038 +// DomainEventDefinedDetailType enumeration from libvirt/libvirt-domain.h:3081 const ( DomainEventDefinedAdded DomainEventDefinedDetailType = iota DomainEventDefinedUpdated DomainEventDefinedDetailType = 1 @@ -1285,19 +1314,19 @@ const ( DomainEventDefinedFromSnapshot DomainEventDefinedDetailType = 3 ) -// DomainEventUndefinedDetailType as declared in libvirt/libvirt-domain.h:3052 +// DomainEventUndefinedDetailType as declared in libvirt/libvirt-domain.h:3095 type DomainEventUndefinedDetailType int32 -// DomainEventUndefinedDetailType enumeration from libvirt/libvirt-domain.h:3052 +// DomainEventUndefinedDetailType enumeration from libvirt/libvirt-domain.h:3095 const ( DomainEventUndefinedRemoved DomainEventUndefinedDetailType = iota DomainEventUndefinedRenamed DomainEventUndefinedDetailType = 1 ) -// DomainEventStartedDetailType as declared in libvirt/libvirt-domain.h:3069 +// DomainEventStartedDetailType as declared in libvirt/libvirt-domain.h:3112 type DomainEventStartedDetailType int32 -// DomainEventStartedDetailType enumeration from libvirt/libvirt-domain.h:3069 +// DomainEventStartedDetailType enumeration from libvirt/libvirt-domain.h:3112 const ( DomainEventStartedBooted DomainEventStartedDetailType = iota DomainEventStartedMigrated DomainEventStartedDetailType = 1 @@ -1306,10 +1335,10 @@ const ( DomainEventStartedWakeup DomainEventStartedDetailType = 4 ) -// DomainEventSuspendedDetailType as declared in libvirt/libvirt-domain.h:3090 +// DomainEventSuspendedDetailType as declared in libvirt/libvirt-domain.h:3133 type DomainEventSuspendedDetailType int32 -// DomainEventSuspendedDetailType enumeration from libvirt/libvirt-domain.h:3090 +// DomainEventSuspendedDetailType enumeration from libvirt/libvirt-domain.h:3133 const ( DomainEventSuspendedPaused DomainEventSuspendedDetailType = iota DomainEventSuspendedMigrated DomainEventSuspendedDetailType = 1 @@ -1322,10 +1351,10 @@ const ( DomainEventSuspendedPostcopyFailed DomainEventSuspendedDetailType = 8 ) -// DomainEventResumedDetailType as declared in libvirt/libvirt-domain.h:3107 +// DomainEventResumedDetailType as declared in libvirt/libvirt-domain.h:3150 type DomainEventResumedDetailType int32 -// DomainEventResumedDetailType enumeration from libvirt/libvirt-domain.h:3107 +// DomainEventResumedDetailType enumeration from libvirt/libvirt-domain.h:3150 const ( DomainEventResumedUnpaused DomainEventResumedDetailType = iota DomainEventResumedMigrated DomainEventResumedDetailType = 1 @@ -1333,10 +1362,10 @@ const ( DomainEventResumedPostcopy DomainEventResumedDetailType = 3 ) -// DomainEventStoppedDetailType as declared in libvirt/libvirt-domain.h:3126 +// DomainEventStoppedDetailType as declared in libvirt/libvirt-domain.h:3169 type DomainEventStoppedDetailType int32 -// DomainEventStoppedDetailType enumeration from libvirt/libvirt-domain.h:3126 +// DomainEventStoppedDetailType enumeration from libvirt/libvirt-domain.h:3169 const ( DomainEventStoppedShutdown DomainEventStoppedDetailType = iota DomainEventStoppedDestroyed DomainEventStoppedDetailType = 1 @@ -1347,37 +1376,67 @@ const ( DomainEventStoppedFromSnapshot DomainEventStoppedDetailType = 6 ) -// DomainEventShutdownDetailType as declared in libvirt/libvirt-domain.h:3149 +// DomainEventShutdownDetailType as declared in libvirt/libvirt-domain.h:3192 type DomainEventShutdownDetailType int32 -// DomainEventShutdownDetailType enumeration from libvirt/libvirt-domain.h:3149 +// DomainEventShutdownDetailType enumeration from libvirt/libvirt-domain.h:3192 const ( DomainEventShutdownFinished DomainEventShutdownDetailType = iota DomainEventShutdownGuest DomainEventShutdownDetailType = 1 DomainEventShutdownHost DomainEventShutdownDetailType = 2 ) -// DomainEventPMSuspendedDetailType as declared in libvirt/libvirt-domain.h:3163 +// DomainEventPMSuspendedDetailType as declared in libvirt/libvirt-domain.h:3206 type DomainEventPMSuspendedDetailType int32 -// DomainEventPMSuspendedDetailType enumeration from libvirt/libvirt-domain.h:3163 +// DomainEventPMSuspendedDetailType enumeration from libvirt/libvirt-domain.h:3206 const ( DomainEventPmsuspendedMemory DomainEventPMSuspendedDetailType = iota DomainEventPmsuspendedDisk DomainEventPMSuspendedDetailType = 1 ) -// DomainEventCrashedDetailType as declared in libvirt/libvirt-domain.h:3176 +// DomainEventCrashedDetailType as declared in libvirt/libvirt-domain.h:3220 type DomainEventCrashedDetailType int32 -// DomainEventCrashedDetailType enumeration from libvirt/libvirt-domain.h:3176 +// DomainEventCrashedDetailType enumeration from libvirt/libvirt-domain.h:3220 const ( - DomainEventCrashedPanicked DomainEventCrashedDetailType = iota + DomainEventCrashedPanicked DomainEventCrashedDetailType = iota + DomainEventCrashedCrashloaded DomainEventCrashedDetailType = 1 ) -// DomainJobType as declared in libvirt/libvirt-domain.h:3220 +// DomainMemoryFailureRecipientType as declared in libvirt/libvirt-domain.h:3237 +type DomainMemoryFailureRecipientType int32 + +// DomainMemoryFailureRecipientType enumeration from libvirt/libvirt-domain.h:3237 +const ( + DomainEventMemoryFailureRecipientHypervisor DomainMemoryFailureRecipientType = iota + DomainEventMemoryFailureRecipientGuest DomainMemoryFailureRecipientType = 1 +) + +// DomainMemoryFailureActionType as declared in libvirt/libvirt-domain.h:3266 +type DomainMemoryFailureActionType int32 + +// DomainMemoryFailureActionType enumeration from libvirt/libvirt-domain.h:3266 +const ( + DomainEventMemoryFailureActionIgnore DomainMemoryFailureActionType = iota + DomainEventMemoryFailureActionInject DomainMemoryFailureActionType = 1 + DomainEventMemoryFailureActionFatal DomainMemoryFailureActionType = 2 + DomainEventMemoryFailureActionReset DomainMemoryFailureActionType = 3 +) + +// DomainMemoryFailureFlags as declared in libvirt/libvirt-domain.h:3277 +type DomainMemoryFailureFlags int32 + +// DomainMemoryFailureFlags enumeration from libvirt/libvirt-domain.h:3277 +const ( + DomainMemoryFailureActionRequired DomainMemoryFailureFlags = 1 + DomainMemoryFailureRecursive DomainMemoryFailureFlags = 2 +) + +// DomainJobType as declared in libvirt/libvirt-domain.h:3322 type DomainJobType int32 -// DomainJobType enumeration from libvirt/libvirt-domain.h:3220 +// DomainJobType enumeration from libvirt/libvirt-domain.h:3322 const ( DomainJobNone DomainJobType = iota DomainJobBounded DomainJobType = 1 @@ -1387,19 +1446,19 @@ const ( DomainJobCancelled DomainJobType = 5 ) -// DomainGetJobStatsFlags as declared in libvirt/libvirt-domain.h:3269 +// DomainGetJobStatsFlags as declared in libvirt/libvirt-domain.h:3371 type DomainGetJobStatsFlags int32 -// DomainGetJobStatsFlags enumeration from libvirt/libvirt-domain.h:3269 +// DomainGetJobStatsFlags enumeration from libvirt/libvirt-domain.h:3371 const ( DomainJobStatsCompleted DomainGetJobStatsFlags = 1 DomainJobStatsKeepCompleted DomainGetJobStatsFlags = 2 ) -// DomainJobOperation as declared in libvirt/libvirt-domain.h:3295 +// DomainJobOperation as declared in libvirt/libvirt-domain.h:3397 type DomainJobOperation int32 -// DomainJobOperation enumeration from libvirt/libvirt-domain.h:3295 +// DomainJobOperation enumeration from libvirt/libvirt-domain.h:3397 const ( DomainJobOperationStrUnknown DomainJobOperation = iota DomainJobOperationStrStart DomainJobOperation = 1 @@ -1413,10 +1472,10 @@ const ( DomainJobOperationStrBackup DomainJobOperation = 9 ) -// DomainEventWatchdogAction as declared in libvirt/libvirt-domain.h:3670 +// DomainEventWatchdogAction as declared in libvirt/libvirt-domain.h:3781 type DomainEventWatchdogAction int32 -// DomainEventWatchdogAction enumeration from libvirt/libvirt-domain.h:3670 +// DomainEventWatchdogAction enumeration from libvirt/libvirt-domain.h:3781 const ( DomainEventWatchdogNone DomainEventWatchdogAction = iota DomainEventWatchdogPause DomainEventWatchdogAction = 1 @@ -1427,40 +1486,40 @@ const ( DomainEventWatchdogInjectnmi DomainEventWatchdogAction = 6 ) -// DomainEventIOErrorAction as declared in libvirt/libvirt-domain.h:3701 +// DomainEventIOErrorAction as declared in libvirt/libvirt-domain.h:3812 type DomainEventIOErrorAction int32 -// DomainEventIOErrorAction enumeration from libvirt/libvirt-domain.h:3701 +// DomainEventIOErrorAction enumeration from libvirt/libvirt-domain.h:3812 const ( DomainEventIoErrorNone DomainEventIOErrorAction = iota DomainEventIoErrorPause DomainEventIOErrorAction = 1 DomainEventIoErrorReport DomainEventIOErrorAction = 2 ) -// DomainEventGraphicsPhase as declared in libvirt/libvirt-domain.h:3764 +// DomainEventGraphicsPhase as declared in libvirt/libvirt-domain.h:3875 type DomainEventGraphicsPhase int32 -// DomainEventGraphicsPhase enumeration from libvirt/libvirt-domain.h:3764 +// DomainEventGraphicsPhase enumeration from libvirt/libvirt-domain.h:3875 const ( DomainEventGraphicsConnect DomainEventGraphicsPhase = iota DomainEventGraphicsInitialize DomainEventGraphicsPhase = 1 DomainEventGraphicsDisconnect DomainEventGraphicsPhase = 2 ) -// DomainEventGraphicsAddressType as declared in libvirt/libvirt-domain.h:3779 +// DomainEventGraphicsAddressType as declared in libvirt/libvirt-domain.h:3890 type DomainEventGraphicsAddressType int32 -// DomainEventGraphicsAddressType enumeration from libvirt/libvirt-domain.h:3779 +// DomainEventGraphicsAddressType enumeration from libvirt/libvirt-domain.h:3890 const ( DomainEventGraphicsAddressIpv4 DomainEventGraphicsAddressType = iota DomainEventGraphicsAddressIpv6 DomainEventGraphicsAddressType = 1 DomainEventGraphicsAddressUnix DomainEventGraphicsAddressType = 2 ) -// ConnectDomainEventBlockJobStatus as declared in libvirt/libvirt-domain.h:3867 +// ConnectDomainEventBlockJobStatus as declared in libvirt/libvirt-domain.h:3978 type ConnectDomainEventBlockJobStatus int32 -// ConnectDomainEventBlockJobStatus enumeration from libvirt/libvirt-domain.h:3867 +// ConnectDomainEventBlockJobStatus enumeration from libvirt/libvirt-domain.h:3978 const ( DomainBlockJobCompleted ConnectDomainEventBlockJobStatus = iota DomainBlockJobFailed ConnectDomainEventBlockJobStatus = 1 @@ -1468,47 +1527,47 @@ const ( DomainBlockJobReady ConnectDomainEventBlockJobStatus = 3 ) -// ConnectDomainEventDiskChangeReason as declared in libvirt/libvirt-domain.h:3917 +// ConnectDomainEventDiskChangeReason as declared in libvirt/libvirt-domain.h:4028 type ConnectDomainEventDiskChangeReason int32 -// ConnectDomainEventDiskChangeReason enumeration from libvirt/libvirt-domain.h:3917 +// ConnectDomainEventDiskChangeReason enumeration from libvirt/libvirt-domain.h:4028 const ( DomainEventDiskChangeMissingOnStart ConnectDomainEventDiskChangeReason = iota DomainEventDiskDropMissingOnStart ConnectDomainEventDiskChangeReason = 1 ) -// DomainEventTrayChangeReason as declared in libvirt/libvirt-domain.h:3958 +// DomainEventTrayChangeReason as declared in libvirt/libvirt-domain.h:4069 type DomainEventTrayChangeReason int32 -// DomainEventTrayChangeReason enumeration from libvirt/libvirt-domain.h:3958 +// DomainEventTrayChangeReason enumeration from libvirt/libvirt-domain.h:4069 const ( DomainEventTrayChangeOpen DomainEventTrayChangeReason = iota DomainEventTrayChangeClose DomainEventTrayChangeReason = 1 ) -// ConnectDomainEventAgentLifecycleState as declared in libvirt/libvirt-domain.h:4475 +// ConnectDomainEventAgentLifecycleState as declared in libvirt/libvirt-domain.h:4586 type ConnectDomainEventAgentLifecycleState int32 -// ConnectDomainEventAgentLifecycleState enumeration from libvirt/libvirt-domain.h:4475 +// ConnectDomainEventAgentLifecycleState enumeration from libvirt/libvirt-domain.h:4586 const ( ConnectDomainEventAgentLifecycleStateConnected ConnectDomainEventAgentLifecycleState = 1 ConnectDomainEventAgentLifecycleStateDisconnected ConnectDomainEventAgentLifecycleState = 2 ) -// ConnectDomainEventAgentLifecycleReason as declared in libvirt/libvirt-domain.h:4485 +// ConnectDomainEventAgentLifecycleReason as declared in libvirt/libvirt-domain.h:4596 type ConnectDomainEventAgentLifecycleReason int32 -// ConnectDomainEventAgentLifecycleReason enumeration from libvirt/libvirt-domain.h:4485 +// ConnectDomainEventAgentLifecycleReason enumeration from libvirt/libvirt-domain.h:4596 const ( ConnectDomainEventAgentLifecycleReasonUnknown ConnectDomainEventAgentLifecycleReason = iota ConnectDomainEventAgentLifecycleReasonDomainStarted ConnectDomainEventAgentLifecycleReason = 1 ConnectDomainEventAgentLifecycleReasonChannel ConnectDomainEventAgentLifecycleReason = 2 ) -// DomainEventID as declared in libvirt/libvirt-domain.h:4589 +// DomainEventID as declared in libvirt/libvirt-domain.h:4726 type DomainEventID int32 -// DomainEventID enumeration from libvirt/libvirt-domain.h:4589 +// DomainEventID enumeration from libvirt/libvirt-domain.h:4726 const ( DomainEventIDLifecycle DomainEventID = iota DomainEventIDReboot DomainEventID = 1 @@ -1535,45 +1594,46 @@ const ( DomainEventIDDeviceRemovalFailed DomainEventID = 22 DomainEventIDMetadataChange DomainEventID = 23 DomainEventIDBlockThreshold DomainEventID = 24 + DomainEventIDMemoryFailure DomainEventID = 25 ) -// DomainConsoleFlags as declared in libvirt/libvirt-domain.h:4616 +// DomainConsoleFlags as declared in libvirt/libvirt-domain.h:4753 type DomainConsoleFlags int32 -// DomainConsoleFlags enumeration from libvirt/libvirt-domain.h:4616 +// DomainConsoleFlags enumeration from libvirt/libvirt-domain.h:4753 const ( DomainConsoleForce DomainConsoleFlags = 1 DomainConsoleSafe DomainConsoleFlags = 2 ) -// DomainChannelFlags as declared in libvirt/libvirt-domain.h:4632 +// DomainChannelFlags as declared in libvirt/libvirt-domain.h:4769 type DomainChannelFlags int32 -// DomainChannelFlags enumeration from libvirt/libvirt-domain.h:4632 +// DomainChannelFlags enumeration from libvirt/libvirt-domain.h:4769 const ( DomainChannelForce DomainChannelFlags = 1 ) -// DomainOpenGraphicsFlags as declared in libvirt/libvirt-domain.h:4641 +// DomainOpenGraphicsFlags as declared in libvirt/libvirt-domain.h:4778 type DomainOpenGraphicsFlags int32 -// DomainOpenGraphicsFlags enumeration from libvirt/libvirt-domain.h:4641 +// DomainOpenGraphicsFlags enumeration from libvirt/libvirt-domain.h:4778 const ( DomainOpenGraphicsSkipauth DomainOpenGraphicsFlags = 1 ) -// DomainSetTimeFlags as declared in libvirt/libvirt-domain.h:4698 +// DomainSetTimeFlags as declared in libvirt/libvirt-domain.h:4835 type DomainSetTimeFlags int32 -// DomainSetTimeFlags enumeration from libvirt/libvirt-domain.h:4698 +// DomainSetTimeFlags enumeration from libvirt/libvirt-domain.h:4835 const ( DomainTimeSync DomainSetTimeFlags = 1 ) -// SchedParameterType as declared in libvirt/libvirt-domain.h:4719 +// SchedParameterType as declared in libvirt/libvirt-domain.h:4856 type SchedParameterType int32 -// SchedParameterType enumeration from libvirt/libvirt-domain.h:4719 +// SchedParameterType enumeration from libvirt/libvirt-domain.h:4856 const ( DomainSchedFieldInt SchedParameterType = 1 DomainSchedFieldUint SchedParameterType = 2 @@ -1583,10 +1643,10 @@ const ( DomainSchedFieldBoolean SchedParameterType = 6 ) -// BlkioParameterType as declared in libvirt/libvirt-domain.h:4763 +// BlkioParameterType as declared in libvirt/libvirt-domain.h:4900 type BlkioParameterType int32 -// BlkioParameterType enumeration from libvirt/libvirt-domain.h:4763 +// BlkioParameterType enumeration from libvirt/libvirt-domain.h:4900 const ( DomainBlkioParamInt BlkioParameterType = 1 DomainBlkioParamUint BlkioParameterType = 2 @@ -1596,10 +1656,10 @@ const ( DomainBlkioParamBoolean BlkioParameterType = 6 ) -// MemoryParameterType as declared in libvirt/libvirt-domain.h:4807 +// MemoryParameterType as declared in libvirt/libvirt-domain.h:4944 type MemoryParameterType int32 -// MemoryParameterType enumeration from libvirt/libvirt-domain.h:4807 +// MemoryParameterType enumeration from libvirt/libvirt-domain.h:4944 const ( DomainMemoryParamInt MemoryParameterType = 1 DomainMemoryParamUint MemoryParameterType = 2 @@ -1609,38 +1669,38 @@ const ( DomainMemoryParamBoolean MemoryParameterType = 6 ) -// DomainInterfaceAddressesSource as declared in libvirt/libvirt-domain.h:4845 +// DomainInterfaceAddressesSource as declared in libvirt/libvirt-domain.h:4982 type DomainInterfaceAddressesSource int32 -// DomainInterfaceAddressesSource enumeration from libvirt/libvirt-domain.h:4845 +// DomainInterfaceAddressesSource enumeration from libvirt/libvirt-domain.h:4982 const ( DomainInterfaceAddressesSrcLease DomainInterfaceAddressesSource = iota DomainInterfaceAddressesSrcAgent DomainInterfaceAddressesSource = 1 DomainInterfaceAddressesSrcArp DomainInterfaceAddressesSource = 2 ) -// DomainSetUserPasswordFlags as declared in libvirt/libvirt-domain.h:4873 +// DomainSetUserPasswordFlags as declared in libvirt/libvirt-domain.h:5010 type DomainSetUserPasswordFlags int32 -// DomainSetUserPasswordFlags enumeration from libvirt/libvirt-domain.h:4873 +// DomainSetUserPasswordFlags enumeration from libvirt/libvirt-domain.h:5010 const ( DomainPasswordEncrypted DomainSetUserPasswordFlags = 1 ) -// DomainLifecycle as declared in libvirt/libvirt-domain.h:4912 +// DomainLifecycle as declared in libvirt/libvirt-domain.h:5049 type DomainLifecycle int32 -// DomainLifecycle enumeration from libvirt/libvirt-domain.h:4912 +// DomainLifecycle enumeration from libvirt/libvirt-domain.h:5049 const ( DomainLifecyclePoweroff DomainLifecycle = iota DomainLifecycleReboot DomainLifecycle = 1 DomainLifecycleCrash DomainLifecycle = 2 ) -// DomainLifecycleAction as declared in libvirt/libvirt-domain.h:4925 +// DomainLifecycleAction as declared in libvirt/libvirt-domain.h:5062 type DomainLifecycleAction int32 -// DomainLifecycleAction enumeration from libvirt/libvirt-domain.h:4925 +// DomainLifecycleAction enumeration from libvirt/libvirt-domain.h:5062 const ( DomainLifecycleActionDestroy DomainLifecycleAction = iota DomainLifecycleActionRestart DomainLifecycleAction = 1 @@ -1650,59 +1710,79 @@ const ( DomainLifecycleActionCoredumpRestart DomainLifecycleAction = 5 ) -// DomainGuestInfoTypes as declared in libvirt/libvirt-domain.h:4955 +// DomainGuestInfoTypes as declared in libvirt/libvirt-domain.h:5093 type DomainGuestInfoTypes int32 -// DomainGuestInfoTypes enumeration from libvirt/libvirt-domain.h:4955 +// DomainGuestInfoTypes enumeration from libvirt/libvirt-domain.h:5093 const ( DomainGuestInfoUsers DomainGuestInfoTypes = 1 DomainGuestInfoOs DomainGuestInfoTypes = 2 DomainGuestInfoTimezone DomainGuestInfoTypes = 4 DomainGuestInfoHostname DomainGuestInfoTypes = 8 DomainGuestInfoFilesystem DomainGuestInfoTypes = 16 + DomainGuestInfoDisks DomainGuestInfoTypes = 32 ) -// DomainAgentResponseTimeoutValues as declared in libvirt/libvirt-domain.h:4967 +// DomainAgentResponseTimeoutValues as declared in libvirt/libvirt-domain.h:5105 type DomainAgentResponseTimeoutValues int32 -// DomainAgentResponseTimeoutValues enumeration from libvirt/libvirt-domain.h:4967 +// DomainAgentResponseTimeoutValues enumeration from libvirt/libvirt-domain.h:5105 const ( DomainAgentResponseTimeoutBlock DomainAgentResponseTimeoutValues = -2 DomainAgentResponseTimeoutDefault DomainAgentResponseTimeoutValues = -1 DomainAgentResponseTimeoutNowait DomainAgentResponseTimeoutValues = 0 ) -// DomainBackupBeginFlags as declared in libvirt/libvirt-domain.h:4976 +// DomainBackupBeginFlags as declared in libvirt/libvirt-domain.h:5114 type DomainBackupBeginFlags int32 -// DomainBackupBeginFlags enumeration from libvirt/libvirt-domain.h:4976 +// DomainBackupBeginFlags enumeration from libvirt/libvirt-domain.h:5114 const ( DomainBackupBeginReuseExternal DomainBackupBeginFlags = 1 ) -// DomainCheckpointCreateFlags as declared in libvirt/libvirt-domain-checkpoint.h:60 -type DomainCheckpointCreateFlags int32 +// DomainAuthorizedSSHKeysSetFlags as declared in libvirt/libvirt-domain.h:5133 +type DomainAuthorizedSSHKeysSetFlags int32 -// DomainCheckpointCreateFlags enumeration from libvirt/libvirt-domain-checkpoint.h:60 +// DomainAuthorizedSSHKeysSetFlags enumeration from libvirt/libvirt-domain.h:5133 const ( - DomainCheckpointCreateRedefine DomainCheckpointCreateFlags = 1 - DomainCheckpointCreateQuiesce DomainCheckpointCreateFlags = 2 + DomainAuthorizedSSHKeysSetAppend DomainAuthorizedSSHKeysSetFlags = 1 + DomainAuthorizedSSHKeysSetRemove DomainAuthorizedSSHKeysSetFlags = 2 ) -// DomainCheckpointXMLFlags as declared in libvirt/libvirt-domain-checkpoint.h:73 +// DomainMessageType as declared in libvirt/libvirt-domain.h:5144 +type DomainMessageType int32 + +// DomainMessageType enumeration from libvirt/libvirt-domain.h:5144 +const ( + DomainMessageDeprecation DomainMessageType = 1 + DomainMessageTainting DomainMessageType = 2 +) + +// DomainCheckpointCreateFlags as declared in libvirt/libvirt-domain-checkpoint.h:62 +type DomainCheckpointCreateFlags int32 + +// DomainCheckpointCreateFlags enumeration from libvirt/libvirt-domain-checkpoint.h:62 +const ( + DomainCheckpointCreateRedefine DomainCheckpointCreateFlags = 1 + DomainCheckpointCreateQuiesce DomainCheckpointCreateFlags = 2 + DomainCheckpointCreateRedefineValidate DomainCheckpointCreateFlags = 4 +) + +// DomainCheckpointXMLFlags as declared in libvirt/libvirt-domain-checkpoint.h:75 type DomainCheckpointXMLFlags int32 -// DomainCheckpointXMLFlags enumeration from libvirt/libvirt-domain-checkpoint.h:73 +// DomainCheckpointXMLFlags enumeration from libvirt/libvirt-domain-checkpoint.h:75 const ( DomainCheckpointXMLSecure DomainCheckpointXMLFlags = 1 DomainCheckpointXMLNoDomain DomainCheckpointXMLFlags = 2 DomainCheckpointXMLSize DomainCheckpointXMLFlags = 4 ) -// DomainCheckpointListFlags as declared in libvirt/libvirt-domain-checkpoint.h:103 +// DomainCheckpointListFlags as declared in libvirt/libvirt-domain-checkpoint.h:105 type DomainCheckpointListFlags int32 -// DomainCheckpointListFlags enumeration from libvirt/libvirt-domain-checkpoint.h:103 +// DomainCheckpointListFlags enumeration from libvirt/libvirt-domain-checkpoint.h:105 const ( DomainCheckpointListRoots DomainCheckpointListFlags = 1 DomainCheckpointListDescendants DomainCheckpointListFlags = 1 @@ -1711,10 +1791,10 @@ const ( DomainCheckpointListNoLeaves DomainCheckpointListFlags = 8 ) -// DomainCheckpointDeleteFlags as declared in libvirt/libvirt-domain-checkpoint.h:129 +// DomainCheckpointDeleteFlags as declared in libvirt/libvirt-domain-checkpoint.h:131 type DomainCheckpointDeleteFlags int32 -// DomainCheckpointDeleteFlags enumeration from libvirt/libvirt-domain-checkpoint.h:129 +// DomainCheckpointDeleteFlags enumeration from libvirt/libvirt-domain-checkpoint.h:131 const ( DomainCheckpointDeleteChildren DomainCheckpointDeleteFlags = 1 DomainCheckpointDeleteMetadataOnly DomainCheckpointDeleteFlags = 2 @@ -1912,10 +1992,10 @@ const ( NetworkPortCreateReclaim NetworkPortCreateFlags = 1 ) -// ConnectListAllNodeDeviceFlags as declared in libvirt/libvirt-nodedev.h:84 +// ConnectListAllNodeDeviceFlags as declared in libvirt/libvirt-nodedev.h:89 type ConnectListAllNodeDeviceFlags int32 -// ConnectListAllNodeDeviceFlags enumeration from libvirt/libvirt-nodedev.h:84 +// ConnectListAllNodeDeviceFlags enumeration from libvirt/libvirt-nodedev.h:89 const ( ConnectListNodeDevicesCapSystem ConnectListAllNodeDeviceFlags = 1 ConnectListNodeDevicesCapPciDev ConnectListAllNodeDeviceFlags = 2 @@ -1933,21 +2013,26 @@ const ( ConnectListNodeDevicesCapMdevTypes ConnectListAllNodeDeviceFlags = 8192 ConnectListNodeDevicesCapMdev ConnectListAllNodeDeviceFlags = 16384 ConnectListNodeDevicesCapCcwDev ConnectListAllNodeDeviceFlags = 32768 + ConnectListNodeDevicesCapCssDev ConnectListAllNodeDeviceFlags = 65536 + ConnectListNodeDevicesCapVdpa ConnectListAllNodeDeviceFlags = 131072 + ConnectListNodeDevicesCapApCard ConnectListAllNodeDeviceFlags = 262144 + ConnectListNodeDevicesCapApQueue ConnectListAllNodeDeviceFlags = 524288 + ConnectListNodeDevicesCapApMatrix ConnectListAllNodeDeviceFlags = 1048576 ) -// NodeDeviceEventID as declared in libvirt/libvirt-nodedev.h:154 +// NodeDeviceEventID as declared in libvirt/libvirt-nodedev.h:159 type NodeDeviceEventID int32 -// NodeDeviceEventID enumeration from libvirt/libvirt-nodedev.h:154 +// NodeDeviceEventID enumeration from libvirt/libvirt-nodedev.h:159 const ( NodeDeviceEventIDLifecycle NodeDeviceEventID = iota NodeDeviceEventIDUpdate NodeDeviceEventID = 1 ) -// NodeDeviceEventLifecycleType as declared in libvirt/libvirt-nodedev.h:196 +// NodeDeviceEventLifecycleType as declared in libvirt/libvirt-nodedev.h:201 type NodeDeviceEventLifecycleType int32 -// NodeDeviceEventLifecycleType enumeration from libvirt/libvirt-nodedev.h:196 +// NodeDeviceEventLifecycleType enumeration from libvirt/libvirt-nodedev.h:201 const ( NodeDeviceEventCreated NodeDeviceEventLifecycleType = iota NodeDeviceEventDeleted NodeDeviceEventLifecycleType = 1 @@ -2207,208 +2292,209 @@ const ( StreamEventHangup StreamEventType = 8 ) -// errorLevel as declared in libvirt/virterror.h:42 -type errorLevel int32 +// ErrorLevel as declared in libvirt/virterror.h:42 +type ErrorLevel int32 -// errorLevel enumeration from libvirt/virterror.h:42 +// ErrorLevel enumeration from libvirt/virterror.h:42 const ( - errNone errorLevel = iota - errWarning errorLevel = 1 - errError errorLevel = 2 + ErrNone ErrorLevel = iota + ErrWarning ErrorLevel = 1 + ErrError ErrorLevel = 2 ) -// errorDomain as declared in libvirt/virterror.h:143 -type errorDomain int32 +// ErrorDomain as declared in libvirt/virterror.h:143 +type ErrorDomain int32 -// errorDomain enumeration from libvirt/virterror.h:143 +// ErrorDomain enumeration from libvirt/virterror.h:143 const ( - fromNone errorDomain = iota - fromXen errorDomain = 1 - fromXend errorDomain = 2 - fromXenstore errorDomain = 3 - fromSexpr errorDomain = 4 - fromXML errorDomain = 5 - fromDom errorDomain = 6 - fromRPC errorDomain = 7 - fromProxy errorDomain = 8 - fromConf errorDomain = 9 - fromQemu errorDomain = 10 - fromNet errorDomain = 11 - fromTest errorDomain = 12 - fromRemote errorDomain = 13 - fromOpenvz errorDomain = 14 - fromXenxm errorDomain = 15 - fromStatsLinux errorDomain = 16 - fromLxc errorDomain = 17 - fromStorage errorDomain = 18 - fromNetwork errorDomain = 19 - fromDomain errorDomain = 20 - fromUml errorDomain = 21 - fromNodedev errorDomain = 22 - fromXenInotify errorDomain = 23 - fromSecurity errorDomain = 24 - fromVbox errorDomain = 25 - fromInterface errorDomain = 26 - fromOne errorDomain = 27 - fromEsx errorDomain = 28 - fromPhyp errorDomain = 29 - fromSecret errorDomain = 30 - fromCPU errorDomain = 31 - fromXenapi errorDomain = 32 - fromNwfilter errorDomain = 33 - fromHook errorDomain = 34 - fromDomainSnapshot errorDomain = 35 - fromAudit errorDomain = 36 - fromSysinfo errorDomain = 37 - fromStreams errorDomain = 38 - fromVmware errorDomain = 39 - fromEvent errorDomain = 40 - fromLibxl errorDomain = 41 - fromLocking errorDomain = 42 - fromHyperv errorDomain = 43 - fromCapabilities errorDomain = 44 - fromURI errorDomain = 45 - fromAuth errorDomain = 46 - fromDbus errorDomain = 47 - fromParallels errorDomain = 48 - fromDevice errorDomain = 49 - fromSSH errorDomain = 50 - fromLockspace errorDomain = 51 - fromInitctl errorDomain = 52 - fromIdentity errorDomain = 53 - fromCgroup errorDomain = 54 - fromAccess errorDomain = 55 - fromSystemd errorDomain = 56 - fromBhyve errorDomain = 57 - fromCrypto errorDomain = 58 - fromFirewall errorDomain = 59 - fromPolkit errorDomain = 60 - fromThread errorDomain = 61 - fromAdmin errorDomain = 62 - fromLogging errorDomain = 63 - fromXenxl errorDomain = 64 - fromPerf errorDomain = 65 - fromLibssh errorDomain = 66 - fromResctrl errorDomain = 67 - fromFirewalld errorDomain = 68 - fromDomainCheckpoint errorDomain = 69 - fromTpm errorDomain = 70 - fromBpf errorDomain = 71 + fromNone ErrorDomain = iota + fromXen ErrorDomain = 1 + fromXend ErrorDomain = 2 + fromXenstore ErrorDomain = 3 + fromSexpr ErrorDomain = 4 + fromXML ErrorDomain = 5 + fromDom ErrorDomain = 6 + fromRPC ErrorDomain = 7 + fromProxy ErrorDomain = 8 + fromConf ErrorDomain = 9 + fromQemu ErrorDomain = 10 + fromNet ErrorDomain = 11 + fromTest ErrorDomain = 12 + fromRemote ErrorDomain = 13 + fromOpenvz ErrorDomain = 14 + fromXenxm ErrorDomain = 15 + fromStatsLinux ErrorDomain = 16 + fromLxc ErrorDomain = 17 + fromStorage ErrorDomain = 18 + fromNetwork ErrorDomain = 19 + fromDomain ErrorDomain = 20 + fromUml ErrorDomain = 21 + fromNodedev ErrorDomain = 22 + fromXenInotify ErrorDomain = 23 + fromSecurity ErrorDomain = 24 + fromVbox ErrorDomain = 25 + fromInterface ErrorDomain = 26 + fromOne ErrorDomain = 27 + fromEsx ErrorDomain = 28 + fromPhyp ErrorDomain = 29 + fromSecret ErrorDomain = 30 + fromCPU ErrorDomain = 31 + fromXenapi ErrorDomain = 32 + fromNwfilter ErrorDomain = 33 + fromHook ErrorDomain = 34 + fromDomainSnapshot ErrorDomain = 35 + fromAudit ErrorDomain = 36 + fromSysinfo ErrorDomain = 37 + fromStreams ErrorDomain = 38 + fromVmware ErrorDomain = 39 + fromEvent ErrorDomain = 40 + fromLibxl ErrorDomain = 41 + fromLocking ErrorDomain = 42 + fromHyperv ErrorDomain = 43 + fromCapabilities ErrorDomain = 44 + fromURI ErrorDomain = 45 + fromAuth ErrorDomain = 46 + fromDbus ErrorDomain = 47 + fromParallels ErrorDomain = 48 + fromDevice ErrorDomain = 49 + fromSSH ErrorDomain = 50 + fromLockspace ErrorDomain = 51 + fromInitctl ErrorDomain = 52 + fromIdentity ErrorDomain = 53 + fromCgroup ErrorDomain = 54 + fromAccess ErrorDomain = 55 + fromSystemd ErrorDomain = 56 + fromBhyve ErrorDomain = 57 + fromCrypto ErrorDomain = 58 + fromFirewall ErrorDomain = 59 + fromPolkit ErrorDomain = 60 + fromThread ErrorDomain = 61 + fromAdmin ErrorDomain = 62 + fromLogging ErrorDomain = 63 + fromXenxl ErrorDomain = 64 + fromPerf ErrorDomain = 65 + fromLibssh ErrorDomain = 66 + fromResctrl ErrorDomain = 67 + fromFirewalld ErrorDomain = 68 + fromDomainCheckpoint ErrorDomain = 69 + fromTpm ErrorDomain = 70 + fromBpf ErrorDomain = 71 ) -// errorNumber as declared in libvirt/virterror.h:340 -type errorNumber int32 +// ErrorNumber as declared in libvirt/virterror.h:341 +type ErrorNumber int32 -// errorNumber enumeration from libvirt/virterror.h:340 +// ErrorNumber enumeration from libvirt/virterror.h:341 const ( - errOk errorNumber = iota - errInternalError errorNumber = 1 - errNoMemory errorNumber = 2 - errNoSupport errorNumber = 3 - errUnknownHost errorNumber = 4 - errNoConnect errorNumber = 5 - errInvalidConn errorNumber = 6 - errInvalidDomain errorNumber = 7 - errInvalidArg errorNumber = 8 - errOperationFailed errorNumber = 9 - errGetFailed errorNumber = 10 - errPostFailed errorNumber = 11 - errHTTPError errorNumber = 12 - errSexprSerial errorNumber = 13 - errNoXen errorNumber = 14 - errXenCall errorNumber = 15 - errOsType errorNumber = 16 - errNoKernel errorNumber = 17 - errNoRoot errorNumber = 18 - errNoSource errorNumber = 19 - errNoTarget errorNumber = 20 - errNoName errorNumber = 21 - errNoOs errorNumber = 22 - errNoDevice errorNumber = 23 - errNoXenstore errorNumber = 24 - errDriverFull errorNumber = 25 - errCallFailed errorNumber = 26 - errXMLError errorNumber = 27 - errDomExist errorNumber = 28 - errOperationDenied errorNumber = 29 - errOpenFailed errorNumber = 30 - errReadFailed errorNumber = 31 - errParseFailed errorNumber = 32 - errConfSyntax errorNumber = 33 - errWriteFailed errorNumber = 34 - errXMLDetail errorNumber = 35 - errInvalidNetwork errorNumber = 36 - errNetworkExist errorNumber = 37 - errSystemError errorNumber = 38 - errRPC errorNumber = 39 - errGnutlsError errorNumber = 40 - warNoNetwork errorNumber = 41 - errNoDomain errorNumber = 42 - errNoNetwork errorNumber = 43 - errInvalidMac errorNumber = 44 - errAuthFailed errorNumber = 45 - errInvalidStoragePool errorNumber = 46 - errInvalidStorageVol errorNumber = 47 - warNoStorage errorNumber = 48 - errNoStoragePool errorNumber = 49 - errNoStorageVol errorNumber = 50 - warNoNode errorNumber = 51 - errInvalidNodeDevice errorNumber = 52 - errNoNodeDevice errorNumber = 53 - errNoSecurityModel errorNumber = 54 - errOperationInvalid errorNumber = 55 - warNoInterface errorNumber = 56 - errNoInterface errorNumber = 57 - errInvalidInterface errorNumber = 58 - errMultipleInterfaces errorNumber = 59 - warNoNwfilter errorNumber = 60 - errInvalidNwfilter errorNumber = 61 - errNoNwfilter errorNumber = 62 - errBuildFirewall errorNumber = 63 - warNoSecret errorNumber = 64 - errInvalidSecret errorNumber = 65 - errNoSecret errorNumber = 66 - errConfigUnsupported errorNumber = 67 - errOperationTimeout errorNumber = 68 - errMigratePersistFailed errorNumber = 69 - errHookScriptFailed errorNumber = 70 - errInvalidDomainSnapshot errorNumber = 71 - errNoDomainSnapshot errorNumber = 72 - errInvalidStream errorNumber = 73 - errArgumentUnsupported errorNumber = 74 - errStorageProbeFailed errorNumber = 75 - errStoragePoolBuilt errorNumber = 76 - errSnapshotRevertRisky errorNumber = 77 - errOperationAborted errorNumber = 78 - errAuthCancelled errorNumber = 79 - errNoDomainMetadata errorNumber = 80 - errMigrateUnsafe errorNumber = 81 - errOverflow errorNumber = 82 - errBlockCopyActive errorNumber = 83 - errOperationUnsupported errorNumber = 84 - errSSH errorNumber = 85 - errAgentUnresponsive errorNumber = 86 - errResourceBusy errorNumber = 87 - errAccessDenied errorNumber = 88 - errDbusService errorNumber = 89 - errStorageVolExist errorNumber = 90 - errCPUIncompatible errorNumber = 91 - errXMLInvalidSchema errorNumber = 92 - errMigrateFinishOk errorNumber = 93 - errAuthUnavailable errorNumber = 94 - errNoServer errorNumber = 95 - errNoClient errorNumber = 96 - errAgentUnsynced errorNumber = 97 - errLibssh errorNumber = 98 - errDeviceMissing errorNumber = 99 - errInvalidNwfilterBinding errorNumber = 100 - errNoNwfilterBinding errorNumber = 101 - errInvalidDomainCheckpoint errorNumber = 102 - errNoDomainCheckpoint errorNumber = 103 - errNoDomainBackup errorNumber = 104 - errInvalidNetworkPort errorNumber = 105 - errNetworkPortExist errorNumber = 106 - errNoNetworkPort errorNumber = 107 - errNoHostname errorNumber = 108 - errCheckpointInconsistent errorNumber = 109 + ErrOk ErrorNumber = iota + ErrInternalError ErrorNumber = 1 + ErrNoMemory ErrorNumber = 2 + ErrNoSupport ErrorNumber = 3 + ErrUnknownHost ErrorNumber = 4 + ErrNoConnect ErrorNumber = 5 + ErrInvalidConn ErrorNumber = 6 + ErrInvalidDomain ErrorNumber = 7 + ErrInvalidArg ErrorNumber = 8 + ErrOperationFailed ErrorNumber = 9 + ErrGetFailed ErrorNumber = 10 + ErrPostFailed ErrorNumber = 11 + ErrHTTPError ErrorNumber = 12 + ErrSexprSerial ErrorNumber = 13 + ErrNoXen ErrorNumber = 14 + ErrXenCall ErrorNumber = 15 + ErrOsType ErrorNumber = 16 + ErrNoKernel ErrorNumber = 17 + ErrNoRoot ErrorNumber = 18 + ErrNoSource ErrorNumber = 19 + ErrNoTarget ErrorNumber = 20 + ErrNoName ErrorNumber = 21 + ErrNoOs ErrorNumber = 22 + ErrNoDevice ErrorNumber = 23 + ErrNoXenstore ErrorNumber = 24 + ErrDriverFull ErrorNumber = 25 + ErrCallFailed ErrorNumber = 26 + ErrXMLError ErrorNumber = 27 + ErrDomExist ErrorNumber = 28 + ErrOperationDenied ErrorNumber = 29 + ErrOpenFailed ErrorNumber = 30 + ErrReadFailed ErrorNumber = 31 + ErrParseFailed ErrorNumber = 32 + ErrConfSyntax ErrorNumber = 33 + ErrWriteFailed ErrorNumber = 34 + ErrXMLDetail ErrorNumber = 35 + ErrInvalidNetwork ErrorNumber = 36 + ErrNetworkExist ErrorNumber = 37 + ErrSystemError ErrorNumber = 38 + ErrRPC ErrorNumber = 39 + ErrGnutlsError ErrorNumber = 40 + WarNoNetwork ErrorNumber = 41 + ErrNoDomain ErrorNumber = 42 + ErrNoNetwork ErrorNumber = 43 + ErrInvalidMac ErrorNumber = 44 + ErrAuthFailed ErrorNumber = 45 + ErrInvalidStoragePool ErrorNumber = 46 + ErrInvalidStorageVol ErrorNumber = 47 + WarNoStorage ErrorNumber = 48 + ErrNoStoragePool ErrorNumber = 49 + ErrNoStorageVol ErrorNumber = 50 + WarNoNode ErrorNumber = 51 + ErrInvalidNodeDevice ErrorNumber = 52 + ErrNoNodeDevice ErrorNumber = 53 + ErrNoSecurityModel ErrorNumber = 54 + ErrOperationInvalid ErrorNumber = 55 + WarNoInterface ErrorNumber = 56 + ErrNoInterface ErrorNumber = 57 + ErrInvalidInterface ErrorNumber = 58 + ErrMultipleInterfaces ErrorNumber = 59 + WarNoNwfilter ErrorNumber = 60 + ErrInvalidNwfilter ErrorNumber = 61 + ErrNoNwfilter ErrorNumber = 62 + ErrBuildFirewall ErrorNumber = 63 + WarNoSecret ErrorNumber = 64 + ErrInvalidSecret ErrorNumber = 65 + ErrNoSecret ErrorNumber = 66 + ErrConfigUnsupported ErrorNumber = 67 + ErrOperationTimeout ErrorNumber = 68 + ErrMigratePersistFailed ErrorNumber = 69 + ErrHookScriptFailed ErrorNumber = 70 + ErrInvalidDomainSnapshot ErrorNumber = 71 + ErrNoDomainSnapshot ErrorNumber = 72 + ErrInvalidStream ErrorNumber = 73 + ErrArgumentUnsupported ErrorNumber = 74 + ErrStorageProbeFailed ErrorNumber = 75 + ErrStoragePoolBuilt ErrorNumber = 76 + ErrSnapshotRevertRisky ErrorNumber = 77 + ErrOperationAborted ErrorNumber = 78 + ErrAuthCancelled ErrorNumber = 79 + ErrNoDomainMetadata ErrorNumber = 80 + ErrMigrateUnsafe ErrorNumber = 81 + ErrOverflow ErrorNumber = 82 + ErrBlockCopyActive ErrorNumber = 83 + ErrOperationUnsupported ErrorNumber = 84 + ErrSSH ErrorNumber = 85 + ErrAgentUnresponsive ErrorNumber = 86 + ErrResourceBusy ErrorNumber = 87 + ErrAccessDenied ErrorNumber = 88 + ErrDbusService ErrorNumber = 89 + ErrStorageVolExist ErrorNumber = 90 + ErrCPUIncompatible ErrorNumber = 91 + ErrXMLInvalidSchema ErrorNumber = 92 + ErrMigrateFinishOk ErrorNumber = 93 + ErrAuthUnavailable ErrorNumber = 94 + ErrNoServer ErrorNumber = 95 + ErrNoClient ErrorNumber = 96 + ErrAgentUnsynced ErrorNumber = 97 + ErrLibssh ErrorNumber = 98 + ErrDeviceMissing ErrorNumber = 99 + ErrInvalidNwfilterBinding ErrorNumber = 100 + ErrNoNwfilterBinding ErrorNumber = 101 + ErrInvalidDomainCheckpoint ErrorNumber = 102 + ErrNoDomainCheckpoint ErrorNumber = 103 + ErrNoDomainBackup ErrorNumber = 104 + ErrInvalidNetworkPort ErrorNumber = 105 + ErrNetworkPortExist ErrorNumber = 106 + ErrNoNetworkPort ErrorNumber = 107 + ErrNoHostname ErrorNumber = 108 + ErrCheckpointInconsistent ErrorNumber = 109 + ErrMultipleDomains ErrorNumber = 110 ) diff --git a/vendor/github.com/digitalocean/go-libvirt/doc.go b/vendor/github.com/digitalocean/go-libvirt/doc.go index 1229f30c80..c3788520ba 100644 --- a/vendor/github.com/digitalocean/go-libvirt/doc.go +++ b/vendor/github.com/digitalocean/go-libvirt/doc.go @@ -12,65 +12,59 @@ // See the License for the specific language governing permissions and // limitations under the License. -/* - Package libvirt provides a pure Go interface for Libvirt. - - Rather than using Libvirt's C bindings, this package makes use of - Libvirt's RPC interface, as documented here: https://libvirt.org/internals/rpc.html. - Connections to the libvirt server may be local, or remote. RPC packets are encoded - using the XDR standard as defined by RFC 4506. - - This should be considered a work in progress. Most functionaly provided by the C - bindings have not yet made their way into this library. Pull requests are welcome! - The definition of the RPC protocol is in the libvirt source tree under src/rpc/virnetprotocol.x. - - Example usage: - - package main - - import ( - "fmt" - "log" - "net" - "time" - - "github.com/digitalocean/go-libvirt" - ) - - func main() { - //c, err := net.DialTimeout("tcp", "127.0.0.1:16509", 2*time.Second) - //c, err := net.DialTimeout("tcp", "192.168.1.12:16509", 2*time.Second) - c, err := net.DialTimeout("unix", "/var/run/libvirt/libvirt-sock", 2*time.Second) - if err != nil { - log.Fatalf("failed to dial libvirt: %v", err) - } - - l := libvirt.New(c) - if err := l.Connect(); err != nil { - log.Fatalf("failed to connect: %v", err) - } - - v, err := l.Version() - if err != nil { - log.Fatalf("failed to retrieve libvirt version: %v", err) - } - fmt.Println("Version:", v) - - domains, err := l.Domains() - if err != nil { - log.Fatalf("failed to retrieve domains: %v", err) - } - - fmt.Println("ID\tName\t\tUUID") - fmt.Printf("--------------------------------------------------------\n") - for _, d := range domains { - fmt.Printf("%d\t%s\t%x\n", d.ID, d.Name, d.UUID) - } - - if err := l.Disconnect(); err != nil { - log.Fatal("failed to disconnect: %v", err) - } - } -*/ - +// Package libvirt is a pure Go interface to libvirt. +// +// Rather than using Libvirt's C bindings, this package makes use of Libvirt's +// RPC interface, as documented here: https://libvirt.org/internals/rpc.html. +// Connections to the libvirt server may be local, or remote. RPC packets are +// encoded using the XDR standard as defined by RFC 4506. +// +// Example usage: +// +// package main +// +// import ( +// "fmt" +// "log" +// "net" +// "time" +// +// "github.com/digitalocean/go-libvirt" +// ) +// +// func main() { +// // This dials libvirt on the local machine, but you can substitute the first +// // two parameters with "tcp", ":" to connect to libvirt on +// // a remote machine. +// c, err := net.DialTimeout("unix", "/var/run/libvirt/libvirt-sock", 2*time.Second) +// if err != nil { +// log.Fatalf("failed to dial libvirt: %v", err) +// } +// +// l := libvirt.New(c) +// if err := l.Connect(); err != nil { +// log.Fatalf("failed to connect: %v", err) +// } +// +// v, err := l.Version() +// if err != nil { +// log.Fatalf("failed to retrieve libvirt version: %v", err) +// } +// fmt.Println("Version:", v) +// +// domains, err := l.Domains() +// if err != nil { +// log.Fatalf("failed to retrieve domains: %v", err) +// } +// +// fmt.Println("ID\tName\t\tUUID") +// fmt.Printf("--------------------------------------------------------\n") +// for _, d := range domains { +// fmt.Printf("%d\t%s\t%x\n", d.ID, d.Name, d.UUID) +// } +// +// if err := l.Disconnect(); err != nil { +// log.Fatalf("failed to disconnect: %v", err) +// } +// } package libvirt diff --git a/vendor/github.com/digitalocean/go-libvirt/internal/constants/remote_protocol.gen.go b/vendor/github.com/digitalocean/go-libvirt/internal/constants/remote_protocol.gen.go index 9b9601cb98..ce46cde2c7 100644 --- a/vendor/github.com/digitalocean/go-libvirt/internal/constants/remote_protocol.gen.go +++ b/vendor/github.com/digitalocean/go-libvirt/internal/constants/remote_protocol.gen.go @@ -881,6 +881,8 @@ const ( ProcDomainAuthorizedSshKeysGet = 424 // ProcDomainAuthorizedSshKeysSet is libvirt's REMOTE_PROC_DOMAIN_AUTHORIZED_SSH_KEYS_SET ProcDomainAuthorizedSshKeysSet = 425 + // ProcDomainGetMessages is libvirt's REMOTE_PROC_DOMAIN_GET_MESSAGES + ProcDomainGetMessages = 426 // From consts: @@ -1010,6 +1012,8 @@ const ( NetworkPortParametersMax = 16 // DomainAuthorizedSshKeysMax is libvirt's REMOTE_DOMAIN_AUTHORIZED_SSH_KEYS_MAX DomainAuthorizedSshKeysMax = 2048 + // DomainMessagesMax is libvirt's REMOTE_DOMAIN_MESSAGES_MAX + DomainMessagesMax = 2048 // DomainEventGraphicsIdentityMax is libvirt's REMOTE_DOMAIN_EVENT_GRAPHICS_IDENTITY_MAX DomainEventGraphicsIdentityMax = 20 // Program is libvirt's REMOTE_PROGRAM diff --git a/vendor/github.com/digitalocean/go-libvirt/internal/event/stream.go b/vendor/github.com/digitalocean/go-libvirt/internal/event/stream.go index b14e41b645..98ae269206 100644 --- a/vendor/github.com/digitalocean/go-libvirt/internal/event/stream.go +++ b/vendor/github.com/digitalocean/go-libvirt/internal/event/stream.go @@ -14,7 +14,16 @@ package event -import "context" +import ( + "context" +) + +// emptyEvent is used as a zero-value. Clients will never receive one of these; +// they are only here to satisfy the compiler. See the comments in process() for +// more information. +type emptyEvent struct{} + +func (emptyEvent) GetCallbackID() int32 { return 0 } // Stream is an unbounded buffered event channel. The implementation // consists of a pair of unbuffered channels and a goroutine to manage them. @@ -28,12 +37,45 @@ type Stream struct { // manage unbounded channel behavior. queue []Event + qlen chan (chan int) in, out chan Event // terminates processing shutdown context.CancelFunc } +// NewStream configures a new Event Stream. Incoming events are appended to a +// queue, which is then relayed to the listening client. Client behavior will +// not cause incoming events to block. It is the responsibility of the caller +// to terminate the Stream via Shutdown() when no longer in use. +func NewStream(program uint32, cbID int32) *Stream { + s := &Stream{ + Program: program, + CallbackID: cbID, + in: make(chan Event), + out: make(chan Event), + qlen: make(chan (chan int)), + } + + // Start the processing loop, which will return a routine we can use to + // shut the queue down later. + s.shutdown = s.start() + + return s +} + +// Len will return the current count of events in the internal queue for a +// stream. It does this by sending a message to the stream's process() loop, +// which will then write the current length to the channel contained in that +// message. +func (s *Stream) Len() int { + // Send a request to the process() loop to get the current length of the + // queue + ch := make(chan int) + s.qlen <- ch + return <-ch +} + // Recv returns the next available event from the Stream's queue. func (s *Stream) Recv() chan Event { return s.out @@ -44,9 +86,9 @@ func (s *Stream) Push(e Event) { s.in <- e } -// Shutdown gracefully terminates Stream processing, releasing all -// internal resources. Events which have not yet been received by the client -// will be dropped. Subsequent calls to Shutdown() are idempotent. +// Shutdown gracefully terminates Stream processing, releasing all internal +// resources. Events which have not yet been received by the client will be +// dropped. Subsequent calls to Shutdown() are idempotent. func (s *Stream) Shutdown() { if s.shutdown != nil { s.shutdown() @@ -54,8 +96,7 @@ func (s *Stream) Shutdown() { } // start starts the event processing loop, which will continue to run until -// terminated by the returned context.CancelFunc. Starting a previously started -// Stream is an idempotent operation. +// terminated by the returned context.CancelFunc. func (s *Stream) start() context.CancelFunc { ctx, cancel := context.WithCancel(context.Background()) @@ -64,82 +105,53 @@ func (s *Stream) start() context.CancelFunc { return cancel } -// process manages an Stream's lifecycle until canceled by the provided -// context. Incoming events are appended to a queue which is then relayed to -// the a listening client. New events pushed onto the queue will not block due -// to client behavior. +// process manages an Stream's lifecycle until canceled by the provided context. +// Incoming events are appended to a queue which is then relayed to the +// listening client. New events pushed onto the queue will not block if the +// client is not actively polling for them; the stream will buffer them +// internally. func (s *Stream) process(ctx context.Context) { - defer func() { - close(s.in) - close(s.out) - }() + // Close the output channel so that clients know this stream is finished. + // We don't close s.in to avoid creating a race with the stream's Push() + // function. + defer close(s.out) + // This function is used to retrieve the next event from the queue, to be + // sent to the client. If there are no more events to send, it returns a nil + // channel and a zero-value event. + nextEvent := func() (chan Event, Event) { + sendCh := chan Event(nil) + next := Event(emptyEvent{}) + if len(s.queue) > 0 { + sendCh = s.out + next = s.queue[0] + } + return sendCh, next + } + + // The select statement in this loop relies on the fact that a send to a nil + // channel will block forever. If we have no entries in the queue, the + // sendCh variable will be nil, so the clause that attempts to send an event + // to the client will never complete. Clients will never receive an + // emptyEvent. for { - // informs send() to stop trying - nctx, next := context.WithCancel(ctx) - defer next() + sendCh, nextEvt := nextEvent() select { // new event received, append to queue case e := <-s.in: s.queue = append(s.queue, e) - // client recieved an event, pop from queue - case <-s.send(nctx): - if len(s.queue) > 1 { - s.queue = s.queue[1:] - } else { - s.queue = []Event{} - } + case lenCh := <-s.qlen: + lenCh <- len(s.queue) + + // client received an event, pop from queue + case sendCh <- nextEvt: + s.queue = s.queue[1:] // shutdown requested case <-ctx.Done(): return - } - - next() } } - -// send returns a channel which blocks until either the first item on the queue -// (if existing) is sent to the client, or the provided context is canceled. -// The stream's queue is never modified. -func (s *Stream) send(ctx context.Context) <-chan struct{} { - ch := make(chan struct{}) - - go func() { - defer close(ch) - - // do nothing and block if the queue is empty - if len(s.queue) == 0 { - <-ctx.Done() - return - } - - // otherwise, attempt to send the event - select { - case s.out <- s.queue[0]: - case <-ctx.Done(): - } - }() - - return ch -} - -// NewStream configures a new Event Stream. Incoming events are appended to a -// queue, which is then relayed to the listening client. Client behavior will -// not cause incoming events to block. It is the responsibility of the caller -// to terminate the Stream via Shutdown() when no longer in use. -func NewStream(program uint32, cbID int32) *Stream { - ic := &Stream{ - Program: program, - CallbackID: cbID, - in: make(chan Event), - out: make(chan Event), - } - - ic.shutdown = ic.start() - - return ic -} diff --git a/vendor/github.com/digitalocean/go-libvirt/libvirt.go b/vendor/github.com/digitalocean/go-libvirt/libvirt.go index a76eafdd2b..6224d3de6e 100644 --- a/vendor/github.com/digitalocean/go-libvirt/libvirt.go +++ b/vendor/github.com/digitalocean/go-libvirt/libvirt.go @@ -12,8 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Package libvirt is a pure Go implementation of the libvirt RPC protocol. -// For more information on the protocol, see https://libvirt.org/internals/l.html package libvirt // We'll use c-for-go to extract the consts and typedefs from the libvirt @@ -21,7 +19,6 @@ package libvirt //go:generate scripts/gen-consts.sh import ( - "bufio" "bytes" "context" "encoding/json" @@ -29,22 +26,47 @@ import ( "fmt" "net" "sync" + "syscall" + "time" "github.com/digitalocean/go-libvirt/internal/constants" "github.com/digitalocean/go-libvirt/internal/event" xdr "github.com/digitalocean/go-libvirt/internal/go-xdr/xdr2" + "github.com/digitalocean/go-libvirt/socket" + "github.com/digitalocean/go-libvirt/socket/dialers" ) // ErrEventsNotSupported is returned by Events() if event streams // are unsupported by either QEMU or libvirt. var ErrEventsNotSupported = errors.New("event monitor is not supported") +// ConnectURI defines a type for driver URIs for libvirt +// the defined constants are *not* exhaustive as there are also options +// e.g. to connect remote via SSH +type ConnectURI string + +const ( + // QEMUSystem connects to a QEMU system mode daemon + QEMUSystem ConnectURI = "qemu:///system" + // QEMUSession connects to a QEMU session mode daemon (unprivileged) + QEMUSession ConnectURI = "qemu:///session" + // XenSystem connects to a Xen system mode daemon + XenSystem ConnectURI = "xen:///system" + //TestDefault connect to default mock driver + TestDefault ConnectURI = "test:///default" + + // disconnectedTimeout is how long to wait for disconnect cleanup to + // complete + disconnectTimeout = 5 * time.Second +) + // Libvirt implements libvirt's remote procedure call protocol. type Libvirt struct { - conn net.Conn - r *bufio.Reader - w *bufio.Writer - mu *sync.Mutex + // socket connection + socket *socket.Socket + // closed after cleanup complete following the underlying connection to + // libvirt being disconnected. + disconnected chan struct{} // method callbacks cmux sync.RWMutex @@ -93,16 +115,39 @@ func (l *Libvirt) Capabilities() ([]byte, error) { return []byte(caps), err } -// Connect establishes communication with the libvirt server. -// The underlying libvirt socket connection must be previously established. -func (l *Libvirt) Connect() error { +// called at connection time, authenticating with all supported auth types +func (l *Libvirt) authenticate() error { + // libvirt requires that we call auth-list prior to connecting, + // even when no authentication is used. + resp, err := l.AuthList() + if err != nil { + return err + } + + for _, auth := range resp { + switch auth { + case constants.AuthNone: + case constants.AuthPolkit: + _, err := l.AuthPolkit() + if err != nil { + return err + } + default: + continue + } + break + } + return nil +} + +func (l *Libvirt) initLibvirtComms(uri ConnectURI) error { payload := struct { Padding [3]byte Name string Flags uint32 }{ Padding: [3]byte{0x1, 0x0, 0x0}, - Name: "qemu:///system", + Name: string(uri), Flags: 0, } @@ -111,9 +156,7 @@ func (l *Libvirt) Connect() error { return err } - // libvirt requires that we call auth-list prior to connecting, - // event when no authentication is used. - _, err = l.request(constants.ProcAuthList, constants.Program, buf) + err = l.authenticate() if err != nil { return err } @@ -126,24 +169,76 @@ func (l *Libvirt) Connect() error { return nil } -// Disconnect shuts down communication with the libvirt server and closes the -// underlying net.Conn. -func (l *Libvirt) Disconnect() error { - // close event streams - for _, ev := range l.events { - l.unsubscribeEvents(ev) - } - - // Deregister all callbacks to prevent blocking on clients with - // outstanding requests - l.deregisterAll() - - _, err := l.request(constants.ProcConnectClose, constants.Program, nil) +// ConnectToURI establishes communication with the specified libvirt driver +// The underlying libvirt socket connection will be created via the dialer. +// Since the connection can be lost, the Disconnected function can be used +// to monitor for a lost connection. +func (l *Libvirt) ConnectToURI(uri ConnectURI) error { + err := l.socket.Connect() if err != nil { return err } - return l.conn.Close() + // Start watching the underlying socket connection immediately. + // If we don't, and Libvirt goes away partway through initLibvirtComms, + // then the callbacks that initLibvirtComms has registered will never + // be closed, and therefore it will be stuck waiting for data from a + // channel that will never arrive. + go l.waitAndDisconnect() + + err = l.initLibvirtComms(uri) + if err != nil { + l.socket.Disconnect() + return err + } + + l.disconnected = make(chan struct{}) + + return nil +} + +// Connect establishes communication with the libvirt server. +// The underlying libvirt socket connection will be created via the dialer. +// Since the connection can be lost, the Disconnected function can be used +// to monitor for a lost connection. +func (l *Libvirt) Connect() error { + return l.ConnectToURI(QEMUSystem) +} + +// Disconnect shuts down communication with the libvirt server and closes the +// underlying net.Conn. +func (l *Libvirt) Disconnect() error { + // Ordering is important here. We want to make sure the connection is closed + // before unsubscribing and deregistering the events and requests, to + // prevent new requests from racing. + _, err := l.request(constants.ProcConnectClose, constants.Program, nil) + + // syscall.EINVAL is returned by the socket pkg when things have already + // been disconnected. + if err != nil && err != syscall.EINVAL { + return err + } + err = l.socket.Disconnect() + if err != nil { + return err + } + + // wait for the listen goroutine to detect the lost connection and clean up + // to happen once it returns. Safeguard with a timeout. + // Things not fully cleaned up is better than a deadlock. + select { + case <-l.disconnected: + case <-time.After(disconnectTimeout): + } + + return err +} + +// Disconnected allows callers to detect if the underlying connection +// to libvirt has been closed. If the returned channel is closed, then +// the connection to libvirt has been lost (or disconnected intentionally). +func (l *Libvirt) Disconnected() <-chan struct{} { + return l.disconnected } // Domains returns a list of all domains managed by libvirt. @@ -192,7 +287,7 @@ func (l *Libvirt) SubscribeQEMUEvents(ctx context.Context, dom string) (<-chan D defer cancel() defer l.unsubscribeQEMUEvents(stream) defer stream.Shutdown() - defer func() { close(ch) }() + defer close(ch) for { select { @@ -260,10 +355,10 @@ func (l *Libvirt) SubscribeEvents(ctx context.Context, eventID DomainEventID, // unsubscribeEvents stops the flow of the specified events from libvirt. There // are two steps to this process: a call to libvirt to deregister our callback, -// and then removing the callback from the list used by the `route` fucntion. If +// and then removing the callback from the list used by the `Route` function. If // the deregister call fails, we'll return the error, but still remove the // callback from the list. That's ok; if any events arrive after this point, the -// route function will drop them when it finds no registered handler. +// Route function will drop them when it finds no registered handler. func (l *Libvirt) unsubscribeEvents(stream *event.Stream) error { err := l.ConnectDomainEventCallbackDeregisterAny(stream.CallbackID) l.removeStream(stream.CallbackID) @@ -590,19 +685,85 @@ func getQEMUError(r response) error { return nil } -// New configures a new Libvirt RPC connection. -func New(conn net.Conn) *Libvirt { - l := &Libvirt{ - conn: conn, - s: 0, - r: bufio.NewReader(conn), - w: bufio.NewWriter(conn), - mu: &sync.Mutex{}, - callbacks: make(map[int32]chan response), - events: make(map[int32]*event.Stream), +func (l *Libvirt) waitAndDisconnect() { + // wait for the socket to indicate if/when it's been disconnected + <-l.socket.Disconnected() + + // close event streams + l.removeAllStreams() + + // Deregister all callbacks to prevent blocking on clients with + // outstanding requests + l.deregisterAll() + + select { + case <-l.disconnected: + // l.disconnected is already closed, i.e., Libvirt.ConnectToURI + // was unable to complete all phases of its connection and + // so this hadn't been assigned to an open channel yet (it + // is set to a closed channel in Libvirt.New*) + // + // Just return to avoid closing an already-closed channel. + return + default: + // if we make it here then reading from l.disconnected is blocking, + // which suggests that it is open and must be closed. } - go l.listen() + close(l.disconnected) +} + +// NewWithDialer configures a new Libvirt object that can be used to perform +// RPCs via libvirt's socket. The actual connection will not be established +// until Connect is called. The same Libvirt object may be used to re-connect +// multiple times. +func NewWithDialer(dialer socket.Dialer) *Libvirt { + l := &Libvirt{ + s: 0, + disconnected: make(chan struct{}), + callbacks: make(map[int32]chan response), + events: make(map[int32]*event.Stream), + } + + l.socket = socket.New(dialer, l) + + // we start with a closed channel since that indicates no connection + close(l.disconnected) return l } + +// New configures a new Libvirt RPC connection. +// This function only remains to retain backwards compatability. +// When Libvirt's Connect function is called, the Dial will simply return the +// connection passed in here and start a goroutine listening/reading from it. +// If at any point the Disconnect function is called, any subsequent Connect +// call will simply return an already closed connection. +// +// Deprecated: Please use NewWithDialer. +func New(conn net.Conn) *Libvirt { + return NewWithDialer(dialers.NewAlreadyConnected(conn)) +} + +// NetworkUpdateCompat is a wrapper over NetworkUpdate which swaps `Command` and `Section` when needed. +// This function must be used instead of NetworkUpdate to be sure that the +// NetworkUpdate call works both with older and newer libvirtd connections. +// +// libvirt on-wire protocol had a bug for a long time where Command and Section +// were reversed. It's been fixed in newer libvirt versions, and backported to +// some older versions. This helper detects what argument order libvirtd expects +// and makes the correct NetworkUpdate call. +func (l *Libvirt) NetworkUpdateCompat(Net Network, Command NetworkUpdateCommand, Section NetworkUpdateSection, ParentIndex int32, XML string, Flags NetworkUpdateFlags) (err error) { + // This is defined in libvirt/src/libvirt_internal.h and thus not available in go-libvirt autogenerated code + const virDrvFeatureNetworkUpdateHasCorrectOrder = 16 + hasCorrectOrder, err := l.ConnectSupportsFeature(virDrvFeatureNetworkUpdateHasCorrectOrder) + if err != nil { + return fmt.Errorf("failed to confirm argument order for NetworkUpdate: %w", err) + } + + // https://gitlab.com/libvirt/libvirt/-/commit/b0f78d626a18bcecae3a4d165540ab88bfbfc9ee + if hasCorrectOrder == 0 { + return l.NetworkUpdate(Net, uint32(Section), uint32(Command), ParentIndex, XML, Flags) + } + return l.NetworkUpdate(Net, uint32(Command), uint32(Section), ParentIndex, XML, Flags) +} diff --git a/vendor/github.com/digitalocean/go-libvirt/libvirt.yml b/vendor/github.com/digitalocean/go-libvirt/libvirt.yml index 4d6cc2d501..08a3e3b5d4 100644 --- a/vendor/github.com/digitalocean/go-libvirt/libvirt.yml +++ b/vendor/github.com/digitalocean/go-libvirt/libvirt.yml @@ -27,7 +27,7 @@ PARSER: # rely on our caller to link the libvirt source directory to lv_source/, and # run on that code. This isn't ideal, but changes to c-for-go are needed to # fix it. - IncludePaths: [./lv_source/include] + IncludePaths: [./lv_source/include, ./lv_source/build/include] SourcesPaths: - libvirt/libvirt.h - libvirt/virterror.h @@ -56,7 +56,7 @@ TRANSLATOR: - {action: replace, from: "Rpc([A-Z]|$)", to: "RPC$1"} - {action: replace, from: "Ssh([A-Z]|$)", to: "SSH$1"} - {action: replace, from: "Http([A-Z]|$)", to: "HTTP$1"} - - {transform: unexport, from: "^(Err|From|War)"} + - {transform: unexport, from: "^From"} const: - {action: accept, from: "^VIR_"} # Special case to prevent a collision with a type: diff --git a/vendor/github.com/digitalocean/go-libvirt/libvirtd.conf b/vendor/github.com/digitalocean/go-libvirt/libvirtd.conf deleted file mode 100644 index d416d7ba3f..0000000000 --- a/vendor/github.com/digitalocean/go-libvirt/libvirtd.conf +++ /dev/null @@ -1,7 +0,0 @@ -# libvirtd configuration for travis-ci -listen_tls = 0 -listen_tcp = 1 -tcp_port = "16509" -listen_addr = "127.0.0.1" -auth_unix_rw = "none" -auth_tcp = "none" diff --git a/vendor/github.com/digitalocean/go-libvirt/remote_protocol.gen.go b/vendor/github.com/digitalocean/go-libvirt/remote_protocol.gen.go index 0021e866e1..db8f847608 100644 --- a/vendor/github.com/digitalocean/go-libvirt/remote_protocol.gen.go +++ b/vendor/github.com/digitalocean/go-libvirt/remote_protocol.gen.go @@ -147,8 +147,8 @@ type DomainSnapshot struct { Dom Domain } -// Error is libvirt's remote_error -type Error struct { +// remote_error is libvirt's remote_error +type remote_error struct { Code int32 OptDomain int32 Message OptString @@ -191,7 +191,7 @@ type NodeGetMemoryStats struct { // DomainDiskError is libvirt's remote_domain_disk_error type DomainDiskError struct { Disk string - Error int32 + remote_error int32 } // ConnectOpenArgs is libvirt's remote_connect_open_args @@ -1371,7 +1371,7 @@ type DomainGetCPUStatsRet struct { // DomainGetHostnameArgs is libvirt's remote_domain_get_hostname_args type DomainGetHostnameArgs struct { Dom Domain - Flags uint32 + Flags DomainGetHostnameFlags } // DomainGetHostnameRet is libvirt's remote_domain_get_hostname_ret @@ -4119,6 +4119,17 @@ type DomainAuthorizedSshKeysSetArgs struct { Flags uint32 } +// DomainGetMessagesArgs is libvirt's remote_domain_get_messages_args +type DomainGetMessagesArgs struct { + Dom Domain + Flags uint32 +} + +// DomainGetMessagesRet is libvirt's remote_domain_get_messages_ret +type DomainGetMessagesRet struct { + Msgs []string +} + // TypedParamValue is a discriminated union. type TypedParamValue struct { @@ -12387,7 +12398,7 @@ func (l *Libvirt) DomainEventBalloonChange() (err error) { } // DomainGetHostname is the go wrapper for REMOTE_PROC_DOMAIN_GET_HOSTNAME. -func (l *Libvirt) DomainGetHostname(Dom Domain, Flags uint32) (rHostname string, err error) { +func (l *Libvirt) DomainGetHostname(Dom Domain, Flags DomainGetHostnameFlags) (rHostname string, err error) { var buf []byte args := DomainGetHostnameArgs { @@ -16447,3 +16458,37 @@ func (l *Libvirt) DomainAuthorizedSshKeysSet(Dom Domain, User string, Keys []str return } +// DomainGetMessages is the go wrapper for REMOTE_PROC_DOMAIN_GET_MESSAGES. +func (l *Libvirt) DomainGetMessages(Dom Domain, Flags uint32) (rMsgs []string, err error) { + var buf []byte + + args := DomainGetMessagesArgs { + Dom: Dom, + Flags: Flags, + } + + buf, err = encode(&args) + if err != nil { + return + } + + var r response + r, err = l.requestStream(426, constants.Program, buf, nil, nil) + if err != nil { + return + } + + // Return value unmarshaling + tpd := typedParamDecoder{} + ct := map[string]xdr.TypeDecoder{"libvirt.TypedParam": tpd} + rdr := bytes.NewReader(r.Payload) + dec := xdr.NewDecoderCustomTypes(rdr, 0, ct) + // Msgs: []string + _, err = dec.Decode(&rMsgs) + if err != nil { + return + } + + return +} + diff --git a/vendor/github.com/digitalocean/go-libvirt/rpc.go b/vendor/github.com/digitalocean/go-libvirt/rpc.go index 8181e09914..1100e23c1e 100644 --- a/vendor/github.com/digitalocean/go-libvirt/rpc.go +++ b/vendor/github.com/digitalocean/go-libvirt/rpc.go @@ -16,166 +16,55 @@ package libvirt import ( "bytes" - "encoding/binary" "errors" "fmt" "io" "reflect" "strings" "sync/atomic" - "unsafe" "github.com/digitalocean/go-libvirt/internal/constants" "github.com/digitalocean/go-libvirt/internal/event" xdr "github.com/digitalocean/go-libvirt/internal/go-xdr/xdr2" + "github.com/digitalocean/go-libvirt/socket" ) // ErrUnsupported is returned if a procedure is not supported by libvirt var ErrUnsupported = errors.New("unsupported procedure requested") -// request and response types -const ( - // Call is used when making calls to the remote server. - Call = iota - - // Reply indicates a server reply. - Reply - - // Message is an asynchronous notification. - Message - - // Stream represents a stream data packet. - Stream - - // CallWithFDs is used by a client to indicate the request has - // arguments with file descriptors. - CallWithFDs - - // ReplyWithFDs is used by a server to indicate the request has - // arguments with file descriptors. - ReplyWithFDs -) - -// request and response statuses -const ( - // StatusOK is always set for method calls or events. - // For replies it indicates successful completion of the method. - // For streams it indicates confirmation of the end of file on the stream. - StatusOK = iota - - // StatusError for replies indicates that the method call failed - // and error information is being returned. For streams this indicates - // that not all data was sent and the stream has aborted. - StatusError - - // StatusContinue is only used for streams. - // This indicates that further data packets will be following. - StatusContinue -) - -// header is a libvirt rpc packet header -type header struct { - // Program identifier - Program uint32 - - // Program version - Version uint32 - - // Remote procedure identifier - Procedure uint32 - - // Call type, e.g., Reply - Type uint32 - - // Call serial number - Serial int32 - - // Request status, e.g., StatusOK - Status uint32 -} - -// packet represents a RPC request or response. -type packet struct { - // Size of packet, in bytes, including length. - // Len + Header + Payload - Len uint32 - Header header -} - -// Global packet instance, for use with unsafe.Sizeof() -var _p packet - // internal rpc response type response struct { Payload []byte Status uint32 } -// libvirt error response -type libvirtError struct { - Code uint32 - DomainID uint32 - Padding uint8 - Message string - Level uint32 +// Error reponse from libvirt +type Error struct { + Code uint32 + Message string } -func (e libvirtError) Error() string { +func (e Error) Error() string { return e.Message } // checkError is used to check whether an error is a libvirtError, and if it is, // whether its error code matches the one passed in. It will return false if // these conditions are not met. -func checkError(err error, expectedError errorNumber) bool { - e, ok := err.(libvirtError) - if ok { - return e.Code == uint32(expectedError) +func checkError(err error, expectedError ErrorNumber) bool { + for err != nil { + e, ok := err.(Error) + if ok { + return e.Code == uint32(expectedError) + } + err = errors.Unwrap(err) } return false } // IsNotFound detects libvirt's ERR_NO_DOMAIN. func IsNotFound(err error) bool { - return checkError(err, errNoDomain) -} - -// listen processes incoming data and routes -// responses to their respective callback handler. -func (l *Libvirt) listen() { - for { - // response packet length - length, err := pktlen(l.r) - if err != nil { - // When the underlying connection EOFs or is closed, stop - // this goroutine - if err == io.EOF || strings.Contains(err.Error(), "use of closed network connection") { - return - } - - // invalid packet - continue - } - - // response header - h, err := extractHeader(l.r) - if err != nil { - // invalid packet - continue - } - - // payload: packet length minus what was previously read - size := int(length) - int(unsafe.Sizeof(_p)) - buf := make([]byte, size) - _, err = io.ReadFull(l.r, buf) - if err != nil { - // invalid packet - continue - } - - // route response to caller - l.route(h, buf) - } + return checkError(err, ErrNoDomain) } // callback sends RPC responses to respective callers. @@ -191,9 +80,9 @@ func (l *Libvirt) callback(id int32, res response) { c <- res } -// route sends incoming packets to their listeners. -func (l *Libvirt) route(h *header, buf []byte) { - // route events to their respective listener +// Route sends incoming packets to their listeners. +func (l *Libvirt) Route(h *socket.Header, buf []byte) { + // Route events to their respective listener var event event.Event switch { @@ -243,24 +132,36 @@ func (l *Libvirt) addStream(s *event.Stream) { l.events[s.CallbackID] = s } -// removeStream notifies the libvirt server to stop sending events for the -// provided callback ID. Upon successful de-registration the callback handler -// is destroyed. Subsequent calls to removeStream are idempotent and return -// nil. -// TODO: Fix this comment +// removeStream deletes an event stream. The caller should first notify libvirt +// to stop sending events for this stream. Subsequent calls to removeStream are +// idempotent and return nil. func (l *Libvirt) removeStream(id int32) error { l.emux.Lock() defer l.emux.Unlock() // if the event is already removed, just return nil - _, ok := l.events[id] + q, ok := l.events[id] if ok { delete(l.events, id) + q.Shutdown() } return nil } +// removeAllStreams deletes all event streams. This is meant to be used to +// clean up only once the underlying connection to libvirt is disconnected and +// thus does not attempt to notify libvirt to stop sending events. +func (l *Libvirt) removeAllStreams() { + l.emux.Lock() + defer l.emux.Unlock() + + for _, ev := range l.events { + ev.Shutdown() + delete(l.events, ev.CallbackID) + } +} + // register configures a method response callback func (l *Libvirt) register(id int32, c chan response) { l.cmux.Lock() @@ -316,7 +217,8 @@ func (l *Libvirt) requestStream(proc uint32, program uint32, payload []byte, l.deregister(serial) }() - err := l.sendPacket(serial, proc, program, payload, Call, StatusOK) + err := l.socket.SendPacket(serial, proc, program, payload, socket.Call, + socket.StatusOK) if err != nil { return response{}, err } @@ -330,7 +232,7 @@ func (l *Libvirt) requestStream(proc uint32, program uint32, payload []byte, abort := make(chan bool) outErr := make(chan error) go func() { - outErr <- l.sendStream(serial, proc, program, out, abort) + outErr <- l.socket.SendStream(serial, proc, program, out, abort) }() // Even without incoming stream server sends confirmation once all data is received @@ -365,7 +267,7 @@ func (l *Libvirt) processIncomingStream(c chan response, inStream io.Writer) (re } // StatusOK indicates end of stream - if resp.Status == StatusOK { + if resp.Status == socket.StatusOK { return resp, nil } @@ -386,77 +288,9 @@ func (l *Libvirt) processIncomingStream(c chan response, inStream io.Writer) (re } } -func (l *Libvirt) sendStream(serial int32, proc uint32, program uint32, stream io.Reader, abort chan bool) error { - // Keep total packet length under 4 MiB to follow possible limitation in libvirt server code - buf := make([]byte, 4*MiB-unsafe.Sizeof(_p)) - for { - select { - case <-abort: - return l.sendPacket(serial, proc, program, nil, Stream, StatusError) - default: - } - n, err := stream.Read(buf) - if n > 0 { - err2 := l.sendPacket(serial, proc, program, buf[:n], Stream, StatusContinue) - if err2 != nil { - return err2 - } - } - if err != nil { - if err == io.EOF { - return l.sendPacket(serial, proc, program, nil, Stream, StatusOK) - } - // keep original error - err2 := l.sendPacket(serial, proc, program, nil, Stream, StatusError) - if err2 != nil { - return err2 - } - return err - } - } -} - -func (l *Libvirt) sendPacket(serial int32, proc uint32, program uint32, payload []byte, typ uint32, status uint32) error { - - p := packet{ - Header: header{ - Program: program, - Version: constants.ProtocolVersion, - Procedure: proc, - Type: typ, - Serial: serial, - Status: status, - }, - } - - size := int(unsafe.Sizeof(p.Len)) + int(unsafe.Sizeof(p.Header)) - if payload != nil { - size += len(payload) - } - p.Len = uint32(size) - - // write header - l.mu.Lock() - defer l.mu.Unlock() - err := binary.Write(l.w, binary.BigEndian, p) - if err != nil { - return err - } - - // write payload - if payload != nil { - err = binary.Write(l.w, binary.BigEndian, payload) - if err != nil { - return err - } - } - - return l.w.Flush() -} - func (l *Libvirt) getResponse(c chan response) (response, error) { resp := <-c - if resp.Status == StatusError { + if resp.Status == socket.StatusError { return resp, decodeError(resp.Payload) } @@ -473,9 +307,15 @@ func encode(data interface{}) ([]byte, error) { // decodeError extracts an error message from the provider buffer. func decodeError(buf []byte) error { - var e libvirtError - dec := xdr.NewDecoder(bytes.NewReader(buf)) + + e := struct { + Code uint32 + DomainID uint32 + Padding uint8 + Message string + Level uint32 + }{} _, err := dec.Decode(&e) if err != nil { return err @@ -484,12 +324,13 @@ func decodeError(buf []byte) error { if strings.Contains(e.Message, "unknown procedure") { return ErrUnsupported } + // if libvirt returns ERR_OK, ignore the error - if checkError(e, errOk) { + if ErrorNumber(e.Code) == ErrOk { return nil } - return e + return Error{Code: uint32(e.Code), Message: e.Message} } // eventDecoder decodes an event from a xdr buffer. @@ -499,40 +340,6 @@ func eventDecoder(buf []byte, e interface{}) error { return err } -// pktlen returns the length of an incoming RPC packet. Read errors will -// result in a returned response length of 0 and a non-nil error. -func pktlen(r io.Reader) (uint32, error) { - buf := make([]byte, unsafe.Sizeof(_p.Len)) - - // extract the packet's length from the header - _, err := io.ReadFull(r, buf) - if err != nil { - return 0, err - } - - return binary.BigEndian.Uint32(buf), nil -} - -// extractHeader returns the decoded header from an incoming response. -func extractHeader(r io.Reader) (*header, error) { - buf := make([]byte, unsafe.Sizeof(_p.Header)) - - // extract the packet's header from r - _, err := io.ReadFull(r, buf) - if err != nil { - return nil, err - } - - return &header{ - Program: binary.BigEndian.Uint32(buf[0:4]), - Version: binary.BigEndian.Uint32(buf[4:8]), - Procedure: binary.BigEndian.Uint32(buf[8:12]), - Type: binary.BigEndian.Uint32(buf[12:16]), - Serial: int32(binary.BigEndian.Uint32(buf[16:20])), - Status: binary.BigEndian.Uint32(buf[20:24]), - }, nil -} - type typedParamDecoder struct{} // Decode decodes a TypedParam. These are part of the libvirt spec, and not xdr diff --git a/vendor/github.com/digitalocean/go-libvirt/socket/dialers/already_connected.go b/vendor/github.com/digitalocean/go-libvirt/socket/dialers/already_connected.go new file mode 100644 index 0000000000..e1640317b1 --- /dev/null +++ b/vendor/github.com/digitalocean/go-libvirt/socket/dialers/already_connected.go @@ -0,0 +1,26 @@ +package dialers + +import ( + "net" +) + +// AlreadyConnected implements a dialer interface for a connection that was +// established prior to initializing the socket object. This exists solely +// for backwards compatability with the previous implementation of Libvirt +// that took an already established connection. +type AlreadyConnected struct { + c net.Conn +} + +// NewAlreadyConnected is a noop dialer to simply use a connection previously +// established. This means any re-dial attempts simply won't work. +func NewAlreadyConnected(c net.Conn) AlreadyConnected { + return AlreadyConnected{c} +} + +// Dial just returns the connection previously established. +// If at some point it is disconnected by the client, this obviously does *not* +// re-dial and will simply return the already closed connection. +func (a AlreadyConnected) Dial() (net.Conn, error) { + return a.c, nil +} diff --git a/vendor/github.com/digitalocean/go-libvirt/socket/dialers/local.go b/vendor/github.com/digitalocean/go-libvirt/socket/dialers/local.go new file mode 100644 index 0000000000..1b71079974 --- /dev/null +++ b/vendor/github.com/digitalocean/go-libvirt/socket/dialers/local.go @@ -0,0 +1,57 @@ +package dialers + +import ( + "net" + "time" +) + +const ( + // defaultSocket specifies the default path to the libvirt unix socket. + defaultSocket = "/var/run/libvirt/libvirt-sock" + + // defaultLocalTimeout specifies the default libvirt dial timeout. + defaultLocalTimeout = 15 * time.Second +) + +// Local implements connecting to a local libvirtd over the unix socket. +type Local struct { + timeout time.Duration + socket string +} + +// LocalOption is a function for setting local socket options. +type LocalOption func(*Local) + +// WithLocalTimeout sets the dial timeout. +func WithLocalTimeout(timeout time.Duration) LocalOption { + return func(l *Local) { + l.timeout = timeout + } +} + +// WithSocket sets the path to the local libvirt socket. +func WithSocket(socket string) LocalOption { + return func(l *Local) { + l.socket = socket + } +} + +// NewLocal is a default dialer to simply connect to a locally running libvirt's +// socket. +func NewLocal(opts ...LocalOption) *Local { + l := &Local{ + timeout: defaultLocalTimeout, + socket: defaultSocket, + } + + for _, opt := range opts { + opt(l) + } + + return l +} + +// Dial connects to a local socket +func (l *Local) Dial() (net.Conn, error) { + return net.DialTimeout("unix", l.socket, l.timeout) +} diff --git a/vendor/github.com/digitalocean/go-libvirt/socket/dialers/remote.go b/vendor/github.com/digitalocean/go-libvirt/socket/dialers/remote.go new file mode 100644 index 0000000000..a9a2f8084b --- /dev/null +++ b/vendor/github.com/digitalocean/go-libvirt/socket/dialers/remote.go @@ -0,0 +1,61 @@ +package dialers + +import ( + "net" + "time" +) + +const ( + // defaultRemotePort specifies the default libvirtd port. + defaultRemotePort = "16509" + + // defaultRemoteTimeout specifies the default libvirt dial timeout. + defaultRemoteTimeout = 20 * time.Second +) + +// Remote implements connecting to a remote server's libvirt using tcp +type Remote struct { + timeout time.Duration + host, port string +} + +// RemoteOption is a function for setting remote dialer options. +type RemoteOption func(*Remote) + +// WithRemoteTimeout sets the dial timeout. +func WithRemoteTimeout(timeout time.Duration) RemoteOption { + return func(r *Remote) { + r.timeout = timeout + } +} + +// UsePort sets the port to dial for libirt on the target host server. +func UsePort(port string) RemoteOption { + return func(r *Remote) { + r.port = port + } +} + +// NewRemote is a dialer for connecting to libvirt running on another server. +func NewRemote(hostAddr string, opts ...RemoteOption) *Remote { + r := &Remote{ + timeout: defaultRemoteTimeout, + host: hostAddr, + port: defaultRemotePort, + } + + for _, opt := range opts { + opt(r) + } + + return r +} + +// Dial connects to libvirt running on another server. +func (r *Remote) Dial() (net.Conn, error) { + return net.DialTimeout( + "tcp", + net.JoinHostPort(r.host, r.port), + r.timeout, + ) +} diff --git a/vendor/github.com/digitalocean/go-libvirt/socket/socket.go b/vendor/github.com/digitalocean/go-libvirt/socket/socket.go new file mode 100644 index 0000000000..472f803acf --- /dev/null +++ b/vendor/github.com/digitalocean/go-libvirt/socket/socket.go @@ -0,0 +1,376 @@ +package socket + +import ( + "bufio" + "encoding/binary" + "errors" + "io" + "net" + "sync" + "syscall" + "time" + "unsafe" + + "github.com/digitalocean/go-libvirt/internal/constants" +) + +const disconnectTimeout = 5 * time.Second + +// request and response statuses +const ( + // StatusOK is always set for method calls or events. + // For replies it indicates successful completion of the method. + // For streams it indicates confirmation of the end of file on the stream. + StatusOK = iota + + // StatusError for replies indicates that the method call failed + // and error information is being returned. For streams this indicates + // that not all data was sent and the stream has aborted. + StatusError + + // StatusContinue is only used for streams. + // This indicates that further data packets will be following. + StatusContinue +) + +// request and response types +const ( + // Call is used when making calls to the remote server. + Call = iota + + // Reply indicates a server reply. + Reply + + // Message is an asynchronous notification. + Message + + // Stream represents a stream data packet. + Stream + + // CallWithFDs is used by a client to indicate the request has + // arguments with file descriptors. + CallWithFDs + + // ReplyWithFDs is used by a server to indicate the request has + // arguments with file descriptors. + ReplyWithFDs +) + +// Dialer is an interface for connecting to libvirt's underlying socket. +type Dialer interface { + Dial() (net.Conn, error) +} + +// Router is an interface used to route packets to the appropriate clients. +type Router interface { + Route(*Header, []byte) +} + +// Socket represents a libvirt Socket and its connection state +type Socket struct { + dialer Dialer + router Router + + conn net.Conn + reader *bufio.Reader + writer *bufio.Writer + // used to serialize any Socket writes and any updates to conn, r, or w + mu *sync.Mutex + + // disconnected is closed when the listen goroutine associated with a + // Socket connection has returned. + disconnected chan struct{} +} + +// packet represents a RPC request or response. +type packet struct { + // Size of packet, in bytes, including length. + // Len + Header + Payload + Len uint32 + Header Header +} + +// Global packet instance, for use with unsafe.Sizeof() +var _p packet + +// Header is a libvirt rpc packet header +type Header struct { + // Program identifier + Program uint32 + + // Program version + Version uint32 + + // Remote procedure identifier + Procedure uint32 + + // Call type, e.g., Reply + Type uint32 + + // Call serial number + Serial int32 + + // Request status, e.g., StatusOK + Status uint32 +} + +// New initializes a new type for managing the Socket. +func New(dialer Dialer, router Router) *Socket { + s := &Socket{ + dialer: dialer, + router: router, + disconnected: make(chan struct{}), + mu: &sync.Mutex{}, + } + + // we start with a closed channel since that indicates no connection + close(s.disconnected) + + return s +} + +// Connect uses the dialer provided on creation to establish +// underlying physical connection to the desired libvirt. +func (s *Socket) Connect() error { + s.mu.Lock() + defer s.mu.Unlock() + + if !s.isDisconnected() { + return errors.New("already connected to socket") + } + conn, err := s.dialer.Dial() + if err != nil { + return err + } + + s.conn = conn + s.reader = bufio.NewReader(conn) + s.writer = bufio.NewWriter(conn) + s.disconnected = make(chan struct{}) + + go s.listenAndRoute() + + return nil +} + +// Disconnect closes the Socket connection to libvirt and waits for the reader +// gorouting to shut down. +func (s *Socket) Disconnect() error { + // just return if we're already disconnected + if s.isDisconnected() { + return nil + } + + err := s.conn.Close() + if err != nil { + return err + } + + // now we wait for the reader to return so as not to avoid it nil + // referencing + // Put this in a select, + // and have it only nil out the conn value if it doesn't fail + select { + case <-s.disconnected: + case <-time.After(disconnectTimeout): + return errors.New("timed out waiting for Disconnect cleanup") + } + + return nil +} + +// Disconnected returns a channel that will be closed once the current +// connection is closed. This can happen due to an explicit call to Disconnect +// from the client, or due to non-temporary Read or Write errors encountered. +func (s *Socket) Disconnected() <-chan struct{} { + return s.disconnected +} + +// isDisconnected is a non-blocking function to query whether a connection +// is disconnected or not. +func (s *Socket) isDisconnected() bool { + select { + case <-s.disconnected: + return true + default: + return false + } +} + +// listenAndRoute reads packets from the Socket and calls the provided +// Router function to route them +func (s *Socket) listenAndRoute() { + // only returns once it detects a non-temporary error related to the + // underlying connection + listen(s.reader, s.router) + + // signal any clients listening that the connection has been disconnected + close(s.disconnected) +} + +// listen processes incoming data and routes +// responses to their respective callback handler. +func listen(s io.Reader, router Router) { + for { + // response packet length + length, err := pktlen(s) + if err != nil { + if isTemporary(err) { + continue + } + // connection is no longer valid, so shutdown + return + } + + // response header + h, err := extractHeader(s) + if err != nil { + // invalid packet + continue + } + + // payload: packet length minus what was previously read + size := int(length) - int(unsafe.Sizeof(_p)) + buf := make([]byte, size) + _, err = io.ReadFull(s, buf) + if err != nil { + // invalid packet + continue + } + + // route response to caller + router.Route(h, buf) + } +} + +// isTemporary returns true if the error returned from a read is transient. +// If the error type is an OpError, check whether the net connection +// error condition is temporary (which means we can keep using the +// connection). +// Errors not of the net.OpError type tend to be things like io.EOF, +// syscall.EINVAL, or io.ErrClosedPipe (i.e. all things that +// indicate the connection in use is no longer valid.) +func isTemporary(err error) bool { + opErr, ok := err.(*net.OpError) + if ok { + return opErr.Temporary() + } + return false +} + +// pktlen returns the length of an incoming RPC packet. Read errors will +// result in a returned response length of 0 and a non-nil error. +func pktlen(r io.Reader) (uint32, error) { + buf := make([]byte, unsafe.Sizeof(_p.Len)) + + // extract the packet's length from the header + _, err := io.ReadFull(r, buf) + if err != nil { + return 0, err + } + + return binary.BigEndian.Uint32(buf), nil +} + +// extractHeader returns the decoded header from an incoming response. +func extractHeader(r io.Reader) (*Header, error) { + buf := make([]byte, unsafe.Sizeof(_p.Header)) + + // extract the packet's header from r + _, err := io.ReadFull(r, buf) + if err != nil { + return nil, err + } + + return &Header{ + Program: binary.BigEndian.Uint32(buf[0:4]), + Version: binary.BigEndian.Uint32(buf[4:8]), + Procedure: binary.BigEndian.Uint32(buf[8:12]), + Type: binary.BigEndian.Uint32(buf[12:16]), + Serial: int32(binary.BigEndian.Uint32(buf[16:20])), + Status: binary.BigEndian.Uint32(buf[20:24]), + }, nil +} + +// SendPacket sends a packet to libvirt on the socket connection. +func (s *Socket) SendPacket( + serial int32, + proc uint32, + program uint32, + payload []byte, + typ uint32, + status uint32, +) error { + p := packet{ + Header: Header{ + Program: program, + Version: constants.ProtocolVersion, + Procedure: proc, + Type: typ, + Serial: serial, + Status: status, + }, + } + + size := int(unsafe.Sizeof(p.Len)) + int(unsafe.Sizeof(p.Header)) + if payload != nil { + size += len(payload) + } + p.Len = uint32(size) + + if s.isDisconnected() { + // this mirrors what a lot of net code return on use of a no + // longer valid connection + return syscall.EINVAL + } + + s.mu.Lock() + defer s.mu.Unlock() + + err := binary.Write(s.writer, binary.BigEndian, p) + if err != nil { + return err + } + + // write payload + if payload != nil { + err = binary.Write(s.writer, binary.BigEndian, payload) + if err != nil { + return err + } + } + + return s.writer.Flush() +} + +// SendStream sends a stream of packets to libvirt on the socket connection. +func (s *Socket) SendStream(serial int32, proc uint32, program uint32, + stream io.Reader, abort chan bool) error { + // Keep total packet length under 4 MiB to follow possible limitation in libvirt server code + buf := make([]byte, 4*MiB-unsafe.Sizeof(_p)) + for { + select { + case <-abort: + return s.SendPacket(serial, proc, program, nil, Stream, StatusError) + default: + } + n, err := stream.Read(buf) + if n > 0 { + err2 := s.SendPacket(serial, proc, program, buf[:n], Stream, StatusContinue) + if err2 != nil { + return err2 + } + } + if err != nil { + if err == io.EOF { + return s.SendPacket(serial, proc, program, nil, Stream, StatusOK) + } + // keep original error + err2 := s.SendPacket(serial, proc, program, nil, Stream, StatusError) + if err2 != nil { + return err2 + } + return err + } + } +} diff --git a/vendor/github.com/digitalocean/go-libvirt/units.go b/vendor/github.com/digitalocean/go-libvirt/socket/units.go similarity index 89% rename from vendor/github.com/digitalocean/go-libvirt/units.go rename to vendor/github.com/digitalocean/go-libvirt/socket/units.go index 03686507f2..1ad2c0152a 100644 --- a/vendor/github.com/digitalocean/go-libvirt/units.go +++ b/vendor/github.com/digitalocean/go-libvirt/socket/units.go @@ -15,13 +15,13 @@ // This module provides different units of measurement to make other // code more readable. -package libvirt +package socket const ( - // B - byte - B = 1 - // KiB - kibibyte + // B - byte + B = 1 + // KiB - kibibyte KiB = 1024 * B - // MiB - mebibyte + // MiB - mebibyte MiB = 1024 * KiB ) diff --git a/vendor/github.com/digitalocean/go-qemu/qmp/rpc.go b/vendor/github.com/digitalocean/go-qemu/qmp/rpc.go index cb11c71fe8..dfedd2c59f 100644 --- a/vendor/github.com/digitalocean/go-qemu/qmp/rpc.go +++ b/vendor/github.com/digitalocean/go-qemu/qmp/rpc.go @@ -67,11 +67,11 @@ func (rpc *LibvirtRPCMonitor) Events(ctx context.Context) (<-chan Event, error) c := make(chan Event) go func() { + defer close(c) // process events for e := range events { qe, err := qmpEvent(&e) if err != nil { - close(c) break } diff --git a/vendor/github.com/digitalocean/go-qemu/qmp/socket.go b/vendor/github.com/digitalocean/go-qemu/qmp/socket.go index 541a88676d..383b575a68 100644 --- a/vendor/github.com/digitalocean/go-qemu/qmp/socket.go +++ b/vendor/github.com/digitalocean/go-qemu/qmp/socket.go @@ -104,6 +104,9 @@ func (mon *SocketMonitor) Disconnect() error { atomic.StoreInt32(mon.listeners, 0) err := mon.c.Close() + for range mon.stream { + } + return err } diff --git a/vendor/modules.txt b/vendor/modules.txt index d98d854f0d..1495c07bf6 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -365,14 +365,16 @@ github.com/cyphar/filepath-securejoin # github.com/davecgh/go-spew v1.1.1 ## explicit github.com/davecgh/go-spew/spew -# github.com/digitalocean/go-libvirt v0.0.0-20201209184759-e2a69bcd5bd1 -## explicit; go 1.14 +# github.com/digitalocean/go-libvirt v0.0.0-20220804181439-8648fbde413e +## explicit; go 1.15 github.com/digitalocean/go-libvirt github.com/digitalocean/go-libvirt/internal/constants github.com/digitalocean/go-libvirt/internal/event github.com/digitalocean/go-libvirt/internal/go-xdr/xdr2 -# github.com/digitalocean/go-qemu v0.0.0-20210326154740-ac9e0b687001 -## explicit; go 1.15 +github.com/digitalocean/go-libvirt/socket +github.com/digitalocean/go-libvirt/socket/dialers +# github.com/digitalocean/go-qemu v0.0.0-20221209210016-f035778c97f7 +## explicit; go 1.18 github.com/digitalocean/go-qemu/qmp # github.com/disiqueira/gotree/v3 v3.0.2 ## explicit; go 1.13