func CreateNoDCCheck(ctx context.Context, input *data.Data) (*Validator, error) { defer trace.End(trace.Begin("")) var err error v := &Validator{} v.Context = ctx tURL := input.URL // default to https scheme if tURL.Scheme == "" { tURL.Scheme = "https" } // if they specified only an IP address the parser for some reason considers that a path if tURL.Host == "" { tURL.Host = tURL.Path tURL.Path = "" } if tURL.Scheme == "https" && input.Thumbprint == "" { var cert object.HostCertificateInfo if err = cert.FromURL(tURL, new(tls.Config)); err != nil { return nil, err } if cert.Err != nil { if !input.Force { // TODO: prompt user / check ./known_hosts log.Errorf("Failed to verify certificate for target=%s (thumbprint=%s)", tURL.Host, cert.ThumbprintSHA1) return nil, cert.Err } } input.Thumbprint = cert.ThumbprintSHA1 log.Debugf("Accepting host %q thumbprint %s", tURL.Host, input.Thumbprint) } sessionconfig := &session.Config{ Thumbprint: input.Thumbprint, Insecure: input.Force, } // if a datacenter was specified, set it v.DatacenterPath = tURL.Path if v.DatacenterPath != "" { sessionconfig.DatacenterPath = v.DatacenterPath // path needs to be stripped before we can use it as a service url tURL.Path = "" } sessionconfig.Service = tURL.String() v.Session = session.NewSession(sessionconfig) v.Session, err = v.Session.Connect(v.Context) if err != nil { return nil, err } // cached here to allow a modicum of testing while session is still in use. v.isVC = v.Session.IsVC() finder := find.NewFinder(v.Session.Client.Client, false) v.Session.Finder = finder v.Session.Populate(ctx) // only allow the datacenter to be specified in the taget url, if any pElems := strings.Split(v.DatacenterPath, "/") if len(pElems) > 2 { detail := "--target should only specify datacenter in the path (e.g. https://addr/datacenter) - specify cluster, resource pool, or folder with --compute-resource" log.Error(detail) v.suggestDatacenter() return nil, errors.New(detail) } return v, nil }