Skip to content

Commit 3ecefe1

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 <birolbilgin@gmail.com>
1 parent 0e2887c commit 3ecefe1

18 files changed

Lines changed: 1551 additions & 2 deletions

File tree

pkg/metadata/main.go

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

81-
providers := []string{"aws", "gcp", "hetzner", "openstack", "scaleway", "vultr", "digitalocean", "packet", "metaldata", "cdrom"}
81+
providers := []string{"aws", "gcp", "hetzner", "openstack", "scaleway", "vultr", "digitalocean", "packet", "metaldata", "vmware", "cdrom"}
8282
args := flag.Args()
8383
if len(args) > 0 {
8484
providers = args
@@ -103,8 +103,10 @@ func main() {
103103
netProviders = append(netProviders, NewDigitalOcean())
104104
case p == "metaldata":
105105
netProviders = append(netProviders, NewMetalData())
106+
case p == "vmware":
107+
cdromProviders = append(cdromProviders, NewVMware())
106108
case p == "cdrom":
107-
cdromProviders = ListCDROMs()
109+
cdromProviders = append(cdromProviders, ListCDROMs()...)
108110
case strings.HasPrefix(p, "file="):
109111
fileProviders = append(fileProviders, fileProvider(p[5:]))
110112
default:

pkg/metadata/provider_vmware.go

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

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)