Skip to content

Commit

Permalink
Merge pull request #265 from pietern/clusters
Browse files Browse the repository at this point in the history
Clusters
  • Loading branch information
pietern committed May 22, 2015
2 parents 446f1a6 + fba0548 commit a31c97a
Show file tree
Hide file tree
Showing 6 changed files with 185 additions and 1 deletion.
41 changes: 41 additions & 0 deletions find/finder.go
Expand Up @@ -331,6 +331,47 @@ func (f *Finder) DefaultComputeResource(ctx context.Context) (*object.ComputeRes
return cr, nil
}

func (f *Finder) ClusterComputeResourceList(ctx context.Context, path string) ([]*object.ClusterComputeResource, error) {
es, err := f.find(ctx, f.hostFolder, false, path)
if err != nil {
return nil, err
}

var ccrs []*object.ClusterComputeResource
for _, e := range es {
var ccr *object.ClusterComputeResource

switch o := e.Object.(type) {
case mo.ClusterComputeResource:
ccr = object.NewClusterComputeResource(f.client, o.Reference())
default:
continue
}

ccr.InventoryPath = e.Path
ccrs = append(ccrs, ccr)
}

if len(ccrs) == 0 {
return nil, &NotFoundError{"cluster", path}
}

return ccrs, nil
}

func (f *Finder) ClusterComputeResource(ctx context.Context, path string) (*object.ClusterComputeResource, error) {
ccrs, err := f.ClusterComputeResourceList(ctx, path)
if err != nil {
return nil, err
}

if len(ccrs) > 1 {
return nil, &MultipleFoundError{"cluster", path}
}

return ccrs[0], nil
}

func (f *Finder) HostSystemList(ctx context.Context, path string) ([]*object.HostSystem, error) {
es, err := f.find(ctx, f.hostFolder, false, path)
if err != nil {
Expand Down
66 changes: 66 additions & 0 deletions object/cluster_compute_resource.go
Expand Up @@ -16,6 +16,72 @@ limitations under the License.

package object

import (
"github.com/vmware/govmomi/vim25"
"github.com/vmware/govmomi/vim25/methods"
"github.com/vmware/govmomi/vim25/types"
"golang.org/x/net/context"
)

type ClusterComputeResource struct {
ComputeResource

InventoryPath string
}

func NewClusterComputeResource(c *vim25.Client, ref types.ManagedObjectReference) *ClusterComputeResource {
return &ClusterComputeResource{
ComputeResource: *NewComputeResource(c, ref),
}
}

func (c ClusterComputeResource) ReconfigureCluster(ctx context.Context, spec types.ClusterConfigSpec) (*Task, error) {
req := types.ReconfigureCluster_Task{
This: c.Reference(),
Spec: spec,
Modify: true,
}

res, err := methods.ReconfigureCluster_Task(ctx, c.c, &req)
if err != nil {
return nil, err
}

return NewTask(c.c, res.Returnval), nil
}

func (c ClusterComputeResource) AddHost(ctx context.Context, spec types.HostConnectSpec, asConnected bool, license *string, resourcePool *types.ManagedObjectReference) (*Task, error) {
req := types.AddHost_Task{
This: c.Reference(),
Spec: spec,
AsConnected: asConnected,
}

if license != nil {
req.License = *license
}

if resourcePool != nil {
req.ResourcePool = resourcePool
}

res, err := methods.AddHost_Task(ctx, c.c, &req)
if err != nil {
return nil, err
}

return NewTask(c.c, res.Returnval), nil
}

func (c ClusterComputeResource) Destroy(ctx context.Context) (*Task, error) {
req := types.Destroy_Task{
This: c.Reference(),
}

res, err := methods.Destroy_Task(ctx, c.c, &req)
if err != nil {
return nil, err
}

return NewTask(c.c, res.Returnval), nil
}
20 changes: 20 additions & 0 deletions object/cluster_compute_resource_test.go
@@ -0,0 +1,20 @@
/*
Copyright (c) 2014 VMware, Inc. All Rights Reserved.
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 object

// ComputeResource should implement the Reference interface.
var _ Reference = ClusterComputeResource{}
14 changes: 14 additions & 0 deletions object/compute_resource.go
Expand Up @@ -18,6 +18,7 @@ package object

import (
"github.com/vmware/govmomi/vim25"
"github.com/vmware/govmomi/vim25/methods"
"github.com/vmware/govmomi/vim25/mo"
"github.com/vmware/govmomi/vim25/types"
"golang.org/x/net/context"
Expand Down Expand Up @@ -73,3 +74,16 @@ func (c ComputeResource) ResourcePool(ctx context.Context) (*ResourcePool, error

return NewResourcePool(c.c, *cr.ResourcePool), nil
}

func (c ComputeResource) Destroy(ctx context.Context) (*Task, error) {
req := types.Destroy_Task{
This: c.Reference(),
}

res, err := methods.Destroy_Task(ctx, c.c, &req)
if err != nil {
return nil, err
}

return NewTask(c.c, res.Returnval), nil
}
43 changes: 43 additions & 0 deletions object/folder.go
Expand Up @@ -75,6 +75,26 @@ func (f Folder) CreateDatacenter(ctx context.Context, datacenter string) (*Datac
return NewDatacenter(f.c, res.Returnval), nil
}

func (f Folder) CreateCluster(ctx context.Context, cluster string, spec types.ClusterConfigSpecEx) (*ClusterComputeResource, error) {
req := types.CreateClusterEx{
This: f.Reference(),
Name: cluster,
Spec: spec,
}

res, err := methods.CreateClusterEx(ctx, f.c, &req)
if err != nil {
return nil, err
}

// Response will be nil if this is an ESX host that does not belong to a vCenter
if res == nil {
return nil, nil
}

return NewClusterComputeResource(f.c, res.Returnval), nil
}

func (f Folder) CreateFolder(ctx context.Context, name string) (*Folder, error) {
req := types.CreateFolder{
This: f.Reference(),
Expand All @@ -89,6 +109,29 @@ func (f Folder) CreateFolder(ctx context.Context, name string) (*Folder, error)
return NewFolder(f.c, res.Returnval), err
}

func (f Folder) AddStandaloneHost(ctx context.Context, spec types.HostConnectSpec, addConnected bool, license *string, compResSpec *types.BaseComputeResourceConfigSpec) (*Task, error) {
req := types.AddStandaloneHost_Task{
This: f.Reference(),
Spec: spec,
AddConnected: addConnected,
}

if license != nil {
req.License = *license
}

if compResSpec != nil {
req.CompResSpec = *compResSpec
}

res, err := methods.AddStandaloneHost_Task(ctx, f.c, &req)
if err != nil {
return nil, err
}

return NewTask(f.c, res.Returnval), nil
}

func (f Folder) CreateVM(ctx context.Context, config types.VirtualMachineConfigSpec, pool *ResourcePool, host *HostSystem) (*Task, error) {
req := types.CreateVM_Task{
This: f.Reference(),
Expand Down
2 changes: 1 addition & 1 deletion object/types.go
Expand Up @@ -44,7 +44,7 @@ func NewReference(c *vim25.Client, e types.ManagedObjectReference) Reference {
case "ComputeResource":
return NewComputeResource(c, e)
case "ClusterComputeResource":
return &ClusterComputeResource{*NewComputeResource(c, e)}
return NewClusterComputeResource(c, e)
case "HostSystem":
return NewHostSystem(c, e)
case "Network":
Expand Down

0 comments on commit a31c97a

Please sign in to comment.