@@ -21,6 +21,7 @@ import (
2121 "errors"
2222 "fmt"
2323 "path"
24+ "strings"
2425
2526 "github.com/vmware/govmomi/property"
2627 "github.com/vmware/govmomi/vim25"
@@ -136,13 +137,58 @@ func (c Common) SetCustomValue(ctx context.Context, key string, value string) er
136137 return err
137138}
138139
140+ var refTypeMap = map [string ]string {
141+ "datacenter" : "Datacenter" ,
142+ "datastore" : "Datastore" ,
143+ "domain" : "ComputeResource" ,
144+ "dvportgroup" : "DistributedVirtualPortgroup" ,
145+ "dvs" : "DistributedVirtualSwitch" ,
146+ "group" : "Folder" ,
147+ "host" : "HostSystem" ,
148+ "network" : "Network" ,
149+ "resgroup" : "ResourcePool" ,
150+ "vm" : "VirtualMachine" ,
151+ }
152+
153+ // sub types
154+ var prefixTypeMap = map [string ]struct { prefix , kind string }{
155+ "domain" : {"c" , "ClusterComputeResource" }, // extends ComputeResource
156+ "group" : {"p" , "StoragePod" }, // extends Folder
157+ "resgroup" : {"v" , "VirtualApp" }, // extends ResourcePool
158+ }
159+
160+ // ReferenceFromString converts a string to ManagedObjectReference.
161+ // First checks for ManagedObjectReference (MOR), in the format of:
162+ // "$Type:$ID", e.g. "Datacenter:datacenter-3"
163+ // Next checks for Managed Object ID (MOID), where type is derived from the ID.
164+ // For example, "datacenter-3" is converted to a MOR "Datacenter:datacenter-3"
165+ // Returns nil if string is not in either format.
139166func ReferenceFromString (s string ) * types.ManagedObjectReference {
140167 var ref types.ManagedObjectReference
141- if ! ref .FromString (s ) {
168+ if ref .FromString (s ) && mo .IsManagedObjectType (ref .Type ) {
169+ return & ref
170+ }
171+
172+ id := strings .SplitN (s , "-" , 2 )
173+ if len (id ) != 2 {
142174 return nil
143175 }
144- if mo .IsManagedObjectType (ref .Type ) {
145- return & ref
176+
177+ if kind , ok := refTypeMap [id [0 ]]; ok {
178+ if p , ok := prefixTypeMap [id [0 ]]; ok {
179+ if strings .HasPrefix (id [1 ], p .prefix ) {
180+ return & types.ManagedObjectReference {
181+ Type : p .kind ,
182+ Value : s ,
183+ }
184+ }
185+ }
186+
187+ return & types.ManagedObjectReference {
188+ Type : kind ,
189+ Value : s ,
190+ }
146191 }
192+
147193 return nil
148194}
0 commit comments