Skip to content

Commit

Permalink
allow configuring vsphere vm folder (#207)
Browse files Browse the repository at this point in the history
* fix silently ignored config errors in vsphere provider
* Make vSphere vm directory configurable (#204)
  • Loading branch information
kdomanski committed May 8, 2018
1 parent dce5d23 commit 93bde10
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 1 deletion.
19 changes: 18 additions & 1 deletion pkg/cloudprovider/provider/vsphere/helper.go
Expand Up @@ -33,7 +33,7 @@ const (

var errSnapshotNotFound = errors.New("no snapshot with given name found")

func CreateLinkClonedVm(vmName, vmImage, datacenter, clusterName string, cpus int32, memoryMB int64, client *govmomi.Client, containerLinuxUserdata string) error {
func CreateLinkClonedVm(vmName, vmImage, datacenter, clusterName, folder string, cpus int32, memoryMB int64, client *govmomi.Client, containerLinuxUserdata string) error {
f := find.NewFinder(client.Client, true)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
Expand All @@ -55,6 +55,22 @@ func CreateLinkClonedVm(vmName, vmImage, datacenter, clusterName string, cpus in
return fmt.Errorf("failed to get datacenter folders: %v", err)
}

// Find the target folder, if its include in the provider config.
var targetVMFolderRefPtr *types.ManagedObjectReference
if folder != "" {
// If non-absolute folder name is used, e.g. 'duplicate-folder' it can match
// multiple folders and thus fail. It will also gladly match a folder from
// a different datacenter. It is therefore preferable to use absolute folder
// paths, e.g. '/Datacenter/vm/nested/folder'.
// The target folder must already exist.
targetVMFolder, folderErr := f.Folder(ctx, folder)
if folderErr != nil {
return fmt.Errorf("failed to get target folder: %v", folderErr)
}
targetVMFolderRef := targetVMFolder.Reference()
targetVMFolderRefPtr = &targetVMFolderRef
}

// Create snapshot of the template VM if not already snapshotted.
snapshot, err := findSnapshot(templateVm, ctx, snapshotName)
if err != nil {
Expand Down Expand Up @@ -119,6 +135,7 @@ func CreateLinkClonedVm(vmName, vmImage, datacenter, clusterName string, cpus in
},
Location: types.VirtualMachineRelocateSpec{
Pool: &resPoolRef,
Folder: targetVMFolderRefPtr,
DiskMoveType: string(types.VirtualMachineRelocateDiskMoveOptionsCreateNewChildDiskBacking),
},
Snapshot: &snapshotRef,
Expand Down
15 changes: 15 additions & 0 deletions pkg/cloudprovider/provider/vsphere/provider.go
Expand Up @@ -43,6 +43,7 @@ type RawConfig struct {
VSphereURL providerconfig.ConfigVarString `json:"vsphereURL"`
Datacenter providerconfig.ConfigVarString `json:"datacenter"`
Cluster providerconfig.ConfigVarString `json:"cluster"`
Folder providerconfig.ConfigVarString `json:"folder"`
Datastore providerconfig.ConfigVarString `json:"datastore"`
CPUs int32 `json:"cpus"`
MemoryMB int64 `json:"memoryMB"`
Expand All @@ -56,6 +57,7 @@ type Config struct {
VSphereURL string
Datacenter string
Cluster string
Folder string
Datastore string
AllowInsecure bool
CPUs int32
Expand Down Expand Up @@ -108,6 +110,9 @@ func (p *provider) getConfig(s runtime.RawExtension) (*Config, *providerconfig.C

rawConfig := RawConfig{}
err = json.Unmarshal(pconfig.CloudProviderSpec.Raw, &rawConfig)
if err != nil {
return nil, nil, err
}

c := Config{}
c.TemplateVMName, err = p.configVarResolver.GetConfigVarStringValue(rawConfig.TemplateVMName)
Expand Down Expand Up @@ -140,6 +145,11 @@ func (p *provider) getConfig(s runtime.RawExtension) (*Config, *providerconfig.C
return nil, nil, err
}

c.Folder, err = p.configVarResolver.GetConfigVarStringValue(rawConfig.Folder)
if err != nil {
return nil, nil, err
}

c.Datastore, err = p.configVarResolver.GetConfigVarStringValue(rawConfig.Datastore)
if err != nil {
return nil, nil, err
Expand All @@ -158,6 +168,10 @@ func (p *provider) getConfig(s runtime.RawExtension) (*Config, *providerconfig.C

func (p *provider) Validate(spec v1alpha1.MachineSpec) error {
config, _, err := p.getConfig(spec.ProviderConfig)
if err != nil {
return err
}

client, err := getClient(config.Username, config.Password, config.VSphereURL, config.AllowInsecure)
if err != nil {
return fmt.Errorf("failed to get vsphere client: '%v'", err)
Expand Down Expand Up @@ -207,6 +221,7 @@ func (p *provider) Create(machine *v1alpha1.Machine, userdata string) (instance.
config.TemplateVMName,
config.Datacenter,
config.Cluster,
config.Folder,
config.CPUs,
config.MemoryMB,
client,
Expand Down
1 change: 1 addition & 0 deletions test/e2e/provisioning/testdata/machine-vsphere.yaml
Expand Up @@ -16,6 +16,7 @@ spec:
username: '<< VSPHERE_USERNAME >>'
vsphereURL: 'https://<< VSPHERE_ADDRESS >>'
datacenter: 'Datacenter'
folder: '/Datacenter/vm/e2e-tests'
password: << VSPHERE_PASSWORD >>
cluster: "test-cluster"
datastore: datastore1
Expand Down

0 comments on commit 93bde10

Please sign in to comment.