* serverless connecction * Adding api key * fix * addressing pr comments * fixing tests * refactoring * changing to value semantic * addressing pr comments * minor changes --------- Co-authored-by: Lucas Francisco Lopez <lucas.lopez@elastic.co>
52 lines
1.4 KiB
Go
52 lines
1.4 KiB
Go
package es
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
)
|
|
|
|
type VersionInfo struct {
|
|
BuildFlavor string `json:"build_flavor"`
|
|
}
|
|
|
|
// ClusterInfo represents Elasticsearch cluster information returned from the root endpoint.
|
|
// It is used to determine cluster capabilities and configuration like whether the cluster is serverless.
|
|
type ClusterInfo struct {
|
|
Version VersionInfo `json:"version"`
|
|
}
|
|
|
|
const (
|
|
BuildFlavorServerless = "serverless"
|
|
)
|
|
|
|
// GetClusterInfo fetches cluster information from the Elasticsearch root endpoint.
|
|
// It returns the cluster build flavor which is used to determine if the cluster is serverless.
|
|
func GetClusterInfo(httpCli *http.Client, url string) (clusterInfo ClusterInfo, err error) {
|
|
resp, err := httpCli.Get(url)
|
|
if err != nil {
|
|
return ClusterInfo{}, fmt.Errorf("error getting ES cluster info: %w", err)
|
|
}
|
|
|
|
if resp.StatusCode != http.StatusOK {
|
|
return ClusterInfo{}, fmt.Errorf("unexpected status code %d getting ES cluster info", resp.StatusCode)
|
|
}
|
|
|
|
defer func() {
|
|
if closeErr := resp.Body.Close(); closeErr != nil && err == nil {
|
|
err = fmt.Errorf("error closing response body: %w", closeErr)
|
|
}
|
|
}()
|
|
|
|
err = json.NewDecoder(resp.Body).Decode(&clusterInfo)
|
|
if err != nil {
|
|
return ClusterInfo{}, fmt.Errorf("error decoding ES cluster info: %w", err)
|
|
}
|
|
|
|
return clusterInfo, nil
|
|
}
|
|
|
|
func (ci ClusterInfo) IsServerless() bool {
|
|
return ci.Version.BuildFlavor == BuildFlavorServerless
|
|
}
|