some vm properties are populated
Some checks are pending
CI / Lint (push) Waiting to run
CI / Test (push) Waiting to run
CI / End-to-End (push) Waiting to run
CI / Publish Docker (push) Blocked by required conditions
continuous-integration/drone/push Build is passing

This commit is contained in:
2024-09-12 17:24:38 +10:00
parent c46117d084
commit d1e13adf90
10 changed files with 1005 additions and 56 deletions

2
.gitignore vendored
View File

@@ -33,7 +33,7 @@ go.work
# Google App Engine generated folder
appengine-generated/
/components/*/*.go
#/components/*/*.go
/components/*/*.txt
.idea
*.iml

View File

@@ -0,0 +1,137 @@
// Code generated by templ - DO NOT EDIT.
// templ: version: v0.2.771
package core
//lint:file-ignore SA4006 This context is only used if a nested component is present.
import "github.com/a-h/templ"
import templruntime "github.com/a-h/templ/runtime"
import "vctp/version"
func HTML(title string, content templ.Component) templ.Component {
return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
if !templ_7745c5c3_IsBuffer {
defer func() {
templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
if templ_7745c5c3_Err == nil {
templ_7745c5c3_Err = templ_7745c5c3_BufErr
}
}()
}
ctx = templ.InitializeContext(ctx)
templ_7745c5c3_Var1 := templ.GetChildren(ctx)
if templ_7745c5c3_Var1 == nil {
templ_7745c5c3_Var1 = templ.NopComponent
}
ctx = templ.ClearChildren(ctx)
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<!doctype html><html lang=\"en\">")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
templ_7745c5c3_Err = head(title).Render(ctx, templ_7745c5c3_Buffer)
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
templ_7745c5c3_Err = body(content).Render(ctx, templ_7745c5c3_Buffer)
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</html>")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
return templ_7745c5c3_Err
})
}
func head(title string) templ.Component {
return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
if !templ_7745c5c3_IsBuffer {
defer func() {
templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
if templ_7745c5c3_Err == nil {
templ_7745c5c3_Err = templ_7745c5c3_BufErr
}
}()
}
ctx = templ.InitializeContext(ctx)
templ_7745c5c3_Var2 := templ.GetChildren(ctx)
if templ_7745c5c3_Var2 == nil {
templ_7745c5c3_Var2 = templ.NopComponent
}
ctx = templ.ClearChildren(ctx)
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><meta name=\"description\" content=\"Hello world\"><title>")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
var templ_7745c5c3_Var3 string
templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(title)
if templ_7745c5c3_Err != nil {
return templ.Error{Err: templ_7745c5c3_Err, FileName: `core/html.templ`, Line: 18, Col: 16}
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</title><script src=\"/assets/js/htmx@v2.0.2.min.js\"></script><link href=\"")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
var templ_7745c5c3_Var4 string
templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs("/assets/css/output@" + version.Value + ".css")
if templ_7745c5c3_Err != nil {
return templ.Error{Err: templ_7745c5c3_Err, FileName: `core/html.templ`, Line: 20, Col: 61}
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" rel=\"stylesheet\"></head>")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
return templ_7745c5c3_Err
})
}
func body(content templ.Component) templ.Component {
return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
if !templ_7745c5c3_IsBuffer {
defer func() {
templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
if templ_7745c5c3_Err == nil {
templ_7745c5c3_Err = templ_7745c5c3_BufErr
}
}()
}
ctx = templ.InitializeContext(ctx)
templ_7745c5c3_Var5 := templ.GetChildren(ctx)
if templ_7745c5c3_Var5 == nil {
templ_7745c5c3_Var5 = templ.NopComponent
}
ctx = templ.ClearChildren(ctx)
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<body class=\"flex flex-col min-h-screen\"><main class=\"flex-grow\">")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
templ_7745c5c3_Err = content.Render(ctx, templ_7745c5c3_Buffer)
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</main></body>")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
return templ_7745c5c3_Err
})
}
var _ = templruntime.GeneratedTemplate

View File

@@ -0,0 +1,37 @@
// Code generated by templ - DO NOT EDIT.
// templ: version: v0.2.771
package home
//lint:file-ignore SA4006 This context is only used if a nested component is present.
import "github.com/a-h/templ"
import templruntime "github.com/a-h/templ/runtime"
func Home() templ.Component {
return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
if !templ_7745c5c3_IsBuffer {
defer func() {
templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
if templ_7745c5c3_Err == nil {
templ_7745c5c3_Err = templ_7745c5c3_BufErr
}
}()
}
ctx = templ.InitializeContext(ctx)
templ_7745c5c3_Var1 := templ.GetChildren(ctx)
if templ_7745c5c3_Var1 == nil {
templ_7745c5c3_Var1 = templ.NopComponent
}
ctx = templ.ClearChildren(ctx)
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"text-center\"><h1 class=\"text-5xl font-bold\">Welcome!</h1><p class=\"text-indigo-200 mt-4\">This is a simple home screen.</p></div>")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
return templ_7745c5c3_Err
})
}
var _ = templruntime.GeneratedTemplate

13
go.mod
View File

@@ -6,35 +6,24 @@ require (
github.com/a-h/templ v0.2.778
github.com/jmoiron/sqlx v1.4.0
github.com/joho/godotenv v1.5.1
github.com/playwright-community/playwright-go v0.4201.1
github.com/pressly/goose/v3 v3.22.0
github.com/stretchr/testify v1.9.0
github.com/tursodatabase/libsql-client-go v0.0.0-20240902231107-85af5b9d094d
github.com/vmware/govmomi v0.43.0
modernc.org/sqlite v1.33.0
)
require (
github.com/antlr4-go/antlr/v4 v4.13.1 // indirect
github.com/coder/websocket v1.8.12 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/deckarep/golang-set/v2 v2.6.0 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/go-jose/go-jose/v3 v3.0.1 // indirect
github.com/go-stack/stack v1.8.1 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mfridman/interpolate v0.0.2 // indirect
github.com/ncruces/go-strftime v0.1.9 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
github.com/sethvargo/go-retry v0.3.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect
golang.org/x/sync v0.8.0 // indirect
golang.org/x/sys v0.25.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
golang.org/x/tools v0.25.0 // indirect
modernc.org/gc/v3 v3.0.0-20240801135723-a856999a2e4a // indirect
modernc.org/mathutil v1.6.0 // indirect
modernc.org/memory v1.8.0 // indirect

39
go.sum
View File

@@ -2,24 +2,12 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/a-h/templ v0.2.778 h1:VzhOuvWECrwOec4790lcLlZpP4Iptt5Q4K9aFxQmtaM=
github.com/a-h/templ v0.2.778/go.mod h1:lq48JXoUvuQrU0VThrK31yFwdRjTCnIE5bcPCM9IP1w=
github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ=
github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw=
github.com/coder/websocket v1.8.12 h1:5bUXkEPPIbewrnkU8LTCLVaxi4N4J8ahufH2vlo4NAo=
github.com/coder/websocket v1.8.12/go.mod h1:LNVeNrXQZfe5qhS9ALED3uA+l5pPqvwXg3CKoDBB2gs=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM=
github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/go-jose/go-jose/v3 v3.0.1 h1:pWmKFVtt+Jl0vBZTIpz/eAKwsm6LkIxDVVbFHKkchhA=
github.com/go-jose/go-jose/v3 v3.0.1/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8=
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw=
github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4=
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo=
@@ -32,10 +20,6 @@ github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o=
github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY=
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
@@ -44,54 +28,31 @@ github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY=
github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg=
github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc=
github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg=
github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
github.com/playwright-community/playwright-go v0.4201.1 h1:fFX/02r3wrL+8NB132RcduR0lWEofxRDJEKuln+9uMQ=
github.com/playwright-community/playwright-go v0.4201.1/go.mod h1:hpEOnUo/Kgb2lv5lEY29jbW5Xgn7HaBeiE+PowRad8k=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pressly/goose/v3 v3.22.0 h1:wd/7kNiPTuNAztWun7iaB98DrhulbWPrzMAaw2DEZNw=
github.com/pressly/goose/v3 v3.22.0/go.mod h1:yJM3qwSj2pp7aAaCvso096sguezamNb2OBgxCnh/EYg=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
github.com/sethvargo/go-retry v0.3.0 h1:EEt31A35QhrcRZtrYFDTBg91cqZVnFL2navjDrah2SE=
github.com/sethvargo/go-retry v0.3.0/go.mod h1:mNX17F0C/HguQMyMyJxcnU471gOZGxCLyYaFyAZraas=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/tursodatabase/libsql-client-go v0.0.0-20240902231107-85af5b9d094d h1:dOMI4+zEbDI37KGb0TI44GUAwxHF9cMsIoDTJ7UmgfU=
github.com/tursodatabase/libsql-client-go v0.0.0-20240902231107-85af5b9d094d/go.mod h1:l8xTsYB90uaVdMHXMCxKKLSgw5wLYBwBKKefNIUnm9s=
github.com/vmware/govmomi v0.43.0 h1:7Kg3Bkdly+TrE67BYXzRq7ZrDnn7xqpKX95uEh2f9Go=
github.com/vmware/govmomi v0.43.0/go.mod h1:IOv5nTXCPqH9qVJAlRuAGffogaLsNs8aF+e7vLgsHJU=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk=
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY=
golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE=
golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE=

View File

@@ -9,9 +9,11 @@ import (
"os"
"github.com/vmware/govmomi"
"github.com/vmware/govmomi/find"
"github.com/vmware/govmomi/view"
"github.com/vmware/govmomi/vim25/mo"
"github.com/vmware/govmomi/vim25/soap"
"github.com/vmware/govmomi/vim25/types"
)
type Vcenter struct {
@@ -20,6 +22,11 @@ type Vcenter struct {
client *govmomi.Client
}
type VmProperties struct {
Vm mo.VirtualMachine
Datacenter string
}
// New creates a new Vcenter with the given logger
func New(logger *slog.Logger) *Vcenter {
@@ -104,3 +111,44 @@ func (v *Vcenter) FindVMByName(vmName string) ([]mo.VirtualMachine, error) {
return result, nil
}
func (v *Vcenter) FindVMByID(vmID string) (*VmProperties, error) {
finder := find.NewFinder(v.client.Client, true)
// List all datacenters
datacenters, err := finder.DatacenterList(v.ctx, "*")
if err != nil {
return nil, fmt.Errorf("failed to list datacenters: %w", err)
}
for _, dc := range datacenters {
// Set the current datacenter
finder.SetDatacenter(dc)
// Create a ManagedObjectReference for the VM
vmRef := types.ManagedObjectReference{
Type: "VirtualMachine",
Value: vmID,
}
// Try to find the VM by ID in the current datacenter
//vm, err := finder.ObjectReference(v.ctx, vmRef)
var vm mo.VirtualMachine
err := v.client.RetrieveOne(v.ctx, vmRef, []string{"config", "name"}, &vm)
if err != nil {
// If the error is not a NotFoundError, return it
if err == err.(*find.NotFoundError) {
return nil, fmt.Errorf("failed to retrieve VM with ID %s in datacenter %s: %w", vmID, dc.Name(), err)
}
return nil, fmt.Errorf("failed to retrieve VM: %w", err)
}
return &VmProperties{
Datacenter: dc.Name(),
Vm: vm,
}, nil
}
return nil, fmt.Errorf("VM with ID %s not found in any datacenter", vmID)
}

View File

@@ -7,6 +7,7 @@ import (
"fmt"
"io"
"net/http"
"runtime"
"time"
queries "vctp/db/queries"
"vctp/internal/vcenter"
@@ -15,7 +16,11 @@ import (
// VmCreate receives the CloudEvent for a VM creation
func (h *Handler) VmCreate(w http.ResponseWriter, r *http.Request) {
var unixTimestamp int64
var (
unixTimestamp int64
numVcpus int32
numRam int32
)
reqBody, err := io.ReadAll(r.Body)
if err != nil {
@@ -51,11 +56,17 @@ func (h *Handler) VmCreate(w http.ResponseWriter, r *http.Request) {
// TODO - initiate govmomi query of source vcenter to discover related data
vc := vcenter.New(h.Logger)
vc.Login(vm.CloudEvent.Source)
vmObject, err := vc.FindVMByName(vm.CloudEvent.Data.VM.Name)
//vmObject, err := vc.FindVMByName(vm.CloudEvent.Data.VM.Name)
vmObject, err := vc.FindVMByID(vm.CloudEvent.Data.VM.VM.Value)
if err != nil {
h.Logger.Error("Can't locate vm in vCenter", "vmName", vm.CloudEvent.Data.VM.Name, "error", err)
h.Logger.Error("Can't locate vm in vCenter", "vmID", vm.CloudEvent.Data.VM.VM.Value, "error", err)
} else {
h.Logger.Debug("found VM", "object", vmObject)
//h.Logger.Debug("found VM", "object", vmObject)
//prettyPrint(vmObject)
// calculate VM properties we want to store
numRam = vmObject.Vm.Config.Hardware.MemoryMB
numVcpus = vmObject.Vm.Config.Hardware.NumCPU * vmObject.Vm.Config.Hardware.NumCoresPerSocket
}
vc.Logout()
@@ -64,7 +75,10 @@ func (h *Handler) VmCreate(w http.ResponseWriter, r *http.Request) {
Name: vm.CloudEvent.Data.VM.Name,
Vcenter: vm.CloudEvent.Source,
VmId: sql.NullString{String: "VirtualMachine-" + vm.CloudEvent.Data.VM.VM.Value, Valid: vm.CloudEvent.Data.VM.VM.Value != ""},
Datacenter: sql.NullString{String: vmObject.Datacenter, Valid: vmObject.Datacenter != ""},
CreationTime: sql.NullInt64{Int64: unixTimestamp, Valid: unixTimestamp > 0},
InitialVcpus: sql.NullInt64{Int64: int64(numVcpus), Valid: numVcpus > 0},
InitialRam: sql.NullInt64{Int64: int64(numRam), Valid: numRam > 0},
}
h.Logger.Debug("database params", "vm", vm)
@@ -82,3 +96,30 @@ func (h *Handler) VmCreate(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
fmt.Fprintf(w, "Create Request : %v\n", result)
}
func prettyPrint(args ...interface{}) {
var caller string
timeNow := time.Now().Format("01-02-2006 15:04:05")
prefix := fmt.Sprintf("[%s] %s -- ", "PrettyPrint", timeNow)
_, fileName, fileLine, ok := runtime.Caller(1)
if ok {
caller = fmt.Sprintf("%s:%d", fileName, fileLine)
} else {
caller = ""
}
fmt.Printf("\n%s%s\n", prefix, caller)
if len(args) == 2 {
label := args[0]
value := args[1]
s, _ := json.MarshalIndent(value, "", "\t")
fmt.Printf("%s%s: %s\n", prefix, label, string(s))
} else {
s, _ := json.MarshalIndent(args, "", "\t")
fmt.Printf("%s%s\n", prefix, string(s))
}
}

736
vm.json Normal file
View File

@@ -0,0 +1,736 @@
{
"self": {
"type": "VirtualMachine",
"value": "vm-13671"
},
"value": null,
"availableField": null,
"parent": null,
"customValue": null,
"overallStatus": "",
"configStatus": "",
"configIssue": null,
"effectiveRole": null,
"permission": null,
"name": "minecraft",
"disabledMethod": null,
"recentTask": null,
"declaredAlarmState": null,
"triggeredAlarmState": null,
"alarmActionsEnabled": null,
"tag": null,
"capability": {
"snapshotOperationsSupported": false,
"multipleSnapshotsSupported": false,
"snapshotConfigSupported": false,
"poweredOffSnapshotsSupported": false,
"memorySnapshotsSupported": false,
"revertToSnapshotSupported": false,
"quiescedSnapshotsSupported": false,
"disableSnapshotsSupported": false,
"lockSnapshotsSupported": false,
"consolePreferencesSupported": false,
"cpuFeatureMaskSupported": false,
"s1AcpiManagementSupported": false,
"settingScreenResolutionSupported": false,
"toolsAutoUpdateSupported": false,
"vmNpivWwnSupported": false,
"npivWwnOnNonRdmVmSupported": false,
"swapPlacementSupported": false,
"toolsSyncTimeSupported": false,
"virtualMmuUsageSupported": false,
"diskSharesSupported": false,
"bootOptionsSupported": false,
"settingVideoRamSizeSupported": false
},
"config": {
"changeVersion": "2024-05-24T06:41:25.868508Z",
"modified": "1970-01-01T00:00:00Z",
"name": "minecraft",
"guestFullName": "Ubuntu Linux (32-bit)",
"version": "vmx-08",
"uuid": "422598c8-5ab7-63e7-ba34-8111936fea59",
"createDate": "1970-01-01T00:00:00Z",
"instanceUuid": "50251955-6d1b-8954-ae28-50284dd4b44e",
"npivTemporaryDisabled": true,
"locationId": "564d4d65-27af-07d1-d627-70d056c7f233",
"template": false,
"guestId": "ubuntuGuest",
"alternateGuestName": "",
"files": {
"vmPathName": "[freenas] minecraft/minecraft.vmx",
"snapshotDirectory": "[freenas] minecraft/",
"suspendDirectory": "[freenas] minecraft/",
"logDirectory": "[freenas] minecraft/"
},
"tools": {
"toolsVersion": 10362,
"afterPowerOn": true,
"afterResume": true,
"beforeGuestStandby": true,
"beforeGuestShutdown": true,
"toolsUpgradePolicy": "upgradeAtPowerCycle",
"syncTimeWithHostAllowed": true,
"syncTimeWithHost": true,
"lastInstallInfo": {
"counter": 6
}
},
"flags": {
"enableLogging": true,
"useToe": false,
"runWithDebugInfo": false,
"monitorType": "release",
"htSharing": "any",
"snapshotDisabled": false,
"snapshotLocked": false,
"diskUuidEnabled": false,
"snapshotPowerOffBehavior": "powerOff",
"recordReplayEnabled": false,
"faultToleranceType": "unset",
"vvtdEnabled": false,
"vbsEnabled": false
},
"defaultPowerOps": {
"powerOffType": "soft",
"suspendType": "hard",
"resetType": "soft",
"defaultPowerOffType": "soft",
"defaultSuspendType": "hard",
"defaultResetType": "soft",
"standbyAction": "checkpoint"
},
"hardware": {
"numCPU": 1,
"numCoresPerSocket": 1,
"autoCoresPerSocket": false,
"memoryMB": 3072,
"virtualICH7MPresent": false,
"virtualSMCPresent": false,
"device": [
{
"key": 100,
"deviceInfo": {
"label": "PCI controller 0",
"summary": "PCI controller 0"
},
"busNumber": 0,
"device": [
500,
12000,
1000,
4000
]
},
{
"key": 200,
"deviceInfo": {
"label": "IDE 0",
"summary": "IDE 0"
},
"busNumber": 0
},
{
"key": 201,
"deviceInfo": {
"label": "IDE 1",
"summary": "IDE 1"
},
"busNumber": 1,
"device": [
3002
]
},
{
"key": 300,
"deviceInfo": {
"label": "PS2 controller 0",
"summary": "PS2 controller 0"
},
"busNumber": 0,
"device": [
600,
700
]
},
{
"key": 400,
"deviceInfo": {
"label": "SIO controller 0",
"summary": "SIO controller 0"
},
"busNumber": 0,
"device": [
8000
]
},
{
"key": 500,
"deviceInfo": {
"label": "Video card ",
"summary": "Video card"
},
"controllerKey": 100,
"unitNumber": 0,
"videoRamSizeInKB": 4096,
"numDisplays": 1,
"useAutoDetect": false,
"enable3DSupport": false,
"use3dRenderer": "automatic",
"graphicsMemorySizeInKB": 262144
},
{
"key": 600,
"deviceInfo": {
"label": "Keyboard ",
"summary": "Keyboard"
},
"controllerKey": 300,
"unitNumber": 0
},
{
"key": 700,
"deviceInfo": {
"label": "Pointing device",
"summary": "Pointing device; Device"
},
"backing": {
"deviceName": "",
"useAutoDetect": false,
"hostPointingDevice": "autodetect"
},
"controllerKey": 300,
"unitNumber": 1
},
{
"key": 1000,
"deviceInfo": {
"label": "SCSI controller 0",
"summary": "LSI Logic"
},
"slotInfo": {
"pciSlotNumber": 16
},
"controllerKey": 100,
"unitNumber": 3,
"busNumber": 0,
"device": [
2000
],
"hotAddRemove": true,
"sharedBus": "noSharing",
"scsiCtlrUnitNumber": 7
},
{
"key": 2000,
"deviceInfo": {
"label": "Hard disk 1",
"summary": "62,914,560 KB"
},
"backing": {
"fileName": "[freenas] minecraft/minecraft-000002.vmdk",
"datastore": {
"type": "Datastore",
"value": "datastore-6035"
},
"diskMode": "persistent",
"split": false,
"writeThrough": false,
"thinProvisioned": true,
"eagerlyScrub": false,
"uuid": "6000C294-55e8-39b9-1852-00dcfd299398",
"contentId": "b739ed36bfc510b2f1c70000e628ed40",
"parent": {
"fileName": "[freenas] minecraft/minecraft-000001.vmdk",
"datastore": {
"type": "Datastore",
"value": "datastore-6035"
},
"diskMode": "persistent",
"thinProvisioned": true,
"eagerlyScrub": false,
"uuid": "6000C294-55e8-39b9-1852-00dcfd299398",
"contentId": "45ff3b3b3935d631facb7eadbb916797",
"parent": {
"fileName": "[freenas] minecraft/minecraft.vmdk",
"datastore": {
"type": "Datastore",
"value": "datastore-6035"
},
"diskMode": "persistent",
"thinProvisioned": true,
"eagerlyScrub": false,
"uuid": "6000C294-55e8-39b9-1852-00dcfd299398",
"contentId": "8e6ae3c31967c906303f7b3fe1b379f8",
"digestEnabled": false
},
"deltaDiskFormat": "redoLogFormat",
"digestEnabled": false,
"deltaDiskFormatVariant": "vmfsSparseVariant"
},
"deltaDiskFormat": "redoLogFormat",
"digestEnabled": false,
"deltaDiskFormatVariant": "vmfsSparseVariant",
"sharing": "sharingNone"
},
"controllerKey": 1000,
"unitNumber": 0,
"capacityInKB": 62914560,
"capacityInBytes": 64424509440,
"shares": {
"shares": 1000,
"level": "normal"
},
"storageIOAllocation": {
"limit": -1,
"shares": {
"shares": 1000,
"level": "normal"
},
"reservation": 0
},
"diskObjectId": "271-2000",
"vDiskVersion": 1,
"nativeUnmanagedLinkedClone": false,
"guestReadOnly": false
},
{
"key": 3002,
"deviceInfo": {
"label": "CD/DVD drive 1",
"summary": "ISO [] /usr/lib/vmware/isoimages/linux.iso"
},
"backing": {
"fileName": "[] /usr/lib/vmware/isoimages/linux.iso"
},
"connectable": {
"startConnected": false,
"allowGuestControl": true,
"connected": false,
"status": "untried"
},
"controllerKey": 201,
"unitNumber": 0
},
{
"key": 4000,
"deviceInfo": {
"label": "Network adapter 1",
"summary": "DVSwitch: 50 02 bc 27 fa 1b 2c d1-0d 43 fb 29 46 60 c4 0b"
},
"backing": {
"port": {
"switchUuid": "50 02 bc 27 fa 1b 2c d1-0d 43 fb 29 46 60 c4 0b",
"portgroupKey": "dvportgroup-4031",
"portKey": "102",
"connectionCookie": 209430599
}
},
"connectable": {
"migrateConnect": "unset",
"startConnected": true,
"allowGuestControl": true,
"connected": false,
"status": "untried"
},
"slotInfo": {
"pciSlotNumber": 32
},
"controllerKey": 100,
"unitNumber": 7,
"addressType": "assigned",
"macAddress": "00:50:56:a5:16:29",
"wakeOnLanEnabled": true,
"resourceAllocation": {
"reservation": 0,
"share": {
"shares": 50,
"level": "normal"
},
"limit": -1
},
"uptCompatibilityEnabled": false
},
{
"key": 8000,
"deviceInfo": {
"label": "Floppy drive 1",
"summary": "Remote"
},
"backing": {
"deviceName": "",
"useAutoDetect": false
},
"connectable": {
"startConnected": false,
"allowGuestControl": true,
"connected": false,
"status": "untried"
},
"controllerKey": 400,
"unitNumber": 0
},
{
"key": 12000,
"deviceInfo": {
"label": "VMCI device",
"summary": "Device on the virtual machine PCI bus that provides support for the virtual machine communication interface"
},
"slotInfo": {
"pciSlotNumber": 33
},
"controllerKey": 100,
"unitNumber": 17,
"id": -1821382055,
"allowUnrestrictedCommunication": false,
"filterEnable": true
}
],
"motherboardLayout": "i440bxHostBridge",
"simultaneousThreads": 1
},
"cpuAllocation": {
"reservation": 0,
"expandableReservation": false,
"limit": -1,
"shares": {
"shares": 1000,
"level": "normal"
}
},
"memoryAllocation": {
"reservation": 0,
"expandableReservation": false,
"limit": -1,
"shares": {
"shares": 30720,
"level": "normal"
}
},
"latencySensitivity": {
"level": "normal"
},
"memoryHotAddEnabled": false,
"cpuHotAddEnabled": false,
"cpuHotRemoveEnabled": false,
"extraConfig": [
{
"key": "svga.present",
"value": "TRUE"
},
{
"key": "vmci.filter.enable",
"value": "TRUE"
},
{
"key": "tools.guest.desktop.autolock",
"value": "FALSE"
},
{
"key": "pciBridge0.present",
"value": "true"
},
{
"key": "pciBridge4.present",
"value": "true"
},
{
"key": "pciBridge4.virtualDev",
"value": "pcieRootPort"
},
{
"key": "pciBridge4.functions",
"value": "8"
},
{
"key": "pciBridge5.present",
"value": "true"
},
{
"key": "pciBridge5.virtualDev",
"value": "pcieRootPort"
},
{
"key": "pciBridge5.functions",
"value": "8"
},
{
"key": "pciBridge6.present",
"value": "true"
},
{
"key": "pciBridge6.virtualDev",
"value": "pcieRootPort"
},
{
"key": "pciBridge6.functions",
"value": "8"
},
{
"key": "pciBridge7.present",
"value": "true"
},
{
"key": "pciBridge7.virtualDev",
"value": "pcieRootPort"
},
{
"key": "pciBridge7.functions",
"value": "8"
},
{
"key": "hpet0.present",
"value": "TRUE"
},
{
"key": "nvram",
"value": "minecraft.nvram"
},
{
"key": "virtualHW.productCompatibility",
"value": "hosted"
},
{
"key": "scsi0.pciSlotNumber",
"value": "16"
},
{
"key": "ethernet0.pciSlotNumber",
"value": "32"
},
{
"key": "vmci0.pciSlotNumber",
"value": "33"
},
{
"key": "snapshot.action",
"value": "keep"
},
{
"key": "sched.cpu.latencySensitivity",
"value": "normal"
},
{
"key": "replay.supported",
"value": "false"
},
{
"key": "pciBridge0.pciSlotNumber",
"value": "17"
},
{
"key": "pciBridge4.pciSlotNumber",
"value": "21"
},
{
"key": "pciBridge5.pciSlotNumber",
"value": "22"
},
{
"key": "pciBridge6.pciSlotNumber",
"value": "23"
},
{
"key": "pciBridge7.pciSlotNumber",
"value": "24"
},
{
"key": "tools.remindInstall",
"value": "FALSE"
},
{
"key": "hostCPUID.0",
"value": "00000016756e65476c65746e49656e69"
},
{
"key": "hostCPUID.1",
"value": "000906ea001008007ffafbffbfebfbff"
},
{
"key": "hostCPUID.80000001",
"value": "0000000000000000000001212c100800"
},
{
"key": "guestCPUID.0",
"value": "0000000d756e65476c65746e49656e69"
},
{
"key": "guestCPUID.1",
"value": "000406f00001080096d832030f8bfbff"
},
{
"key": "guestCPUID.80000001",
"value": "00000000000000000000010128100800"
},
{
"key": "userCPUID.0",
"value": "0000000d756e65476c65746e49656e69"
},
{
"key": "userCPUID.1",
"value": "000406f00001080096d832030f8bfbff"
},
{
"key": "userCPUID.80000001",
"value": "00000000000000000000010128100800"
},
{
"key": "evcCompatibilityMode",
"value": "TRUE"
},
{
"key": "vmotion.checkpointFBSize",
"value": "4194304"
},
{
"key": "softPowerOff",
"value": "TRUE"
},
{
"key": "toolsInstallManager.updateCounter",
"value": "6"
},
{
"key": "toolsInstallManager.lastInstallError",
"value": "0"
},
{
"key": "numa.autosize.vcpu.maxPerVirtualNode",
"value": "1"
},
{
"key": "numa.autosize.cookie",
"value": "10001"
},
{
"key": "sched.swap.derivedName",
"value": "/vmfs/volumes/a79e4951-d31e6955/minecraft/minecraft-4bfd4f1d.vswp"
},
{
"key": "scsi0:0.redo",
"value": ""
},
{
"key": "monitor.phys_bits_used",
"value": "40"
},
{
"key": "viv.moid",
"value": "91a88fc3-5936-4bfb-a6f8-018e073fcefb:vm-13671:XMmrS0IZV2SrrGL4GiADh//vraEEXaRMaC4vxsNBPOI="
},
{
"key": "vmxstats.filename",
"value": "minecraft.scoreboard"
},
{
"key": "tools.capability.verifiedSamlToken",
"value": "TRUE"
},
{
"key": "vmware.tools.internalversion",
"value": "10362"
},
{
"key": "vmware.tools.requiredversion",
"value": "12389"
},
{
"key": "migrate.hostLogState",
"value": "none"
},
{
"key": "migrate.migrationId",
"value": "0"
},
{
"key": "migrate.hostLog",
"value": "minecraft-662da845.hlog"
}
],
"datastoreUrl": [
{
"name": "freenas",
"url": "/vmfs/volumes/a79e4951-d31e6955"
}
],
"swapPlacement": "inherit",
"bootOptions": {
"enterBIOSSetup": false,
"efiSecureBootEnabled": false,
"bootRetryEnabled": false,
"bootRetryDelay": 10000,
"networkBootProtocol": "ipv4"
},
"changeTrackingEnabled": false,
"firmware": "bios",
"maxMksConnections": 40,
"guestAutoLockEnabled": false,
"memoryReservationLockedToMax": false,
"nestedHVEnabled": false,
"vPMCEnabled": false,
"scheduledHardwareUpgradeInfo": {
"upgradePolicy": "never",
"scheduledHardwareUpgradeStatus": "none"
},
"messageBusTunnelEnabled": false,
"guestIntegrityInfo": {
"enabled": false
},
"migrateEncryption": "opportunistic",
"sgxInfo": {
"epcSize": 0,
"flcMode": "unlocked",
"requireAttestation": false
},
"ftEncryptionMode": "ftEncryptionOpportunistic",
"guestMonitoringModeInfo": {},
"sevEnabled": false,
"numaInfo": {
"coresPerNumaNode": 0,
"autoCoresPerNumaNode": true
},
"vmOpNotificationToAppEnabled": false,
"vmOpNotificationTimeout": -1,
"deviceGroups": {},
"fixedPassthruHotPlugEnabled": false
},
"layout": null,
"layoutEx": null,
"storage": null,
"environmentBrowser": {
"type": "",
"value": ""
},
"resourcePool": null,
"parentVApp": null,
"resourceConfig": null,
"runtime": {
"connectionState": "",
"powerState": "",
"toolsInstallerMounted": false,
"numMksConnections": 0
},
"guest": null,
"summary": {
"runtime": {
"connectionState": "",
"powerState": "",
"toolsInstallerMounted": false,
"numMksConnections": 0
},
"config": {
"name": "",
"template": false,
"vmPathName": ""
},
"quickStats": {
"guestHeartbeatStatus": ""
},
"overallStatus": ""
},
"datastore": null,
"network": null,
"snapshot": null,
"rootSnapshot": null,
"guestHeartbeatStatus": ""
}