Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions cmd/dartboard/subcommands/apply.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ func Apply(cli *cli.Context) error {
if err = tf.PrintVersion(cli.Context); err != nil {
return err
}

if err = tf.Apply(cli.Context); err != nil {
return err
}
Expand Down
66 changes: 54 additions & 12 deletions cmd/dartboard/subcommands/deploy.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ func Deploy(cli *cli.Context) error {
if err = tf.PrintVersion(cli.Context); err != nil {
return err
}

if err = tf.Apply(cli.Context); err != nil {
return err
}
Expand All @@ -66,25 +67,31 @@ func Deploy(cli *cli.Context) error {
if err = chartInstall(tester.Kubeconfig, chart{"k6-files", "tester", "k6-files"}, nil); err != nil {
return err
}

if err = chartInstall(tester.Kubeconfig, chart{"mimir", "tester", "mimir"}, nil); err != nil {
return err
}

if err = chartInstall(tester.Kubeconfig, chart{"grafana-dashboards", "tester", "grafana-dashboards"}, nil); err != nil {
return err
}

if err = chartInstallGrafana(r, &tester); err != nil {
return err
}

upstream := clusters["upstream"]
rancherVersion := r.ChartVariables.RancherVersion

rancherImageTag := "v" + rancherVersion
if r.ChartVariables.RancherImageTagOverride != "" {
rancherImageTag = r.ChartVariables.RancherImageTagOverride

image := "rancher/rancher"
if r.ChartVariables.RancherImageOverride != "" {
image = r.ChartVariables.RancherImageOverride
}

err = importImageIntoK3d(tf, image+":"+rancherImageTag, upstream)
if err != nil {
return err
Expand All @@ -94,12 +101,15 @@ func Deploy(cli *cli.Context) error {
if err = chartInstallCertManager(r, &upstream); err != nil {
return err
}

if err = chartInstallRancher(r, rancherImageTag, &upstream); err != nil {
return err
}

if err = chartInstallRancherIngress(&upstream); err != nil {
return err
}

if err = chartInstallCgroupsExporter(&upstream); err != nil {
return err
}
Expand All @@ -108,9 +118,11 @@ func Deploy(cli *cli.Context) error {
if err = kubectl.WaitRancher(upstream.Kubeconfig); err != nil {
return err
}

if err = chartInstallRancherMonitoring(r, &upstream); err != nil {
return err
}

if err = importDownstreamClusters(r, rancherImageTag, tf, clusters); err != nil {
return err
}
Expand All @@ -135,6 +147,7 @@ func chartInstall(kubeConf string, chart chart, vals map[string]any, extraArgs .
if err = helm.Install(kubeConf, path, name, namespace, vals, extraArgs...); err != nil {
return fmt.Errorf("chart %s: %w", name, err)
}

return nil
}

Expand Down Expand Up @@ -163,6 +176,7 @@ func chartInstallCertManager(r *dart.Dart, cluster *tofu.Cluster) error {
namespace: "cert-manager",
path: fmt.Sprintf("https://charts.jetstack.io/charts/cert-manager-v%s.tgz", r.ChartVariables.CertManagerVersion),
}

return chartInstall(cluster.Kubeconfig, chartCertManager, map[string]any{"installCRDs": true})
}

Expand All @@ -185,7 +199,6 @@ func chartInstallRancher(r *dart.Dart, rancherImageTag string, cluster *tofu.Clu
if r.ChartVariables.ForcePrimeRegistry {
rancherRepo = "https://charts.rancher.com/server-charts/prime"
}

}

chartRancher := chart{
Expand All @@ -198,10 +211,12 @@ func chartInstallRancher(r *dart.Dart, rancherImageTag string, cluster *tofu.Clu
if err != nil {
return fmt.Errorf("chart %s: %w", chartRancher.name, err)
}

rancherClusterName := clusterAdd.Public.Name
rancherClusterURL := clusterAdd.Public.HTTPSURL

var extraEnv []map[string]any

extraEnv = []map[string]any{
{
"name": "CATTLE_SERVER_URL",
Expand All @@ -221,6 +236,7 @@ func chartInstallRancher(r *dart.Dart, rancherImageTag string, cluster *tofu.Clu
chartVals := getRancherValsJSON(r.ChartVariables.RancherImageOverride, rancherImageTag, r.ChartVariables.AdminPassword, rancherClusterName, extraEnv, r.ChartVariables.RancherReplicas)

var extraArgs []string

if r.ChartVariables.RancherValues != "" {
p, err := writeValuesFile(r.ChartVariables.RancherValues)
if err != nil {
Expand All @@ -245,9 +261,11 @@ func writeValuesFile(content string) (string, error) {
if err != nil {
return "", err
}

if _, err := io.WriteString(p, content); err != nil {
return "", err
}

return p.Name(), nil
}

Expand All @@ -267,6 +285,7 @@ func chartInstallRancherIngress(cluster *tofu.Cluster) error {
if len(clusterAdd.Local.Name) > 0 {
sans = append(sans, clusterAdd.Local.Name)
}

if len(clusterAdd.Public.Name) > 0 {
sans = append(sans, clusterAdd.Public.Name)
}
Expand All @@ -281,7 +300,9 @@ func chartInstallRancherIngress(cluster *tofu.Cluster) error {

func chartInstallRancherMonitoring(r *dart.Dart, cluster *tofu.Cluster) error {
rancherMinorVersion := strings.Join(strings.Split(r.ChartVariables.RancherVersion, ".")[0:2], ".")

const chartPrefix = "https://github.com/rancher/charts/raw/release-v"

chartPath := fmt.Sprintf("%s%s", chartPrefix, rancherMinorVersion)

if len(r.ChartVariables.RancherAppsRepoOverride) > 0 {
Expand All @@ -305,6 +326,7 @@ func chartInstallRancherMonitoring(r *dart.Dart, cluster *tofu.Cluster) error {
},
"systemDefaultRegistry": "",
}

err := chartInstall(cluster.Kubeconfig, chartRancherMonitoringCRD, chartVals)
if err != nil {
return err
Expand All @@ -321,6 +343,7 @@ func chartInstallRancherMonitoring(r *dart.Dart, cluster *tofu.Cluster) error {
if err != nil {
return fmt.Errorf("chart %s: %w", chartRancherMonitoring.name, err)
}

mimirURL := clusterAdd.Public.HTTPURL + "/mimir/api/v1/push"

chartVals = getRancherMonitoringValsJSON(cluster.ReserveNodeForMonitoring, mimirURL)
Expand All @@ -333,12 +356,13 @@ func chartInstallCgroupsExporter(cluster *tofu.Cluster) error {
}

func getRancherMonitoringValsJSON(reserveNodeForMonitoring bool, mimirURL string) map[string]any {

nodeSelector := map[string]any{}
tolerations := []any{}
monitoringRestrictions := map[string]any{}

if reserveNodeForMonitoring {
nodeSelector["monitoring"] = "true"

tolerations = append(tolerations, map[string]any{"key": "monitoring", "operator": "Exists", "effect": "NoSchedule"})
monitoringRestrictions["nodeSelector"] = nodeSelector
monitoringRestrictions["tolerations"] = tolerations
Expand Down Expand Up @@ -488,7 +512,6 @@ func getRancherValsJSON(rancherImageOverride, rancherImageTag, bootPwd, hostname
}

func importDownstreamClusters(r *dart.Dart, rancherImageTag string, tf *tofu.Tofu, clusters map[string]tofu.Cluster) error {

log.Print("Import downstream clusters")

if err := importDownstreamClustersRancherSetup(r, clusters); err != nil {
Expand All @@ -504,26 +527,31 @@ func importDownstreamClusters(r *dart.Dart, rancherImageTag string, tf *tofu.Tof
if !strings.HasPrefix(clusterName, "downstream") {
continue
}

clustersCount++

go importDownstreamClusterDo(r, rancherImageTag, tf, clusters, clusterName, clustersChan, errorChan)
}

for {
if clustersCount == 0 {
return nil
}

select {
case err := <-errorChan:
return err
case completed := <-clustersChan:
log.Printf("Cluster %q imported successfully.\n", completed)

clustersCount--
}
}
}

func importDownstreamClusterDo(r *dart.Dart, rancherImageTag string, tf *tofu.Tofu, clusters map[string]tofu.Cluster, clusterName string, ch chan<- string, errCh chan<- error) {
log.Print("Import cluster " + clusterName)

yamlFile, err := os.CreateTemp("", "scli-"+clusterName+"-*.yaml")
if err != nil {
errCh <- fmt.Errorf("%s import failed: %w", clusterName, err)
Expand All @@ -542,8 +570,10 @@ func importDownstreamClusterDo(r *dart.Dart, rancherImageTag string, tf *tofu.To
if !ok {
err := fmt.Errorf("error: cannot find access data for cluster %q", clusterName)
errCh <- fmt.Errorf("%s import failed: %w", clusterName, err)

return
}

if r.ChartVariables.RancherImageTagOverride != "" {
err = importImageIntoK3d(tf, "rancher/rancher-agent:"+rancherImageTag, downstream)
if err != nil {
Expand All @@ -562,6 +592,7 @@ func importDownstreamClusterDo(r *dart.Dart, rancherImageTag string, tf *tofu.To
errCh <- fmt.Errorf("%s import failed: %w", clusterName, err)
return
}

if err := kubectl.WaitForReadyCondition(clusters["upstream"].Kubeconfig,
"cluster.fleet.cattle.io", clusterName, "fleet-default", "ready", 10); err != nil {
errCh <- fmt.Errorf("%s import failed: %w", clusterName, err)
Expand All @@ -573,29 +604,34 @@ func importDownstreamClusterDo(r *dart.Dart, rancherImageTag string, tf *tofu.To
errCh <- fmt.Errorf("%s waiting for rancher-webhook failed: %w", clusterName, err)
return
}

if r.ChartVariables.DownstreamRancherMonitoring {
if err := chartInstallRancherMonitoring(r, &downstream); err != nil {
errCh <- fmt.Errorf("downstream monitoring installation on cluster %s failed: %w", clusterName, err)
return
}
}

ch <- clusterName
}

func importDownstreamClustersRancherSetup(r *dart.Dart, clusters map[string]tofu.Cluster) error {
tester := clusters["tester"]
upstream := clusters["upstream"]

upstreamAdd, err := getAppAddressFor(upstream)
if err != nil {
return err
}

downstreamClusters := []string{}

for clusterName := range clusters {
if strings.HasPrefix(clusterName, "downstream") {
downstreamClusters = append(downstreamClusters, clusterName)
}
}

importedClusterNames := strings.Join(downstreamClusters, ",")

envVars := map[string]string{
Expand All @@ -608,52 +644,58 @@ func importDownstreamClustersRancherSetup(r *dart.Dart, clusters map[string]tofu
if err = kubectl.K6run(tester.Kubeconfig, "rancher/rancher_setup.js", envVars, nil, true, upstreamAdd.Local.HTTPSURL, false); err != nil {
return err
}

return nil
}

func importClustersDownstreamGetYAML(clusters map[string]tofu.Cluster, name string, yamlFile *os.File) (clusterID string, err error) {
var status map[string]interface{}

upstream := clusters["upstream"]

upstreamAdd, err := getAppAddressFor(upstream)
if err != nil {
return
return clusterID, err
}

if status, err = kubectl.GetStatus(upstream.Kubeconfig, "clusters.provisioning.cattle.io", name, "fleet-default"); err != nil {
return
return clusterID, err
}

clusterID, ok := status["clusterName"].(string)
if !ok {
err = fmt.Errorf("error accessing fleet-default/%s clusters: no valid 'clusterName' in 'Status'", name)
return
return clusterID, err
}

if status, err = kubectl.GetStatus(upstream.Kubeconfig, "clusterregistrationtokens.management.cattle.io", "default-token", clusterID); err != nil {
return
return clusterID, err
}

token, ok := status["token"].(string)
if !ok {
err = fmt.Errorf("error accessing %s/default-token clusterregistrationtokens: no valid 'token' in 'Status'", clusterID)
return
return clusterID, err
}

url := fmt.Sprintf("%s/v3/import/%s_%s.yaml", upstreamAdd.Local.HTTPSURL, token, clusterID)
tr := &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}
client := &http.Client{Transport: tr}

resp, err := client.Get(url)
if err != nil {
return
return clusterID, err
}
defer resp.Body.Close()

_, err = io.Copy(yamlFile, resp.Body)
if err != nil {
return
return clusterID, err
}

if err = yamlFile.Sync(); err != nil {
return
return clusterID, err
}

return
return clusterID, err
}
4 changes: 4 additions & 0 deletions cmd/dartboard/subcommands/getaccess.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,15 @@ func GetAccess(cli *cli.Context) error {
tester := clusters["tester"]

downstreams := make(map[string]tofu.Cluster)

for k, v := range clusters {
if strings.HasPrefix(k, "downstream") {
downstreams[k] = v
}
}

upstreamAddresses, err := getAppAddressFor(upstream)

rancherURL := ""
if err == nil {
rancherURL = upstreamAddresses.Local.HTTPSURL
Expand All @@ -57,9 +59,11 @@ func GetAccess(cli *cli.Context) error {
fmt.Println()

printAccessDetails(r, "UPSTREAM", upstream, rancherURL)

for name, downstream := range downstreams {
printAccessDetails(r, strings.ToUpper(name), downstream, "")
}

printAccessDetails(r, "TESTER", tester, "")

return nil
Expand Down
Loading