func (d *Dispatcher) NewVCHFromComputePath(computePath string, name string, v *validate.Validator) (*vm.VirtualMachine, error) { defer trace.End(trace.Begin(fmt.Sprintf("path %q, name %q", computePath, name))) var err error parent, err := v.ResourcePoolHelper(d.ctx, computePath) if err != nil { return nil, err } d.vchPoolPath = path.Join(parent.InventoryPath, name) var vchPool *object.ResourcePool if d.isVC { vapp, err := d.findVirtualApp(d.vchPoolPath) if err != nil { log.Errorf("Failed to get VCH virtual app %q: %s", d.vchPoolPath, err) return nil, err } if vapp != nil { vchPool = vapp.ResourcePool } } if vchPool == nil { vchPool, err = d.session.Finder.ResourcePool(d.ctx, d.vchPoolPath) if err != nil { log.Errorf("Failed to get VCH resource pool %q: %s", d.vchPoolPath, err) return nil, err } } rp := compute.NewResourcePool(d.ctx, d.session, vchPool.Reference()) var vmm *vm.VirtualMachine if vmm, err = rp.GetChildVM(d.ctx, d.session, name); err != nil { log.Errorf("Failed to get VCH VM: %s", err) return nil, err } if vmm == nil { err = errors.Errorf("Didn't find VM %q in resource pool %q", name, rp.Name()) log.Error(err) return nil, err } vmm.InventoryPath = path.Join(d.vchPoolPath, name) // check if it's VCH var ok bool if ok, err = d.isVCH(vmm); err != nil { log.Error(err) return nil, err } if !ok { err = errors.Errorf("Not a VCH") log.Error(err) return nil, err } return vmm, nil }
func (l *List) Run(cli *cli.Context) (err error) { if err = l.processParams(); err != nil { return err } if l.Debug.Debug > 0 { log.SetLevel(log.DebugLevel) trace.Logger.Level = log.DebugLevel } if len(cli.Args()) > 0 { log.Errorf("Unknown argument: %s", cli.Args()[0]) return errors.New("invalid CLI arguments") } log.Infof("### Listing VCHs ####") ctx, cancel := context.WithTimeout(context.Background(), l.Timeout) defer cancel() defer func() { if ctx.Err() != nil && ctx.Err() == context.DeadlineExceeded { //context deadline exceeded, replace returned error message err = errors.Errorf("List timed out: use --timeout to add more time") } }() var validator *validate.Validator if l.Data.ComputeResourcePath == "" { validator, err = validate.CreateNoDCCheck(ctx, l.Data) } else { validator, err = validate.NewValidator(ctx, l.Data) } if err != nil { log.Errorf("List cannot continue - failed to create validator: %s", err) return errors.New("list failed") } _, err = validator.ValidateTarget(ctx, l.Data) if err != nil { log.Errorf("List cannot continue - target validation failed: %s", err) return err } _, err = validator.ValidateCompute(ctx, l.Data) if err != nil { log.Errorf("List cannot continue - compute resource validation failed: %s", err) return err } executor := management.NewDispatcher(validator.Context, validator.Session, nil, false) vchs, err := executor.SearchVCHs(validator.ResourcePoolPath) if err != nil { log.Errorf("List cannot continue - failed to search VCHs in %s: %s", validator.ResourcePoolPath, err) } l.prettyPrint(cli, ctx, vchs, executor) return nil }