Skip to content

Commit dbe7749

Browse files
Birol Bilginbrlbil
authored andcommitted
added vmware metadata provider
cloud-init data from vmware guest info as it described in the link below https://github.com/vmware/cloud-init-vmware-guestinfo Signed-off-by: Birol Bilgin <[email protected]>
1 parent 7d9f1f0 commit dbe7749

File tree

19 files changed

+1600
-2
lines changed

19 files changed

+1600
-2
lines changed

pkg/metadata/main.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ func main() {
7777
log.SetLevel(log.DebugLevel)
7878
}
7979

80-
providers := []string{"aws", "gcp", "hetzner", "openstack", "scaleway", "vultr", "digitalocean", "packet", "metaldata", "cdrom"}
80+
providers := []string{"aws", "gcp", "hetzner", "openstack", "scaleway", "vultr", "digitalocean", "packet", "metaldata", "vmware", "cdrom"}
8181
args := flag.Args()
8282
if len(args) > 0 {
8383
providers = args
@@ -102,8 +102,13 @@ func main() {
102102
netProviders = append(netProviders, NewDigitalOcean())
103103
case p == "metaldata":
104104
netProviders = append(netProviders, NewMetalData())
105+
case p == "vmware":
106+
vmw := NewVMware()
107+
if vmw == nil {
108+
cdromProviders = append(cdromProviders, vmw)
109+
}
105110
case p == "cdrom":
106-
cdromProviders = ListCDROMs()
111+
cdromProviders = append(cdromProviders, ListCDROMs()...)
107112
case strings.HasPrefix(p, "file="):
108113
fileProviders = append(fileProviders, fileProvider(p[5:]))
109114
default:

pkg/metadata/provider_vmware.go

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
//go:build linux && 386 && amd64
2+
3+
package main
4+
5+
import (
6+
"compress/gzip"
7+
"encoding/base64"
8+
"fmt"
9+
"io/ioutil"
10+
"path"
11+
"strings"
12+
13+
log "github.com/sirupsen/logrus"
14+
"github.com/vmware/vmw-guestinfo/rpcvmx"
15+
"github.com/vmware/vmw-guestinfo/vmcheck"
16+
)
17+
18+
const (
19+
guestMetaData = "guestinfo.metadata"
20+
21+
guestUserData = "guestinfo.userdata"
22+
23+
guestVendorData = "guestinfo.vendordata"
24+
)
25+
26+
// ProviderVMware implements the Provider interface for VMware guestinfo api
27+
type ProviderVMware struct{}
28+
29+
// NewVMware returns a new VMware Provider
30+
func NewVMware() *ProviderVMware {
31+
return &ProviderVMware{}
32+
}
33+
34+
// String returns provider name
35+
func (p *ProviderVMware) String() string {
36+
return "VMWARE"
37+
}
38+
39+
// Probe checks if we are running on VMware and either userdata or metadata is set
40+
func (p *ProviderVMware) Probe() bool {
41+
isVM, err := vmcheck.IsVirtualWorld()
42+
if err != nil || !isVM {
43+
return false
44+
}
45+
46+
md, merr := vmwareGet(guestMetaData)
47+
ud, uerr := vmwareGet(guestUserData)
48+
49+
return ((merr == nil) && len(md) > 1 && string(md) != "---") || ((uerr == nil) && len(ud) > 1 && string(ud) != "---")
50+
}
51+
52+
// Extract gets the host specific metadata, generic userdata and if set vendordata
53+
// This function returns error if it fails to write metadata or vendordata to disk
54+
func (p *ProviderVMware) Extract() ([]byte, error) {
55+
// Get vendor data, if empty do not fail
56+
vendorData, err := vmwareGet(guestVendorData)
57+
if err != nil {
58+
log.Debugf("VMWare: Failed to get vendordata: %v", err)
59+
} else {
60+
err = ioutil.WriteFile(path.Join(ConfigPath, "vendordata"), vendorData, 0644)
61+
if err != nil {
62+
log.Debugf("VMWare: Failed to write vendordata: %v", err)
63+
}
64+
}
65+
66+
// Get metadata
67+
metaData, err := vmwareGet(guestMetaData)
68+
if err != nil {
69+
log.Printf("VMWare: Failed to get metadata: %v", err)
70+
} else {
71+
err = ioutil.WriteFile(path.Join(ConfigPath, "metadata"), metaData, 0644)
72+
if err != nil {
73+
return nil, fmt.Errorf("VMWare: Failed to write metadata: %s", err)
74+
}
75+
}
76+
77+
// Get userdata
78+
userData, err := vmwareGet(guestUserData)
79+
if err != nil {
80+
log.Printf("VMware: Failed to get userdata: %v", err)
81+
// This is not an error
82+
return nil, nil
83+
}
84+
85+
return userData, nil
86+
}
87+
88+
// vmwareGet gets and extracts the guestinfo data
89+
func vmwareGet(name string) ([]byte, error) {
90+
config := rpcvmx.NewConfig()
91+
92+
// get the gusest info value
93+
out, err := config.String(name, "")
94+
if err != nil {
95+
log.Debugf("Getting guest info %s failed: error %s", name, err)
96+
return nil, err
97+
}
98+
99+
enc, err := config.String(name+".encoding", "")
100+
if err != nil {
101+
log.Debugf("Getting guest info %s.encoding failed: error %s", name, err)
102+
return nil, err
103+
}
104+
105+
switch strings.TrimSuffix(enc, "\n") {
106+
case " ":
107+
return []byte(strings.TrimSuffix(out, "\n")), nil
108+
case "base64":
109+
r := base64.NewDecoder(base64.StdEncoding, strings.NewReader(out))
110+
111+
dst, err := ioutil.ReadAll(r)
112+
if err != nil {
113+
log.Debugf("Decoding base64 of '%s' failed %v", name, err)
114+
return nil, err
115+
}
116+
117+
return dst, nil
118+
case "gzip+base64":
119+
r := base64.NewDecoder(base64.StdEncoding, strings.NewReader(out))
120+
121+
zr, err := gzip.NewReader(r)
122+
if err != nil {
123+
log.Debugf("New gzip reader from '%s' failed %v", name, err)
124+
return nil, err
125+
}
126+
127+
dst, err := ioutil.ReadAll(zr)
128+
if err != nil {
129+
log.Debugf("Read '%s' failed %v", name, err)
130+
return nil, err
131+
}
132+
133+
return dst, nil
134+
default:
135+
return nil, fmt.Errorf("Unknown encoding %s", string(enc))
136+
}
137+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
//go:build !(linux && 386 && amd64)
2+
3+
package main
4+
5+
// ProviderVMware implements VMware provider interface for unsupported architectures
6+
type ProviderVMware struct{}
7+
8+
// NewVMware returns a new VMware Provider
9+
func NewVMware() *ProviderVMware {
10+
return nil
11+
}
12+
13+
// String implements provider interface
14+
func (p *ProviderVMware) String() string {
15+
return ""
16+
}
17+
18+
// Probe implements provider interface
19+
func (p *ProviderVMware) Probe() bool {
20+
return false
21+
}
22+
23+
// Extract implements provider interface
24+
func (p *ProviderVMware) Extract() ([]byte, error) {
25+
// Get vendor data, if empty do not fail
26+
return nil, nil
27+
}

pkg/metadata/vendor/github.com/vmware/vmw-guestinfo/LICENSE

Lines changed: 202 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)