func (l Lister) retrieveProperties(ctx context.Context, req types.RetrieveProperties, dst *[]interface{}) error { res, err := l.Collector.RetrieveProperties(ctx, req) if err != nil { return err } // Instead of using mo.LoadRetrievePropertiesResponse, use a custom loop to // iterate over the results and ignore entries that have properties that // could not be retrieved (a non-empty `missingSet` property). Since the // returned objects are enumerated by vSphere in the first place, any object // that has a non-empty `missingSet` property is indicative of a race // condition in vSphere where the object was enumerated initially, but was // removed before its properties could be collected. for _, p := range res.Returnval { v, err := mo.ObjectContentToType(p) if err != nil { // Ignore fault if it is ManagedObjectNotFound if soap.IsVimFault(err) { switch soap.ToVimFault(err).(type) { case *types.ManagedObjectNotFound: continue } } return err } *dst = append(*dst, v) } return nil }
func isTaskInProgress(err error) bool { if soap.IsSoapFault(err) { switch f := soap.ToSoapFault(err).VimFault().(type) { case types.TaskInProgress: return true default: logSoapFault(f) } } if soap.IsVimFault(err) { switch f := soap.ToVimFault(err).(type) { case *types.TaskInProgress: return true default: logFault(f) } } switch err := err.(type) { case task.Error: if _, ok := err.Fault().(*types.TaskInProgress); ok { return true } logFault(err.Fault()) default: if f, ok := err.(types.HasFault); ok { logFault(f.Fault()) } else { logError(err) } } return false }
func TestNotAuthenticatedFault(t *testing.T) { var s SessionManager err := LoadRetrievePropertiesResponse(load("fixtures/not_authenticated_fault.xml"), &s) if !soap.IsVimFault(err) { t.Errorf("Expected IsVimFault") } fault := soap.ToVimFault(err).(*types.NotAuthenticated) if fault.PrivilegeId != "System.View" { t.Errorf("Expected first fault to be returned") } }