@@ -19,59 +19,67 @@ package cluster
1919import (
2020 "context"
2121
22+ "github.com/pkg/errors"
2223 "github.com/vmware/govmomi/object"
2324 "github.com/vmware/govmomi/vim25/types"
2425)
2526
26- func AddVMToGroup (ctx computeClusterContext , clusterName , vmGroupName , vm string ) error {
27+ func FindVMGroup (ctx computeClusterContext , clusterName , vmGroupName string ) ( * VMGroup , error ) {
2728 ccr , err := ctx .GetSession ().Finder .ClusterComputeResource (ctx , clusterName )
2829 if err != nil {
29- return err
30+ return nil , err
3031 }
3132
32- vms , err := listVMs (ctx , ccr , vmGroupName )
33+ clusterConfigInfoEx , err := ccr . Configuration (ctx )
3334 if err != nil {
34- return err
35+ return nil , err
3536 }
36-
37- vmObj , err := ctx .GetSession ().Finder .VirtualMachine (ctx , vm )
38- if err != nil {
39- return err
37+ for _ , group := range clusterConfigInfoEx .Group {
38+ if clusterVMGroup , ok := group .(* types.ClusterVmGroup ); ok {
39+ if clusterVMGroup .Name == vmGroupName {
40+ return & VMGroup {ccr , clusterVMGroup }, nil
41+ }
42+ }
4043 }
41- vms = append (vms , vmObj .Reference ())
44+ return nil , errors .Errorf ("cannot find VM group %s" , vmGroupName )
45+ }
46+
47+ // VMGroup represents a VSphere VM Group object
48+ type VMGroup struct {
49+ * object.ClusterComputeResource
50+ * types.ClusterVmGroup
51+ }
52+
53+ // Add a VSphere VM object to the VM Group
54+ func (vg VMGroup ) Add (ctx context.Context , vmObj types.ManagedObjectReference ) (* object.Task , error ) {
55+ vms := vg .listVMs ()
56+ vg .ClusterVmGroup .Vm = append (vms , vmObj ) //nolint:gocritic
4257
43- info := & types.ClusterVmGroup {
44- ClusterGroupInfo : types.ClusterGroupInfo {
45- Name : vmGroupName ,
46- },
47- Vm : vms ,
48- }
4958 spec := & types.ClusterConfigSpecEx {
5059 GroupSpec : []types.ClusterGroupSpec {
5160 {
5261 ArrayUpdateSpec : types.ArrayUpdateSpec {
5362 Operation : types .ArrayUpdateOperationEdit ,
5463 },
55- Info : info ,
64+ Info : vg . ClusterVmGroup ,
5665 },
5766 },
5867 }
59- return reconfigure (ctx , ccr , spec )
68+ return vg . ClusterComputeResource . Reconfigure (ctx , spec , true )
6069}
6170
62- func listVMs (ctx context.Context , ccr * object.ClusterComputeResource , vmGroupName string ) ([]types.ManagedObjectReference , error ) {
63- clusterConfigInfoEx , err := ccr .Configuration (ctx )
64- if err != nil {
65- return nil , err
66- }
71+ // HasVM returns whether a VSphere VM object is a member of the VM Group
72+ func (vg VMGroup ) HasVM (vmObj types.ManagedObjectReference ) (bool , error ) {
73+ vms := vg .listVMs ()
6774
68- var refs []types.ManagedObjectReference
69- for _ , group := range clusterConfigInfoEx .Group {
70- if clusterVMGroup , ok := group .(* types.ClusterVmGroup ); ok {
71- if clusterVMGroup .Name == vmGroupName {
72- return clusterVMGroup .Vm , nil
73- }
75+ for _ , vm := range vms {
76+ if vm == vmObj {
77+ return true , nil
7478 }
7579 }
76- return refs , nil
80+ return false , nil
81+ }
82+
83+ func (vg VMGroup ) listVMs () []types.ManagedObjectReference {
84+ return vg .ClusterVmGroup .Vm
7785}
0 commit comments