github.com/redhat-appstudio/e2e-tests@v0.0.0-20240520140907-9709f6f59323/pkg/clients/sprayproxy/sprayproxy.go (about)

     1  package sprayproxy
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"crypto/tls"
     7  	"encoding/json"
     8  	"fmt"
     9  	"io"
    10  	"net/http"
    11  	"strings"
    12  
    13  	routev1 "github.com/openshift/api/route/v1"
    14  	kubeCl "github.com/redhat-appstudio/e2e-tests/pkg/clients/kubernetes"
    15  	"k8s.io/apimachinery/pkg/types"
    16  )
    17  
    18  func NewSprayProxyConfig(url string, token string) (*SprayProxyConfig, error) {
    19  	return &SprayProxyConfig{
    20  		BaseURL: url,
    21  		HTTPClient: &http.Client{
    22  			Transport: &http.Transport{
    23  				TLSClientConfig: &tls.Config{
    24  					// #nosec G402
    25  					InsecureSkipVerify: true,
    26  				},
    27  			},
    28  		},
    29  		Token: token,
    30  	}, nil
    31  }
    32  
    33  func (s *SprayProxyConfig) RegisterServer(pacHost string) (string, error) {
    34  	bytesData, err := buildBodyData(pacHost)
    35  	if err != nil {
    36  		return "", err
    37  	}
    38  
    39  	result, err := s.sendRequest(http.MethodPost, bytes.NewReader(bytesData))
    40  	if err != nil {
    41  		return "", err
    42  	}
    43  	return result, nil
    44  }
    45  
    46  func (s *SprayProxyConfig) UnregisterServer(pacHost string) (string, error) {
    47  	bytesData, err := buildBodyData(pacHost)
    48  	if err != nil {
    49  		return "", err
    50  	}
    51  
    52  	result, err := s.sendRequest(http.MethodDelete, bytes.NewReader(bytesData))
    53  	if err != nil {
    54  		return "", err
    55  	}
    56  	return result, nil
    57  }
    58  
    59  func (s *SprayProxyConfig) GetServers() (string, error) {
    60  	result, err := s.sendRequest(http.MethodGet, nil)
    61  	if err != nil {
    62  		return "", err
    63  	}
    64  	return strings.TrimPrefix(result, "Backend urls:"), nil
    65  }
    66  
    67  func (s *SprayProxyConfig) sendRequest(httpMethod string, data io.Reader) (string, error) {
    68  	requestURL := s.BaseURL + "/backends"
    69  
    70  	req, err := http.NewRequest(httpMethod, requestURL, data)
    71  	if err != nil {
    72  		return "", err
    73  	}
    74  	req.Header.Set("Content-Type", "application/json; charset=utf-8")
    75  	req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", s.Token))
    76  
    77  	res, err := s.HTTPClient.Do(req)
    78  	if err != nil {
    79  		return "", err
    80  	}
    81  
    82  	body, err := io.ReadAll(res.Body)
    83  	if err != nil {
    84  		return "", fmt.Errorf("failed to access SprayProxy server with status code: %d and body: %s", res.StatusCode, string(body))
    85  	}
    86  
    87  	defer res.Body.Close()
    88  
    89  	return string(body), err
    90  }
    91  
    92  func GetPaCHost() (string, error) {
    93  	k8sClient, err := kubeCl.NewAdminKubernetesClient()
    94  	if err != nil {
    95  		return "", err
    96  	}
    97  
    98  	namespaceName := types.NamespacedName{
    99  		Name:      pacRouteName,
   100  		Namespace: pacNamespace,
   101  	}
   102  
   103  	route := &routev1.Route{}
   104  	err = k8sClient.KubeRest().Get(context.Background(), namespaceName, route)
   105  	if err != nil {
   106  		return "", err
   107  	}
   108  	return fmt.Sprintf("https://%s", route.Spec.Host), nil
   109  }
   110  
   111  func buildBodyData(pacHost string) ([]byte, error) {
   112  	data := make(map[string]string)
   113  	data["url"] = pacHost
   114  	bytesData, err := json.Marshal(data)
   115  	if err != nil {
   116  		return nil, err
   117  	}
   118  	return bytesData, nil
   119  }