-
Notifications
You must be signed in to change notification settings - Fork 458
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Give callers an easy way to extract both the plugin version and the dependency versions. With this commit: $ ./terraform-provider-libvirt -version ./terraform-provider-libvirt 48adac3-dirty Compiled against library: libvirt 3.9.0 Using library: libvirt 3.9.0 Running hypervisor: QEMU 2.9.0 Running against daemon: 3.9.0 The details are very similar to: $ virsh version --daemon Compiled against library: libvirt 3.9.0 Using library: libvirt 3.9.0 Using API: QEMU 3.9.0 Running hypervisor: QEMU 2.9.0 Running against daemon: 3.9.0 except the Go bindings do not currently expose the API version [1]. I've submitted a patch to libvirt-go adding ParseVersion there. But until then, carrying our own parseVersion shouldn't be too much trouble. Passing an empty string to NewConnect ends up passing a nil pointer through to virConnect [2], which will give us libvirt's internal default URI logic [3,4]. I hunted around for a way to expose the version information in Terraform. Currently: $ cat main.tf provider "libvirt" { uri = "qemu:///system" } $ terraform version Terraform v0.11.8 + provider.libvirt (unversioned) but the RPC API is not particularly clear to me, and the versions there may be extracted from plugin filenames and not from RPC calls. [1]: https://libvirt.org/git/?p=libvirt-go.git;a=blob;f=connect.go;h=8cc7cc771f7d258400175df47fcc8b3779ef4930;hb=9c5bdce3c18faad94cb383e7ec42f5122a8c7fa1#l313 [2]: https://libvirt.org/git/?p=libvirt-go.git;a=blob;f=connect.go;h=8cc7cc771f7d258400175df47fcc8b3779ef4930;hb=9c5bdce3c18faad94cb383e7ec42f5122a8c7fa1#l322 [3]: https://libvirt.org/html/libvirt-libvirt-host.html#virConnectOpen [4]: https://libvirt.org/uri.html#URI_default
- Loading branch information
Showing
4 changed files
with
102 additions
and
9 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,20 +1,83 @@ | ||
package main | ||
|
||
import ( | ||
"github.com/dmacvicar/terraform-provider-libvirt/libvirt" | ||
"github.com/hashicorp/terraform/plugin" | ||
"flag" | ||
"fmt" | ||
"io" | ||
"log" | ||
"math/rand" | ||
"os" | ||
"time" | ||
|
||
"github.com/dmacvicar/terraform-provider-libvirt/libvirt" | ||
"github.com/hashicorp/terraform/plugin" | ||
libvirtgo "github.com/libvirt/libvirt-go" | ||
) | ||
|
||
var version = "was not built correctly" // set via the Makefile | ||
|
||
func main() { | ||
versionFlag := flag.Bool("version", false, "print version information and exit") | ||
flag.Parse() | ||
if *versionFlag { | ||
err := printVersion(os.Stdout) | ||
if err != nil { | ||
log.Fatal(err) | ||
} | ||
os.Exit(0) | ||
} | ||
|
||
defer libvirt.CleanupLibvirtConnections() | ||
|
||
plugin.Serve(&plugin.ServeOpts{ | ||
ProviderFunc: libvirt.Provider, | ||
}) | ||
} | ||
|
||
func printVersion(writer io.Writer) error { | ||
fmt.Fprintf(writer, "%s %s\n", os.Args[0], version) | ||
|
||
fmt.Fprintf(writer, "Compiled against library: libvirt %s\n", parseVersion(libvirtgo.VERSION_NUMBER)) | ||
|
||
libvirtVersion, err := libvirtgo.GetVersion() | ||
if err != nil { | ||
return err | ||
} | ||
fmt.Fprintf(writer, "Using library: libvirt %s\n", parseVersion(libvirtVersion)) | ||
|
||
conn, err := libvirtgo.NewConnect("") | ||
if err != nil { | ||
return err | ||
} | ||
defer conn.Close() | ||
|
||
hvType, err := conn.GetType() | ||
if err != nil { | ||
return err | ||
} | ||
libvirtVersion, err = conn.GetVersion() | ||
if err != nil { | ||
return err | ||
} | ||
fmt.Fprintf(writer, "Running hypervisor: %s %s\n", hvType, parseVersion(libvirtVersion)) | ||
|
||
libvirtVersion, err = conn.GetLibVersion() | ||
if err != nil { | ||
return err | ||
} | ||
fmt.Fprintf(writer, "Running against daemon: %s\n", parseVersion(libvirtVersion)) | ||
|
||
return nil | ||
} | ||
|
||
func parseVersion(version uint32) string { | ||
release := version % 1000 | ||
version /= 1000 | ||
minor := version % 1000 | ||
major := version / 1000 | ||
return fmt.Sprintf("%d.%d.%d", major, minor, release) | ||
} | ||
|
||
func init() { | ||
rand.Seed(time.Now().UTC().UnixNano()) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
package main | ||
|
||
import ( | ||
"bytes" | ||
"regexp" | ||
"testing" | ||
) | ||
|
||
func TestPrintVersion(t *testing.T) { | ||
buf := &bytes.Buffer{} | ||
err := printVersion(buf) | ||
if err != nil { | ||
t.Fatal(err) | ||
} | ||
output := buf.Bytes() | ||
|
||
re := regexp.MustCompile("^.*terraform-provider-libvirt.test was not built correctly\\nCompiled against library: libvirt [0-9.]*\\nUsing library: libvirt [0-9.]*\\nRunning hypervisor: .* [0-9.]*\\nRunning against daemon: [0-9.]*\\n$") | ||
if !re.Match(output) { | ||
t.Fatalf("unexpected output:\n%q", string(output)) | ||
} | ||
} |