Skip to content
This repository has been archived by the owner on Sep 18, 2020. It is now read-only.

Commit

Permalink
Merge pull request #417 from crawford/vmware
Browse files Browse the repository at this point in the history
datasource/vmware: allow building on arm systems
  • Loading branch information
crawford committed Mar 2, 2016
2 parents b3f805d + b1bfeed commit 6e9109e
Show file tree
Hide file tree
Showing 3 changed files with 126 additions and 82 deletions.
82 changes: 0 additions & 82 deletions datasource/vmware/vmware.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,10 @@ package vmware

import (
"fmt"
"io/ioutil"
"log"
"net"
"os"

"github.com/coreos/coreos-cloudinit/config"
"github.com/coreos/coreos-cloudinit/datasource"
"github.com/coreos/coreos-cloudinit/pkg"

"github.com/coreos/coreos-cloudinit/Godeps/_workspace/src/github.com/sigma/vmw-guestinfo/rpcvmx"
"github.com/coreos/coreos-cloudinit/Godeps/_workspace/src/github.com/sigma/vmw-guestinfo/vmcheck"
"github.com/coreos/coreos-cloudinit/Godeps/_workspace/src/github.com/sigma/vmw-ovflib"
)

type readConfigFunction func(key string) (string, error)
Expand All @@ -39,65 +31,6 @@ type vmware struct {
urlDownload urlDownloadFunction
}

type ovfWrapper struct {
env *ovf.OvfEnvironment
}

func (ovf ovfWrapper) readConfig(key string) (string, error) {
return ovf.env.Properties["guestinfo."+key], nil
}

func NewDatasource(fileName string) *vmware {
getOvfReadConfig := func(ovfEnv []byte) readConfigFunction {
env := &ovf.OvfEnvironment{}
if len(ovfEnv) != 0 {
env = ovf.ReadEnvironment(ovfEnv)
}

wrapper := ovfWrapper{env}
return wrapper.readConfig
}

// read from provided ovf environment document (typically /media/ovfenv/ovf-env.xml)
if fileName != "" {
log.Printf("Using OVF environment from %s\n", fileName)
ovfEnv, err := ioutil.ReadFile(fileName)
if err != nil {
ovfEnv = make([]byte, 0)
}
return &vmware{
ovfFileName: fileName,
readConfig: getOvfReadConfig(ovfEnv),
urlDownload: urlDownload,
}
}

// try to read ovf environment from VMware tools
data, err := readConfig("ovfenv")
if err == nil && data != "" {
log.Printf("Using OVF environment from guestinfo\n")
return &vmware{
readConfig: getOvfReadConfig([]byte(data)),
urlDownload: urlDownload,
}
}

// if everything fails, fallback to directly reading variables from the backdoor
log.Printf("Using guestinfo variables\n")
return &vmware{
readConfig: readConfig,
urlDownload: urlDownload,
}
}

func (v vmware) IsAvailable() bool {
if v.ovfFileName != "" {
_, err := os.Stat(v.ovfFileName)
return !os.IsNotExist(err)
}
return vmcheck.IsVirtualWorld()
}

func (v vmware) AvailabilityChanges() bool {
return false
}
Expand Down Expand Up @@ -218,18 +151,3 @@ func (v vmware) FetchUserdata() ([]byte, error) {
func (v vmware) Type() string {
return "vmware"
}

func urlDownload(url string) ([]byte, error) {
client := pkg.NewHttpClient()
return client.GetRetry(url)
}

func readConfig(key string) (string, error) {
data, err := rpcvmx.NewConfig().String(key, "")
if err == nil {
log.Printf("Read from %q: %q\n", key, data)
} else {
log.Printf("Failed to read from %q: %v\n", key, err)
}
return data, err
}
101 changes: 101 additions & 0 deletions datasource/vmware/vmware_amd64.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
// Copyright 2015 CoreOS, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package vmware

import (
"io/ioutil"
"log"
"os"

"github.com/coreos/coreos-cloudinit/pkg"

"github.com/coreos/coreos-cloudinit/Godeps/_workspace/src/github.com/sigma/vmw-guestinfo/rpcvmx"
"github.com/coreos/coreos-cloudinit/Godeps/_workspace/src/github.com/sigma/vmw-guestinfo/vmcheck"
"github.com/coreos/coreos-cloudinit/Godeps/_workspace/src/github.com/sigma/vmw-ovflib"
)

type ovfWrapper struct {
env *ovf.OvfEnvironment
}

func (ovf ovfWrapper) readConfig(key string) (string, error) {
return ovf.env.Properties["guestinfo."+key], nil
}

func NewDatasource(fileName string) *vmware {
// read from provided ovf environment document (typically /media/ovfenv/ovf-env.xml)
if fileName != "" {
log.Printf("Using OVF environment from %s\n", fileName)
ovfEnv, err := ioutil.ReadFile(fileName)
if err != nil {
ovfEnv = make([]byte, 0)
}
return &vmware{
ovfFileName: fileName,
readConfig: getOvfReadConfig(ovfEnv),
urlDownload: urlDownload,
}
}

// try to read ovf environment from VMware tools
data, err := readConfig("ovfenv")
if err == nil && data != "" {
log.Printf("Using OVF environment from guestinfo\n")
return &vmware{
readConfig: getOvfReadConfig([]byte(data)),
urlDownload: urlDownload,
}
}

// if everything fails, fallback to directly reading variables from the backdoor
log.Printf("Using guestinfo variables\n")
return &vmware{
readConfig: readConfig,
urlDownload: urlDownload,
}
}

func (v vmware) IsAvailable() bool {
if v.ovfFileName != "" {
_, err := os.Stat(v.ovfFileName)
return !os.IsNotExist(err)
}
return vmcheck.IsVirtualWorld()
}

func readConfig(key string) (string, error) {
data, err := rpcvmx.NewConfig().String(key, "")
if err == nil {
log.Printf("Read from %q: %q\n", key, data)
} else {
log.Printf("Failed to read from %q: %v\n", key, err)
}
return data, err
}

func getOvfReadConfig (ovfEnv []byte) readConfigFunction {
env := &ovf.OvfEnvironment{}
if len(ovfEnv) != 0 {
env = ovf.ReadEnvironment(ovfEnv)
}

wrapper := ovfWrapper{env}
return wrapper.readConfig
}

func urlDownload(url string) ([]byte, error) {
client := pkg.NewHttpClient()
return client.GetRetry(url)
}
25 changes: 25 additions & 0 deletions datasource/vmware/vmware_unsupported.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// Copyright 2015 CoreOS, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// +build !amd64

package vmware

func NewDatasource(fileName string) *vmware {
return &vmware{}
}

func (v vmware) IsAvailable() bool {
return false
}

0 comments on commit 6e9109e

Please sign in to comment.