github.com/Racer159/jackal@v0.32.7-0.20240401174413-0bd2339e4f2e/src/test/e2e/21_connect_creds_test.go (about)

     1  // SPDX-License-Identifier: Apache-2.0
     2  // SPDX-FileCopyrightText: 2021-Present The Jackal Authors
     3  
     4  // Package test provides e2e tests for Jackal.
     5  package test
     6  
     7  import (
     8  	"crypto/tls"
     9  	"fmt"
    10  	"io"
    11  	"net/http"
    12  	"strings"
    13  	"testing"
    14  
    15  	"github.com/Racer159/jackal/src/pkg/cluster"
    16  	"github.com/stretchr/testify/require"
    17  )
    18  
    19  type RegistryResponse struct {
    20  	Repositories []string `json:"repositories"`
    21  }
    22  
    23  func TestConnectAndCreds(t *testing.T) {
    24  	t.Log("E2E: Connect")
    25  	e2e.SetupWithCluster(t)
    26  
    27  	prevAgentSecretData, _, err := e2e.Kubectl("get", "secret", "agent-hook-tls", "-n", "jackal", "-o", "jsonpath={.data}")
    28  	require.NoError(t, err)
    29  
    30  	connectToJackalServices(t)
    31  
    32  	stdOut, stdErr, err := e2e.Jackal("tools", "update-creds", "--confirm")
    33  	require.NoError(t, err, stdOut, stdErr)
    34  
    35  	newAgentSecretData, _, err := e2e.Kubectl("get", "secret", "agent-hook-tls", "-n", "jackal", "-o", "jsonpath={.data}")
    36  	require.NoError(t, err)
    37  	require.NotEqual(t, prevAgentSecretData, newAgentSecretData, "agent secrets should not be the same")
    38  
    39  	connectToJackalServices(t)
    40  
    41  	stdOut, stdErr, err = e2e.Jackal("package", "remove", "init", "--components=logging", "--confirm")
    42  	require.NoError(t, err, stdOut, stdErr)
    43  
    44  	// Prune the images from Grafana and ensure that they are gone
    45  	stdOut, stdErr, err = e2e.Jackal("tools", "registry", "prune", "--confirm")
    46  	require.NoError(t, err, stdOut, stdErr)
    47  
    48  	stdOut, stdErr, err = e2e.Jackal("tools", "registry", "ls", "127.0.0.1:31337/library/registry")
    49  	require.NoError(t, err, stdOut, stdErr)
    50  	require.Contains(t, stdOut, "2.8.3")
    51  	stdOut, stdErr, err = e2e.Jackal("tools", "registry", "ls", "127.0.0.1:31337/grafana/promtail")
    52  	require.NoError(t, err, stdOut, stdErr)
    53  	require.Equal(t, stdOut, "")
    54  	stdOut, stdErr, err = e2e.Jackal("tools", "registry", "ls", "127.0.0.1:31337/grafana/grafana")
    55  	require.NoError(t, err, stdOut, stdErr)
    56  	require.Equal(t, stdOut, "")
    57  	stdOut, stdErr, err = e2e.Jackal("tools", "registry", "ls", "127.0.0.1:31337/grafana/loki")
    58  	require.NoError(t, err, stdOut, stdErr)
    59  	require.Equal(t, stdOut, "")
    60  }
    61  
    62  func TestMetrics(t *testing.T) {
    63  	t.Log("E2E: Emits metrics")
    64  	e2e.SetupWithCluster(t)
    65  
    66  	c, err := cluster.NewCluster()
    67  	require.NoError(t, err)
    68  
    69  	tunnel, err := c.NewTunnel("jackal", "svc", "agent-hook", "", 8888, 8443)
    70  	require.NoError(t, err)
    71  	_, err = tunnel.Connect()
    72  	require.NoError(t, err)
    73  	defer tunnel.Close()
    74  
    75  	// Skip certificate verification
    76  	// this is an https endpoint being accessed through port-forwarding
    77  	tr := &http.Transport{
    78  		TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
    79  	}
    80  
    81  	client := &http.Client{Transport: tr}
    82  	httpsEndpoint := strings.ReplaceAll(tunnel.HTTPEndpoint(), "http", "https")
    83  	resp, err := client.Get(httpsEndpoint + "/metrics")
    84  	if err != nil {
    85  		t.Fatal(err)
    86  	}
    87  	defer resp.Body.Close()
    88  
    89  	// Read the response body
    90  	body, err := io.ReadAll(resp.Body)
    91  	if err != nil {
    92  		t.Fatal(err)
    93  	}
    94  
    95  	desiredString := "go_gc_duration_seconds_count"
    96  	require.Equal(t, true, strings.Contains(string(body), desiredString))
    97  	require.NoError(t, err, resp)
    98  	require.Equal(t, 200, resp.StatusCode)
    99  }
   100  
   101  func connectToJackalServices(t *testing.T) {
   102  	// Make the Registry contains the images we expect
   103  	stdOut, stdErr, err := e2e.Jackal("tools", "registry", "catalog")
   104  	require.NoError(t, err, stdOut, stdErr)
   105  	registryList := strings.Split(strings.Trim(stdOut, "\n "), "\n")
   106  
   107  	// We assert greater than or equal to since the base init has 12 images
   108  	// HOWEVER during an upgrade we could have mismatched versions/names resulting in more images
   109  	require.GreaterOrEqual(t, len(registryList), 7)
   110  	require.Contains(t, stdOut, "Racer159/jackal/agent")
   111  	require.Contains(t, stdOut, "gitea/gitea")
   112  	require.Contains(t, stdOut, "grafana/grafana")
   113  	require.Contains(t, stdOut, "grafana/loki")
   114  	require.Contains(t, stdOut, "grafana/promtail")
   115  	require.Contains(t, stdOut, "kiwigrid/k8s-sidecar")
   116  	require.Contains(t, stdOut, "library/registry")
   117  
   118  	// Get the git credentials
   119  	stdOut, stdErr, err = e2e.Jackal("tools", "get-creds", "git")
   120  	require.NoError(t, err, stdOut, stdErr)
   121  	gitPushPassword := strings.TrimSpace(stdOut)
   122  	stdOut, stdErr, err = e2e.Jackal("tools", "get-creds", "git-readonly")
   123  	require.NoError(t, err, stdOut, stdErr)
   124  	gitPullPassword := strings.TrimSpace(stdOut)
   125  	stdOut, stdErr, err = e2e.Jackal("tools", "get-creds", "artifact")
   126  	require.NoError(t, err, stdOut, stdErr)
   127  	gitArtifactToken := strings.TrimSpace(stdOut)
   128  
   129  	// Connect to Gitea
   130  	c, err := cluster.NewCluster()
   131  	require.NoError(t, err)
   132  	tunnelGit, err := c.Connect(cluster.JackalGit)
   133  	require.NoError(t, err)
   134  	defer tunnelGit.Close()
   135  
   136  	// Make sure Gitea comes up cleanly
   137  	gitPushURL := fmt.Sprintf("http://jackal-git-user:%s@%s/api/v1/user", gitPushPassword, tunnelGit.Endpoint())
   138  	respGit, err := http.Get(gitPushURL)
   139  	require.NoError(t, err)
   140  	require.Equal(t, 200, respGit.StatusCode)
   141  	gitPullURL := fmt.Sprintf("http://jackal-git-read-user:%s@%s/api/v1/user", gitPullPassword, tunnelGit.Endpoint())
   142  	respGit, err = http.Get(gitPullURL)
   143  	require.NoError(t, err)
   144  	require.Equal(t, 200, respGit.StatusCode)
   145  	gitArtifactURL := fmt.Sprintf("http://jackal-git-user:%s@%s/api/v1/user", gitArtifactToken, tunnelGit.Endpoint())
   146  	respGit, err = http.Get(gitArtifactURL)
   147  	require.NoError(t, err)
   148  	require.Equal(t, 200, respGit.StatusCode)
   149  
   150  	// Connect to the Logging Stack
   151  	c, err = cluster.NewCluster()
   152  	require.NoError(t, err)
   153  	tunnelLog, err := c.Connect(cluster.JackalLogging)
   154  	require.NoError(t, err)
   155  	defer tunnelLog.Close()
   156  
   157  	// Make sure Grafana comes up cleanly
   158  	respLog, err := http.Get(tunnelLog.HTTPEndpoint())
   159  	require.NoError(t, err)
   160  	require.Equal(t, 200, respLog.StatusCode)
   161  }