func()

in common/apiserver/fromexe.go [174:258]


func (p *ExternalExecutableProvider) unsafeProvision(logger logrus.FieldLogger) {
	configDir, err := pathutil.GetConfigPath()
	if err != nil {
		configDir = ""
		logger.WithError(err).Error("Get config path failed")
	}

	crossVersionConfigDir, err := pathutil.GetCrossVersionConfigPath()
	if err != nil {
		crossVersionConfigDir = ""
		logger.WithError(err).Error("Get cross version config path failed")
	}
	if configDir == "" && crossVersionConfigDir == "" {
		return
	}

	for _, candidateName := range candidateExternalExecutableProviderNames {
		candidatePath := filepath.Join(configDir, candidateName)
		if _, err := os.Stat(candidatePath); !os.IsNotExist(err) {
			p.executablePath = &candidatePath
			break
		}
	}
	if p.executablePath == nil {
		for _, candidateName := range candidateExternalExecutableProviderNames {
			candidatePath := filepath.Join(crossVersionConfigDir, candidateName)
			if _, err := os.Stat(candidatePath); !os.IsNotExist(err) {
				p.executablePath = &candidatePath
				break
			}
		}
	}
	if p.executablePath == nil {
		noExecutablePath := ""
		p.executablePath = &noExecutablePath
		return
	}

	stdout, stderr, err := runExternalProvider(*p.executablePath)
	logger = logger.WithFields(logrus.Fields{
		"path":   *p.executablePath,
		"stdout": stdout,
		"stderr": stderr,
	})
	if err != nil {
		logger.WithError(err).Error("Failed to run external API server provider")
		return
	}

	var provision model.ProvisionOutputV1
	if err := json.Unmarshal([]byte(stdout), &provision); err != nil {
		logger.WithError(err).Error("Mal-formatted stdout from external provider")
		return
	}
	if provision.SchemaVersion != "1.0" {
		logger.WithError(errors.New("unknown schema version")).Errorf("Failed to parse provider stdout of schema version %s", provision.SchemaVersion)
		return
	}

	var provisionErr model.ErrorOutputV1
	if err := json.Unmarshal([]byte(stderr), &provisionErr); err != nil {
		logger.WithError(err).Error("Mal-formatted stderr from external provider")
	}
	if provisionErr.SchemaVersion != "1.0" {
		logger.WithError(errors.New("unknown schema version")).Errorf("Failed to parse provider stderr of schema version %s", provisionErr.SchemaVersion)
		return
	}

	pemCerts := []byte(provision.Result.CACertificate)
	p.pemCerts = &pemCerts
	p.serverDomain = &provision.Result.ServerDomain
	p.extraHTTPheaders = &provision.Result.ExtraHTTPHeaders
	p.regionId = &provision.Result.RegionId
	for _, errmsg := range provisionErr.Error {
		switch errmsg.Code {
		case model.CodeGetServerDomainError:
			p.serverDomainError = errmsg.Message
		case model.CodeGetCACertificateError:
			p.pemCertsError = errmsg.Message
		case model.CodeRegionIdError:
			p.regionIdError = errmsg.Message
		}
	}
	logger.WithField("provision", p).Info("Provisioned API server information with external provider")
}