github.com/verrazzano/verrazzano@v1.7.1/tests/e2e/pkg/thanos.go (about)

     1  // Copyright (c) 2023, Oracle and/or its affiliates.
     2  // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
     3  
     4  package pkg
     5  
     6  import (
     7  	"context"
     8  	"encoding/json"
     9  	"fmt"
    10  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    11  	"net/http"
    12  )
    13  
    14  // GetRulesFromThanosRuler returns the rule data from the Thanos Ruler API given a kubeconfig
    15  func GetRulesFromThanosRuler(kubeconfigPath string) (interface{}, error) {
    16  	retryableClient, err := GetVerrazzanoHTTPClient(kubeconfigPath)
    17  	if err != nil {
    18  		Log(Error, fmt.Sprintf("Failed get an HTTP client: %v", err))
    19  		return nil, err
    20  	}
    21  
    22  	password, err := GetVerrazzanoPasswordInCluster(kubeconfigPath)
    23  	if err != nil {
    24  		Log(Error, fmt.Sprintf("Failed to get the Verrazzano password from the cluster %v", err))
    25  		return nil, err
    26  	}
    27  
    28  	url := fmt.Sprintf("%s/api/v1/rules", GetSystemThanosRulerURL(kubeconfigPath))
    29  	resp, err := doReq(url, "GET", "", "", "verrazzano", password, nil, retryableClient)
    30  	if err != nil {
    31  		Log(Error, fmt.Sprintf("Failed to make a request to the Thanos Ruler ingress %v", err))
    32  		return nil, err
    33  	}
    34  
    35  	if resp.StatusCode != http.StatusOK {
    36  		Log(Error, fmt.Sprintf("Failed to get an OK response from %s, response: %d", url, resp.StatusCode))
    37  		return nil, err
    38  	}
    39  
    40  	type ruleData struct {
    41  		Data interface{} `json:"data"`
    42  	}
    43  	var data ruleData
    44  	err = json.Unmarshal(resp.Body, &data)
    45  	if err != nil {
    46  		Log(Error, fmt.Sprintf("Failed to unmarshal the response data %s: %v", data, err))
    47  		return nil, err
    48  	}
    49  	Log(Debug, fmt.Sprintf("response body: %v", data.Data))
    50  
    51  	return data.Data, err
    52  }
    53  
    54  // GetSystemThanosRulerURL gets the system Thanos Ingress host in the given cluster
    55  func GetSystemThanosRulerURL(kubeconfigPath string) string {
    56  	clientset, err := GetKubernetesClientsetForCluster(kubeconfigPath)
    57  	if err != nil {
    58  		Log(Error, fmt.Sprintf("Failed to get clientset for cluster %v", err))
    59  		return ""
    60  	}
    61  	ingress, err := clientset.NetworkingV1().Ingresses(VerrazzanoNamespace).Get(context.TODO(), "thanos-ruler", metav1.GetOptions{})
    62  	if err != nil {
    63  		Log(Error, fmt.Sprintf("Failed to find Thanos Ruler Ingress %v", err))
    64  		return ""
    65  	}
    66  
    67  	Log(Info, fmt.Sprintf("Found Thanos Ruler Ingress %v, host %s", ingress.Name, ingress.Spec.Rules[0].Host))
    68  	return fmt.Sprintf("https://%s", ingress.Spec.Rules[0].Host)
    69  }