func GetMetadata()

in azkustodata/cloudinfo.go [54:111]


func GetMetadata(kustoUri string, httpClient *http.Client) (CloudInfo, error) {
	// retrieve &return if exists
	once, ok := cloudInfoCache.Load(kustoUri)
	if !ok {
		once = utils.NewOnce[CloudInfo]()
		cloudInfoCache.Store(kustoUri, once)
	}

	return once.(utils.Once[CloudInfo]).Do(func() (CloudInfo, error) {
		u, err := url.Parse(kustoUri)
		if err != nil {
			return CloudInfo{}, err
		}

		// Auth metadata is always at the root of the cluster
		u.Path = metadataPath
		u.RawQuery = ""

		// TODO should we make this timeout configurable.
		req, err := http.NewRequest("GET", u.String(), nil)

		if err != nil {
			return CloudInfo{}, kustoErrors.E(kustoErrors.OpCloudInfo, kustoErrors.KHTTPError, err)
		}
		resp, err := httpClient.Do(req)

		if err != nil {
			return CloudInfo{}, err
		}

		// Handle internal server error as a special case and return as an error (to be consistent with other SDK's)
		if resp.StatusCode >= 300 && resp.StatusCode != 404 {
			return CloudInfo{}, kustoErrors.E(kustoErrors.OpCloudInfo, kustoErrors.KHTTPError, fmt.Errorf("error %s when querying endpoint %s",
				resp.Status, u.String()),
			)
		}

		defer resp.Body.Close()

		b, err := io.ReadAll(resp.Body)
		if err != nil {
			return CloudInfo{}, kustoErrors.E(kustoErrors.OpCloudInfo, kustoErrors.KHTTPError, err)
		}

		// Covers scenarios of 200/OK with no body or a 404 where there is no body
		if len(b) == 0 {
			return defaultCloudInfo, nil
		}

		md := metaResp{}

		if err := json.Unmarshal(b, &md); err != nil {
			return CloudInfo{}, err
		}
		// this should be set in the map by now
		return md.AzureAD, nil
	})
}