github.com/Racer159/jackal@v0.32.7-0.20240401174413-0bd2339e4f2e/src/pkg/cluster/common.go (about)

     1  // SPDX-License-Identifier: Apache-2.0
     2  // SPDX-FileCopyrightText: 2021-Present The Jackal Authors
     3  
     4  // Package cluster contains Jackal-specific cluster management functions.
     5  package cluster
     6  
     7  import (
     8  	"time"
     9  
    10  	"github.com/Racer159/jackal/src/config"
    11  	"github.com/Racer159/jackal/src/pkg/k8s"
    12  	"github.com/Racer159/jackal/src/pkg/message"
    13  )
    14  
    15  // Cluster is a wrapper for the k8s package that provides Jackal-specific cluster management functions.
    16  type Cluster struct {
    17  	*k8s.K8s
    18  }
    19  
    20  const (
    21  	// DefaultTimeout is the default time to wait for a cluster to be ready.
    22  	DefaultTimeout = 30 * time.Second
    23  	agentLabel     = "jackal.dev/agent"
    24  )
    25  
    26  var labels = k8s.Labels{
    27  	config.JackalManagedByLabel: "jackal",
    28  }
    29  
    30  // NewClusterOrDie creates a new Cluster instance and waits up to 30 seconds for the cluster to be ready or throws a fatal error.
    31  func NewClusterOrDie() *Cluster {
    32  	c, err := NewClusterWithWait(DefaultTimeout)
    33  	if err != nil {
    34  		message.Fatalf(err, "Failed to connect to cluster")
    35  	}
    36  
    37  	return c
    38  }
    39  
    40  // NewClusterWithWait creates a new Cluster instance and waits for the given timeout for the cluster to be ready.
    41  func NewClusterWithWait(timeout time.Duration) (*Cluster, error) {
    42  	spinner := message.NewProgressSpinner("Waiting for cluster connection (%s timeout)", timeout.String())
    43  	defer spinner.Stop()
    44  
    45  	c := &Cluster{}
    46  	var err error
    47  
    48  	c.K8s, err = k8s.New(message.Debugf, labels)
    49  	if err != nil {
    50  		return nil, err
    51  	}
    52  
    53  	err = c.WaitForHealthyCluster(timeout)
    54  	if err != nil {
    55  		return nil, err
    56  	}
    57  
    58  	spinner.Success()
    59  
    60  	return c, nil
    61  }
    62  
    63  // NewCluster creates a new Cluster instance and validates connection to the cluster by fetching the Kubernetes version.
    64  func NewCluster() (*Cluster, error) {
    65  	c := &Cluster{}
    66  	var err error
    67  
    68  	c.K8s, err = k8s.New(message.Debugf, labels)
    69  	if err != nil {
    70  		return nil, err
    71  	}
    72  
    73  	// Dogsled the version output. We just want to ensure no errors were returned to validate cluster connection.
    74  	_, err = c.GetServerVersion()
    75  	if err != nil {
    76  		return nil, err
    77  	}
    78  
    79  	return c, nil
    80  }